Topic 13 · Revision

Last-Minute Cheat Sheet

পরীক্ষার আগের শেষ ৩০ মিনিটের জন্য। ১২টা টপিকের সব নিয়ম, সূত্র, complexity আর ফাঁদ — এক পাতায়। নতুন কিছু শেখার জায়গা নয়, মনে করার জায়গা।

পরীক্ষার আগে অবশ্যই সময় ≈ ২০ মিনিট Print করে নিতে পারো
এই পাতায় যা আছে
  1. 01Graph — Basics
  2. 02BFS ও DFS
  3. 03Topological Sort
  4. 04Dijkstra
  5. 05Binary Tree Traversal
  6. 06Traversal থেকে Tree
  7. 07BST — Insert / Delete
  8. 08Heap — সব নিয়ম
  9. 09Complexity টেবিল
  10. 10সূত্র সংগ্রহ
  11. 11টপ ২০ ফাঁদ
  12. 12পরীক্ষার হলে কৌশল

১. Graph — Basics

Adjacency Matrix

  • M[i][j] = 1 যদি i → j edge থাকে
  • Undirected → দুই ঘরেই 1, matrix symmetric
  • Weighted → 1 এর বদলে weight; edge না থাকলে ∞ (0 নয়)
  • Space O(V²) · edge check O(1)

Adjacency List

  • প্রতি vertex এর পাশে প্রতিবেশীদের নাম
  • Undirected এ প্রতিটা edge দুইবার লেখা হয়
  • Space O(V + E)
  • Sparse graph এ ভালো; BFS/DFS O(V+E)
Handshaking Lemma: Σ degree = 2 × E — গাছ বা graph আঁকার পর এটা দিয়ে যাচাই করো।
সর্বোচ্চ edge (simple undirected): V(V−1)/2
In-degree = ভেতরে ঢোকা edge · Out-degree = বাইরে যাওয়া edge (Kahn's এ লাগে)

২. BFS ও DFS

বিষয়BFSDFS
Data structureQueue (FIFO)Stack (LIFO) / recursion
যেভাবে ছড়ায়Level by level (চওড়ায়)যতদূর সম্ভব গভীরে
Shortest path (unweighted)দেয় ✓দেয় না ✗
SpaceO(V) — একটা levelO(V) — path এর গভীরতা
Time (list)O(V + E)O(V + E)
কাজে লাগেShortest path, level, connected componentTopological sort, cycle detect, component
তিনটা নিয়ম যা ভুললেই উত্তর ভুল:
১। প্রতিবেশীদের alphabetical/সংখ্যার ক্রমে নাও (প্রশ্নে অন্য কিছু না বললে)
২। Queue/Stack এ ঢোকানোর সময়েই visited চিহ্ন দাও, বের করার সময় নয় — নইলে একই node দুইবার ঢুকবে
৩। DFS এ backtrack এর ধাপগুলোও টেবিলে দেখাও — এখানেই নম্বর

৩. Topological Sort

শর্ত: শুধু DAG (Directed Acyclic Graph) এ সম্ভব। Cycle থাকলে topological sort হয় না — এই লাইনটা লিখতে ভুলো না।
একাধিক উত্তর বৈধ — তোমারটা নিয়ম মানলেই সঠিক।

পদ্ধতি ১ — DFS + Stack

  1. যেকোনো unvisited node থেকে DFS চালাও
  2. কোনো node এর সব প্রতিবেশী শেষ হলে (finish হলে) তাকে stack এ push করো
  3. সব শেষে stack উল্টে পড়ো — এটাই উত্তর
মনে রাখো: push হয় ফেরার সময়, যাওয়ার সময় নয়।

পদ্ধতি ২ — Kahn's (In-degree)

  1. সবার in-degree হিসাব করো
  2. in-degree 0 ওয়ালাদের queue তে দাও
  3. একটা বের করো → উত্তরে লেখো → তার প্রতিবেশীদের in-degree ১ করে কমাও
  4. নতুন করে 0 হলে queue তে দাও; queue খালি হলে শেষ
Cycle ধরা: সব node বের না হলে cycle আছে।

৪. Dijkstra

Relaxation সূত্র (মুখস্থ):
if ( d[u] + c(u,v) < d[v] ) then d[v] = d[u] + c(u,v)
Undirected graph দেওয়া থাকলে আগে directed এ রূপান্তর করো — প্রতিটা edge কে দুই দিকে ভেঙে নাও। (স্যার এটা আলাদা করে বলে দিয়েছেন।)
ধাপ: শুরুতে source এর দূরত্ব 0, বাকি সব ∞ → প্রতিবার সবচেয়ে ছোট দূরত্বের unvisited vertex select করো → তার প্রতিবেশীদের relax করো → select করা vertex আর কখনো বদলাবে না।
Selected Vertex টেবিল আকারে লিখলে সবচেয়ে পরিষ্কার হয়।

দুর্বলতা: Negative weight এ Dijkstra কাজ করে না। (Bellman-Ford সিলেবাসে নেই।)
Complexity: O(V²) array দিয়ে · O((V+E) log V) min-heap দিয়ে

৫. Binary Tree Traversal

Preorder : Root → Left → Right Inorder : Left → Root → Right Postorder : Left → Right → Root Level order: উপর থেকে নিচে, বাম → ডান (Queue)

মনে রাখার কৌশল

  • Pre = root আগে · In = root মাঝে · Post = root পরে
  • Left সবসময় Right এর আগে — তিনটাতেই
  • Preorder এর প্রথম = root · Postorder এর শেষ = root
Terminology: Height = সবচেয়ে লম্বা পথের edge সংখ্যা · Depth = root থেকে ওই node পর্যন্ত edge · Level = root এর level 0 · Leaf = child নেই এমন node
Node সংখ্যা: h height এর গাছে সর্বোচ্চ 2^(h+1) − 1 টা node · level L এ সর্বোচ্চ 2^L টা

৬. Traversal থেকে Tree

যা দেওয়াসাধারণ Binary TreeBST
Preorder + InorderUnique ✓Unique ✓
Postorder + InorderUnique ✓Unique ✓
Preorder + PostorderUnique নয় ✗Unique ✓
শুধু PreorderUnique নয় ✗Unique ✓
শুধু PostorderUnique নয় ✗Unique ✓
শুধু InorderUnique নয় ✗Unique নয় ✗
সাধারণ Tree এর নিয়ম: Pre/Post থেকে root নাও → Inorder এ root খুঁজে দুই ভাগ করো → গুনে Pre/Post ও একই অনুপাতে ভাগ করো → recursion।
BST এর নিয়ম: root নাও → বাকিদের মান তুলনা করে ছোট/বড় দুই ভাগে ভাগ করো (গুনতে হয় না) → recursion। শর্টকাট: preorder এর ক্রমে insert করলেই গাছ পাওয়া যায় (postorder হলে reverse করে insert)।
কেন BST তে একটাই যথেষ্ট: BST এর inorder সবসময় sorted — নিজেরাই বানিয়ে নেওয়া যায়।

৭. BST — Insert / Delete

Property: বাম subtree এর সব < node < ডান subtree এর সব (শুধু child নয়, পুরো subtree)।
যাচাই: Inorder বের করো — sorted হলে বৈধ BST।
Insert: root থেকে নামো (ছোট→বাম, বড়→ডান), খালি জায়গা পেলে বসাও। নতুন node সবসময় leaf।
Delete Caseঅবস্থাকী করবে
1কোনো child নেই (leaf)সরাসরি মুছে দাও
2ঠিক একটা childchild টাকে parent এর সাথে জুড়ে দাও
3দুইটা childInorder successor এর value কপি করে উপরে বসাও, তারপর ডান subtree থেকে successor কে delete করো
Inorder Successor: একবার ডানে যাও, তারপর যতদূর সম্ভব বামে নামো।
Inorder Predecessor: একবার বামে যাও, তারপর যতদূর সম্ভব ডানে নামো।
দুইটার যেকোনো একটা ব্যবহার করা যায় — কোনটা করছ খাতায় লিখে দাও।
Successor এর কখনো বাম child থাকে না — তাই তাকে delete করা সবসময় Case 1 বা 2।

৮. Heap — সব নিয়ম

Index (1-based):
Left child = 2i Right child = 2i + 1 Parent = i / 2 (floor)
0-based হলে: left = 2i+1, right = 2i+2, parent = (i−1)/2
Max Heap: parent ≥ child · Min Heap: parent ≤ child
Heap সবসময় complete binary tree; height = ⌊log₂ n⌋
কাজনিয়মদিককার সাথে তুলনাTime
Insertশেষে বসাও, তারপর ঠিক করোBubble Up ↑Parent (একজন)O(log n)
Deleteroot সরাও, শেষেরটা উপরে আনো, size কমাওHeapify Down ↓দুই child এর বড়টাO(log n)
Build Heapi = n/2 থেকে 1 পর্যন্ত heapify downনিচ → উপরপ্রতিটা internal nodeO(n)
Heap SortA[1]↔A[size] swap, size−−, heapify(1)n−1 বার—O(n log n)
তিনটা সবচেয়ে বড় ফাঁদ:
১। Delete এ শেষ element কে উপরে আনতে হয়, বড় child কে নয়
২। Heapify down এ বড় child এর সাথে swap (min heap এ ছোট child) — একটা swap করে থেমো না, যতদূর দরকার নামো
৩। Delete এর পর heap size কমাতে ভুলো না — নইলে মুছে ফেলা element আবার heap এ ঢুকে যাবে

Max Heap দিয়ে sort = ascending · Min Heap দিয়ে sort = descending

৯. Complexity টেবিল

AlgorithmTimeSpaceমন্তব্য
BFS / DFS (list)O(V + E)O(V)matrix হলে O(V²)
Topological SortO(V + E)O(V)শুধু DAG এ
Dijkstra (array)O(V²)O(V)negative weight এ চলে না
Dijkstra (min-heap)O((V+E) log V)O(V)—
Tree traversalO(n)O(h)প্রতিটা node একবার
Tree constructionO(n²) / O(n)O(n)hash map ব্যবহার করলে O(n)
BST search/insert/deleteO(h)O(h)balanced O(log n), skewed O(n)
Heap insert / deleteO(log n)O(1)—
Build HeapO(n)O(1)O(n log n) নয়
Heap SortO(n log n)O(1)in-place, stable নয়; best=avg=worst
Find max/min in heapO(1)—root এই থাকে

১০. সূত্র সংগ্রহ

Handshaking Lemma : Σ degree = 2 × E সর্বোচ্চ edge (undirected) : V (V − 1) / 2 Heap index (1-based) : left = 2i , right = 2i + 1 , parent = i / 2 Heap height : ⌊ log₂ n ⌋ Tree এ সর্বোচ্চ node : 2^(h+1) − 1 (h = height, edge গুনে) Level L এ সর্বোচ্চ node : 2^L n node এর BST সংখ্যা : Catalan(n) = (2n)! / ( n! (n+1)! ) Dijkstra relaxation : if ( d[u] + c(u,v) < d[v] ) d[v] = d[u] + c(u,v) Build heap শুরু index : n / 2 (এর পরেরগুলো সব leaf)

১১. টপ ২০ ফাঁদ

  1. Undirected matrix এ এক দিকে 1 বসানো — দুই দিকেই লাগবে
  2. Weighted matrix এ edge না থাকলে 0 বসানো — ∞ হবে
  3. BFS/DFS এ প্রতিবেশীর ক্রম এলোমেলো করা
  4. Queue/Stack এ ঢোকানোর সময় visited চিহ্ন না দেওয়া
  5. DFS এ backtrack এর ধাপ না দেখানো
  6. BFS কে shortest path ভাবা weighted graph এও — ওখানে Dijkstra লাগবে
  7. Cycle থাকা graph এ topological sort করার চেষ্টা
  8. Topological sort এ DFS চলার সময় push করা — finish হলে push
  9. Dijkstra তে undirected graph কে directed না করা
  10. Dijkstra তে একবার select করা vertex আবার বদলানো
  11. Postorder এর প্রথম element কে root ধরা — root শেষে
  12. Pre + Post দিয়ে unique tree বানিয়ে ফেলা — হয় না (full binary tree ছাড়া)
  13. Construction এ subtree এর element গুনতে ভুল করা
  14. BST তে শুধু সরাসরি parent এর সাথে তুলনা করা — পুরো পথ হাঁটতে হবে
  15. BST delete এ successor এর বদলে যেকোনো child উপরে তোলা
  16. Successor উপরে তুলে নিচের পুরোনো copy না মোছা
  17. Heap delete এ শেষ element এর বদলে বড় child কে root এ বসানো
  18. Heapify down এ একটা swap করেই থেমে যাওয়া
  19. Heap delete এর পর size কমাতে ভুলে যাওয়া
  20. Build heap এর complexity O(n log n) লেখা — উত্তর O(n)

১২. পরীক্ষার হলে কৌশল

১ — সহজগুলো আগে
পুরো প্রশ্ন একবার পড়ে যেগুলো নিশ্চিত জানো সেগুলো আগে শেষ করো। Heap আর BST insert সাধারণত সবচেয়ে দ্রুত হয়ে যায়।
২ — ধাপ দেখাও, শুধু উত্তর নয়
Trace table, Queue/Stack এর অবস্থা, প্রতিটা swap এর পরের array — নম্বর এখানেই। উত্তর ভুল হলেও ধাপ ঠিক থাকলে আংশিক নম্বর পাবে।
৩ — অনুমান লিখে দাও
"1-based indexing ব্যবহার করা হলো", "inorder successor ব্যবহার করা হলো", "height edge গুনে", "প্রতিবেশী alphabetical ক্রমে" — এই এক লাইনগুলো ভুল বোঝাবুঝি ঠেকায়।
৪ — বিনামূল্যের যাচাই ব্যবহার করো
BST → inorder sorted কিনা · Graph → Σ degree = 2E কিনা · Heap → প্রতিটা parent ≥ child কিনা · Tree construction → আঁকা গাছ থেকে inorder মেলে কিনা। প্রতিটাই ৩০ সেকেন্ডের কাজ।
৫ — পরিষ্কার আঁকো
গাছ/graph বড় করে আঁকো, node এ index লিখে দাও। ছোট করে আঁকলে নিজেরই ভুল হয়।
৬ — Code লাগবে না
স্যার নিশ্চিত করেছেন — পরীক্ষায় code আসবে না। হাতে সমাধান আর ধাপ দেখানোই যথেষ্ট। Bellman-Ford ও সিলেবাসে নেই।
সব প্রস্তুতি শেষ — এখন শুধু ধাপ দেখিয়ে লেখো ✓ সন্দেহ হলে সংশ্লিষ্ট টপিকের পাতায় ফিরে যাও — উপরের নেভিগেশন থেকে
← আগের১২. Build Heap ও Heap Sort পরের →—
CSE 123 · Data Structures — পড়ার খাতা  ·  সব টপিক  ·  Cheat Sheet
←☰→