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()
মনে আছে? sorted() নতুন list দেয়, .sort() মূল list-টাই বদলায়।
key: নিজের নিয়মে সাজানো
key হলো একটা function যেটা প্রতিটা item থেকে তুলনার মান বের করে দেয়:
key=len হলে Python আসলে তুলনা করে:
"banana" -> 6 "Apple" -> 5 "fig" -> 3 "cherry" -> 6
তারপর এই সংখ্যাগুলো অনুযায়ী মূল শব্দগুলো সাজায়।
lambda: এক লাইনের ছোট function
key-তে প্রায়ই এমন function লাগে যেটা একবারই ব্যবহার হবে। পুরো def না লিখে lambda দিয়ে লেখা যায়:
lambda p: p["price"] মানে "p নাও, p["price"] return করো" — get_price-এর ছোট রূপ। Lambda নিয়ে বিস্তারিত পরের module-এ।
একাধিক নিয়মে সাজানো
key থেকে tuple return করলে প্রথমে প্রথম মান, সমান হলে দ্বিতীয় মান অনুযায়ী সাজায়:
-s[2] দিয়ে CGPA উল্টো (বড় থেকে ছোট) করেছি, department কিন্তু A→Z-ই আছে।
min / max with key
পুরোটা sort না করে শুধু সবচেয়ে বড়/ছোট চাইলে:
Searching
সাধারণ খোঁজা — একে একে দেখা (linear search):
ছোট 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-এ:
Exercise
Exercise
Top 3 student
students হলো (নাম, marks) tuple-এর list। marks অনুযায়ী বড় থেকে ছোট সাজিয়ে প্রথম তিনজনের নাম top_three list-এ রাখো।
Quiz
Challenge
Challenge
Binary search নিজে লেখো
binary_search(items, target) function লেখো। items একটা sorted list। target পাওয়া গেলে তার index return করবে, না পেলে -1।
শর্ত: in, .index() বা একে একে সব item দেখা loop ব্যবহার করা যাবে না — প্রতি ধাপে খোঁজার জায়গা অর্ধেক করতে হবে।
বাস্তবে কোথায় ব্যবহার হয়?
একটা image classifier প্রতিটা class-এর জন্য probability দেয়। User-কে দেখাতে হবে top-3 prediction:
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 আরও গভীরে।