





Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
This is shot not I prepared on data structure and algorithm
Typology: Lecture notes
1 / 9
This page cannot be seen from the preview
Don't miss anything!






stack = [] stack.append(1) # push stack.append(2) stack.pop() # pop, returns 2 top_element = stack[-1] # peek, returns 1
class Node: def init(self, data): self.data = data self.next = None class LinkedList: def init(self): self.head = None def insert(self, data): new_node = Node(data) new_node.next = self.head self.head = new_node def delete(self, key): temp = self.head if temp is not None: if temp.data == key: self.head = temp.next temp = None return while temp is not None: if temp.data == key: break prev = temp temp = temp.next if temp == None: return prev.next = temp.next temp = None
from collections import deque queue = deque() queue.append(1) # enqueue queue.append(2) queue.popleft() # dequeue, returns 1
def hash_function(key, size): return key % size class HashTable: def init(self, size): self.size = size self.table = [[] for _ in range(size)] def insert(self, key, value): index = hash_function(key, self.size) self.table[index].append((key, value)) def search(self, key): index = hash_function(key, self.size) for k, v in self.table[index]: if k == key: return v return None
class BSTNode: def init(self, key): self.left = None self.right = None self.value = key def insert(root, key): if root is None: return BSTNode(key) if key < root.value:
def fibonacci(n): dp = [0, 1] for i in range(2, n+1): dp.append(dp[i-1] + dp[i-2]) return dp[n]
def fractional_knapsack(items, capacity): items.sort(key=lambda x: x.value/x.weight, reverse=True) total_value = 0 for item in items: if capacity >= item.weight: capacity -= item.weight total_value += item.value else: total_value += item.value * (capacity / item.weight) break return total_value
class DynamicArray: def init(self): self.array = [] self.capacity = 1 self.size = 0 def append(self, item): if self.size == self.capacity: self.capacity *= 2 new_array = [None] * self.capacity for i in range(self.size): new_array[i] = self.array[i] self.array = new_array self.array[self.size] = item self.size += 1
from collections import deque def bfs(graph, start): visited = set() queue = deque([start]) while queue: vertex = queue.popleft() if vertex not in visited: visited.add(vertex) queue.extend(graph[vertex] - visited) return visited
def dfs(graph, start, visited=None): if visited is None: visited = set() visited.add(start) for next in graph[start] - visited: dfs(graph, next, visited) return visited
import heapq def dijkstra(graph, start): queue = [(0, start)] distances = {vertex: float('infinity') for vertex in graph} distances[start] = 0 while queue: current_distance, current_vertex = heapq.heappop(queue) if current_distance > distances[current_vertex]: continue for neighbor, weight in graph[current_vertex]: distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(queue, (distance, neighbor)) return distances
length = lps[length-1] else: lps[i] = 0 i += 1 return lps lps = compute_lps_array(pattern) i = j = 0 while i < len(text): if pattern[j] == text[i]: i += 1 j += 1 if j == len(pattern): print(f"Found pattern at index {i-j}") j = lps[j-1] elif i < len(text) and pattern[j] != text[i]: if j != 0: j = lps[j-1] else: i += 1
def rabin_karp(pattern, text, q): d = 256 M = len(pattern) N = len(text) p = 0 t = 0 h = 1 for i in range(M-1): h = (h * d) % q for i in range(M): p = (d * p + ord(pattern[i])) % q t = (d * t + ord(text[i])) % q for i in range(N - M + 1): if p == t: match = True for j in range(M): if text[i + j] != pattern[j]: match = False break if match: print(f"Pattern found at index {i}") if i < N - M: t = (d * (t - ord(text[i]) * h) + ord(text[i + M])) % q if t < 0: t += q
import random def randomized_partition(arr, low, high): pivot_idx = random.randint(low, high) arr[pivot_idx], arr[high] = arr[high], arr[pivot_idx] return partition(arr, low, 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 def randomized_quicksort(arr, low, high): if low < high: pi = randomized_partition(arr, low, high) randomized_quicksort(arr, low, pi-1) randomized_quicksort(arr, pi+1, high)
from multiprocessing import Pool def merge(left, right): if not left: return right if not right: return left if left[0] < right[0]: return [left[0]] + merge(left[1:], right) return [right[0]] + merge(left, right[1:]) def parallel_merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 with Pool(2) as pool: left, right = pool.map(parallel_merge_sort, [arr[:mid], arr[mid:]]) return merge(left, right)