تكرار السؤال: …
الإجابة المختصرة
التعقيد الزمني للعمليات الأساسية يحدد الأداء أكثر من أي تحسين آخر: فحص العضوية في set أو dict متوسطه O(1)، بينما في list خطي O(n)، وهذا الفرق يتضخم مع حجم البيانات.
الشرح
حلل العمليات الغالبة قبل الاختيار: بحث متكرر يعني set أو dict، والطرفان يعني deque، وأصغر عنصر باستمرار يعني heapq، والبحث في قائمة مرتبة يعني bisect. لكن set و dict يستهلكان ذاكرة أكثر ويحتاجان مفاتيح hashable، والقيمة O(1) متوسطة لا مضمونة. القرار دائمًا موازنة بين الزمن والذاكرة والترتيب، ويتأكد بالقياس.
مثال بالكود
banned = load_banned_ids() # 100k عنصر
banned_set = set(banned)
# O(n * m)
valid = [u for u in users if u.id not in banned]
# O(n)
valid = [u for u in users if u.id not in banned_set]
import bisect
scores = sorted(all_scores)
rank = bisect.bisect_left(scores, 75) # O(log n)أخطاء شائعة
- البحث داخل list في حلقة على بيانات كبيرة.
- افتراض أن O(1) تعني سرعة ثابتة مهما كانت دالة الـ hash سيئة.