মূল content-এ যাও

Python for AI/Data Structures আরও গভীরে/Lesson 14

Sorting ও Searching

sorted() আর key দিয়ে যেকোনো নিয়মে সাজানো, lambda-র প্রথম পরিচয়, min/max with key, আর binary search কেন এত দ্রুত।

সময়
22 মিনিট
Exercise
1
Challenge
1
Quiz
3 প্রশ্ন

সহজ ভাষায়

Sorting মানে নির্দিষ্ট নিয়মে সাজানো — ছোট থেকে বড়, বর্ণানুক্রমে, দাম অনুযায়ী। Searching মানে কোনো কিছু খুঁজে বের করা।

শুনতে সহজ, কিন্তু আসল প্রশ্ন হলো: কোন নিয়মে সাজাবো? আর বিশাল data-তে কত দ্রুত খুঁজবো?

কেন দরকার?

  • Leaderboard, top-10 product, সবচেয়ে বেশি বিক্রি — সবই sorting।
  • ML-এ: model-এর prediction-গুলো probability অনুযায়ী সাজিয়ে top-k উত্তর বের করা। Search engine আর recommendation system ঠিক এটাই করে।
  • RAG system-এ (Generative AI module) প্রশ্নের সাথে সবচেয়ে মিলে যাওয়া document খোঁজা — similarity score অনুযায়ী sort।

sorted() আর .sort()

main.py

মনে আছে? sorted() নতুন list দেয়, .sort() মূল list-টাই বদলায়।

key: নিজের নিয়মে সাজানো

key হলো একটা function যেটা প্রতিটা item থেকে তুলনার মান বের করে দেয়:

main.py
key=len হলে Python আসলে তুলনা করে:
"banana" -> 6    "Apple" -> 5    "fig" -> 3    "cherry" -> 6
তারপর এই সংখ্যাগুলো অনুযায়ী মূল শব্দগুলো সাজায়।

lambda: এক লাইনের ছোট function

key-তে প্রায়ই এমন function লাগে যেটা একবারই ব্যবহার হবে। পুরো def না লিখে lambda দিয়ে লেখা যায়:

main.py

lambda p: p["price"] মানে "p নাও, p["price"] return করো" — get_price-এর ছোট রূপ। Lambda নিয়ে বিস্তারিত পরের module-এ।

একাধিক নিয়মে সাজানো

key থেকে tuple return করলে প্রথমে প্রথম মান, সমান হলে দ্বিতীয় মান অনুযায়ী সাজায়:

main.py

-s[2] দিয়ে CGPA উল্টো (বড় থেকে ছোট) করেছি, department কিন্তু A→Z-ই আছে।

min / max with key

পুরোটা sort না করে শুধু সবচেয়ে বড়/ছোট চাইলে:

main.py

Searching

সাধারণ খোঁজা — একে একে দেখা (linear search):

main.py

ছোট list-এ এটাই যথেষ্ট। কিন্তু ১০ কোটি item-এ? প্রতিবার ১০ কোটি তুলনা।

Visual intuition: Binary Search

List যদি sorted থাকে, তাহলে অনেক চালাক উপায় আছে। অভিধানে শব্দ খোঁজার মতো — মাঝখানে খোলো, তারপর সামনে বা পেছনের অর্ধেকে যাও:

খুঁজছি 42:   [3, 8, 15, 23, 42, 57, 91]
ধাপ ১:  মাঝে 23  -> 42 বড়, ডান অর্ধেকে যাও   [42, 57, 91]
ধাপ ২:  মাঝে 57  -> 42 ছোট, বাম অর্ধেকে যাও   [42]
ধাপ ৩:  মাঝে 42  -> পেয়েছি!

প্রতি ধাপে অর্ধেক বাদ যায়। ১০ লাখ item → ~২০ ধাপ। ১০০ কোটি item → ~৩০ ধাপ!

Item সংখ্যাLinear search (worst)Binary search (worst)
১,০০০১,০০০১০
১০ লাখ১০ লাখ২০
১০০ কোটি১০০ কোটি৩০

Python-এ এটা বানানোই আছে bisect module-এ:

main.py

Exercise

Exercise

Top 3 student

+20 XP

students হলো (নাম, marks) tuple-এর list। marks অনুযায়ী বড় থেকে ছোট সাজিয়ে প্রথম তিনজনের নাম top_three list-এ রাখো।

solution.py

Quiz

  1. Q1sorted(["banana", "Apple", "cherry"])-এর ফলাফল কী?
  2. Q2max(words, key=len) কী return করে?
  3. Q3১০ লাখ item-এর sorted list-এ binary search সর্বোচ্চ প্রায় কতবার তুলনা করে?
0/3 answered

Challenge

Challenge

+50 XP

binary_search(items, target) function লেখো। items একটা sorted list। target পাওয়া গেলে তার index return করবে, না পেলে -1।

শর্ত: in, .index() বা একে একে সব item দেখা loop ব্যবহার করা যাবে না — প্রতি ধাপে খোঁজার জায়গা অর্ধেক করতে হবে।

solution.py

বাস্তবে কোথায় ব্যবহার হয়?

একটা image classifier প্রতিটা class-এর জন্য probability দেয়। User-কে দেখাতে হবে top-3 prediction:

main.py

ImageNet competition-এ model মাপা হতো "top-5 accuracy" দিয়ে — ঠিক উত্তর কি প্রথম ৫টার মধ্যে আছে? এটাই সেই হিসাব।

Interview প্রশ্ন

  • Beginner: sorted() আর list.sort()-এর পার্থক্য কী?
  • Intermediate: Python-এর sort কি stable? এর মানে কী, আর একাধিক নিয়মে sort করতে এটা কেন কাজে লাগে? (হ্যাঁ — সমান key-র item-গুলোর আগের ক্রম বজায় থাকে।)
  • Advanced: ১০০ কোটি item থেকে শুধু top-10 লাগলে পুরোটা sort করা কেন অপচয়? heapq.nlargest কীভাবে কাজ করে?

এরপর কী?

Data সাজালাম, খুঁজলাম — এখন সেটা সুন্দর করে দেখাতে হবে। Report, log, table — পরের lesson: String Formatting আরও গভীরে।