KEMBAR78
? Algorithm Templates | PDF | Applied Mathematics | Computer Programming
0% found this document useful (0 votes)
4 views7 pages

? Algorithm Templates

Uploaded by

wiremu casey
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views7 pages

? Algorithm Templates

Uploaded by

wiremu casey
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

📋 Algorithm Templates - Quick Reference

Ready-to-use algorithm implementations and patterns


Standard templates for common algorithmic problems

🔍 Search Algorithms
Binary Search

def binary_search(arr, target):


left, right = 0, len(arr) - 1

while left <= right:


mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1

return -1 # Not found

# Recursive version
def binary_search_recursive(arr, target, left=0, right=None):
if right is None:
right = len(arr) - 1

if left > right:


return -1

mid = (left + right) // 2


if arr[mid] == target:
return mid
elif arr[mid] < target:
return binary_search_recursive(arr, target, mid + 1, right)
else:
return binary_search_recursive(arr, target, left, mid - 1)

Linear Search

def linear_search(arr, target):


for i in range(len(arr)):
if arr[i] == target:
return i
return -1

# With early termination for sorted arrays


def linear_search_sorted(arr, target):
for i in range(len(arr)):
if arr[i] == target:
return i
elif arr[i] > target:
break
return -1

🔄 Sorting Algorithms
Quick Sort

def quick_sort(arr, low=0, high=None):


if high is None:
high = len(arr) - 1

if low < high:


pivot_index = partition(arr, low, high)
quick_sort(arr, low, pivot_index - 1)
quick_sort(arr, pivot_index + 1, high)

def partition(arr, low, high):


pivot = arr[high]
i = low - 1

for j in range(low, high):


if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]

arr[i + 1], arr[high] = arr[high], arr[i + 1]


return i + 1

Merge Sort

def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])

return merge(left, right)

def merge(left, right):


result = []
i = j = 0

while i < len(left) and j < len(right):


if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1

result.extend(left[i:])
result.extend(right[j:])
return result

Insertion Sort

def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1

while j >= 0 and arr[j] > key:


arr[j + 1] = arr[j]
j -= 1

arr[j + 1] = key
return arr

Selection Sort

def selection_sort(arr):
n = len(arr)

for i in range(n - 1):


min_idx = i
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j

arr[i], arr[min_idx] = arr[min_idx], arr[i]

return arr

🕸️ Graph Algorithms
Depth-First Search (DFS)

# Recursive DFS
def dfs_recursive(graph, vertex, visited=None):
if visited is None:
visited = set()

visited.add(vertex)
print(vertex, end=' ')

for neighbor in graph[vertex]:


if neighbor not in visited:
dfs_recursive(graph, neighbor, visited)

# Iterative DFS
def dfs_iterative(graph, start):
visited = set()
stack = [start]

while stack:
vertex = stack.pop()
if vertex not in visited:
visited.add(vertex)
print(vertex, end=' ')

# Add neighbors in reverse order for same traversal as recursive


for neighbor in reversed(graph[vertex]):
if neighbor not in visited:
stack.append(neighbor)

Breadth-First Search (BFS)

from collections import deque

def bfs(graph, start):


visited = set([start])
queue = deque([start])

while queue:
vertex = queue.popleft()
print(vertex, end=' ')

for neighbor in graph[vertex]:


if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)

# BFS with distance tracking


def bfs_with_distance(graph, start):
visited = {start: 0}
queue = deque([start])

while queue:
vertex = queue.popleft()

for neighbor in graph[vertex]:


if neighbor not in visited:
visited[neighbor] = visited[vertex] + 1
queue.append(neighbor)

return visited

🌲 Tree Algorithms
Binary Tree Traversals

class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right

# Inorder Traversal (Left, Root, Right)


def inorder_traversal(root):
result = []
if root:
result.extend(inorder_traversal(root.left))
result.append(root.val)
result.extend(inorder_traversal(root.right))
return result

# Preorder Traversal (Root, Left, Right)


def preorder_traversal(root):
result = []
if root:
result.append(root.val)
result.extend(preorder_traversal(root.left))
result.extend(preorder_traversal(root.right))
return result

# Postorder Traversal (Left, Right, Root)


def postorder_traversal(root):
result = []
if root:
result.extend(postorder_traversal(root.left))
result.extend(postorder_traversal(root.right))
result.append(root.val)
return result

# Level Order Traversal (BFS)


def level_order_traversal(root):
if not root:
return []

result = []
queue = deque([root])

while queue:
node = queue.popleft()
result.append(node.val)

if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)

return result

Binary Search Tree Operations

class BST:
def __init__(self):
self.root = None

def insert(self, val):


self.root = self._insert_recursive(self.root, val)
def _insert_recursive(self, node, val):
if not node:
return TreeNode(val)

if val < node.val:


node.left = self._insert_recursive(node.left, val)
elif val > node.val:
node.right = self._insert_recursive(node.right, val)

return node

def search(self, val):


return self._search_recursive(self.root, val)

def _search_recursive(self, node, val):


if not node or node.val == val:
return node

if val < node.val:


return self._search_recursive(node.left, val)
else:
return self._search_recursive(node.right, val)

def delete(self, val):


self.root = self._delete_recursive(self.root, val)

def _delete_recursive(self, node, val):


if not node:
return node

if val < node.val:


node.left = self._delete_recursive(node.left, val)
elif val > node.val:
node.right = self._delete_recursive(node.right, val)
else:
# Node to be deleted found
if not node.left:
return node.right
elif not node.right:
return node.left

# Node with two children


min_node = self._find_min(node.right)
node.val = min_node.val
node.right = self._delete_recursive(node.right, min_node.val)

return node

def _find_min(self, node):


while node.left:
node = node.left
return node

🔁 Recursive Patterns
Fibonacci (Optimized)

# Memoized version
def fibonacci_memo(n, memo={}):
if n in memo:
return memo[n]

if n <= 1:
return n

memo[n] = fibonacci_memo(n-1, memo) + fibonacci_memo(n-2, memo)


return memo[n]

# Iterative version
def fibonacci_iterative(n):
if n <= 1:
return n

a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, a + b

return b

Tower of Hanoi

def hanoi(n, source, destination, auxiliary):


if n == 1:
print(f"Move disk 1 from {source} to {destination}")
return 1

moves = 0
moves += hanoi(n-1, source, auxiliary, destination)
print(f"Move disk {n} from {source} to {destination}")
moves += 1
moves += hanoi(n-1, auxiliary, destination, source)

return moves

Power Function

# Fast exponentiation
def power(base, exp):
if exp == 0:
return 1
elif exp % 2 == 0:
half_power = power(base, exp // 2)
return half_power * half_power
else:
return base * power(base, exp - 1)

🏗️ Data Structure Templates


Stack Implementation

class Stack:
def __init__(self):
self.items = []

def push(self, item):


self.items.append(item)

def pop(self):
if self.is_empty():
raise IndexError("Stack is empty")
return self.items.pop()

def peek(self):
if self.is_empty():
raise IndexError("Stack is empty")
return self.items[-1]

def is_empty(self):
return len(self.items) == 0

def size(self):
return len(self.items)

Queue Implementation

from collections import deque

class Queue:
def __init__(self):
self.items = deque()

def enqueue(self, item):


self.items.append(item)

def dequeue(self):
if self.is_empty():
raise IndexError("Queue is empty")
return self.items.popleft()

def front(self):
if self.is_empty():
raise IndexError("Queue is empty")
return self.items[0]

def is_empty(self):
return len(self.items) == 0

def size(self):
return len(self.items)

Linked List Implementation

class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next

class LinkedList:
def __init__(self):
self.head = None
self.size = 0

def insert_at_head(self, val):


new_node = ListNode(val)
new_node.next = self.head
self.head = new_node
self.size += 1

def insert_at_tail(self, val):


new_node = ListNode(val)
if not self.head:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
self.size += 1

def delete(self, val):


if not self.head:
return False

if self.head.val == val:
self.head = self.head.next
self.size -= 1
return True

current = self.head
while current.next and current.next.val != val:
current = current.next

if current.next:
current.next = current.next.next
self.size -= 1
return True

return False

def search(self, val):


current = self.head
index = 0
while current:
if current.val == val:
return index
current = current.next
index += 1
return -1

🎯 Problem-Solving Patterns
Two Pointers

def two_sum_sorted(arr, target):


left, right = 0, len(arr) - 1

while left < right:


current_sum = arr[left] + arr[right]
if current_sum == target:
return [left, right]
elif current_sum < target:
left += 1
else:
right -= 1

return []

Sliding Window

def max_sum_subarray(arr, k):


if len(arr) < k:
return None

# Calculate sum of first window


window_sum = sum(arr[:k])
max_sum = window_sum

# Slide the window


for i in range(k, len(arr)):
window_sum = window_sum - arr[i - k] + arr[i]
max_sum = max(max_sum, window_sum)

return max_sum

Backtracking Template

def backtrack_template(candidates, path, result, target):


# Base case
if is_valid_solution(path, target):
result.append(path[:]) # Make a copy
return

# Try all possible candidates


for candidate in candidates:
if is_valid_candidate(candidate, path):
# Make choice
path.append(candidate)

# Recurse
backtrack_template(get_next_candidates(candidates, candidate),
path, result, target)

# Backtrack
path.pop()

🧮 Mathematical Algorithms
GCD (Euclidean Algorithm)

def gcd(a, b):


while b:
a, b = b, a % b
return a

# Recursive version
def gcd_recursive(a, b):
if b == 0:
return a
return gcd_recursive(b, a % b)

Prime Number Checking

def is_prime(n):
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False

for i in range(3, int(n**0.5) + 1, 2):


if n % i == 0:
return False

return True

Sieve of Eratosthenes

def sieve_of_eratosthenes(n):
is_prime = [True] * (n + 1)
is_prime[0] = is_prime[1] = False

for i in range(2, int(n**0.5) + 1):


if is_prime[i]:
for j in range(i*i, n + 1, i):
is_prime[j] = False

return [i for i in range(2, n + 1) if is_prime[i]]

🧭 Navigation
Hub: 🏠 Algorithms Knowledge Hub
Study Materials: Study Material/
Quick Reference: ⚡ Algorithm Quick Reference

Algorithm Templates | Implementation Reference | Updated: 2025-08-25

You might also like