إتقان هياكل البيانات
المصفوفات والسلاسل النصية وجداول التجزئة
4 دقيقة للقراءة
تظهر هياكل البيانات الثلاث هذه في أكثر من 60% من أسئلة مقابلات البرمجة. إتقانها أمر لا بد منه.
المصفوفات (Arrays)
المصفوفات هي أكثر هياكل البيانات أساسية. في المقابلات، تحتاج لمعرفة:
| العملية | التعقيد الزمني | متى تُستخدم |
|---|---|---|
| الوصول بالفهرس | O(1) | البحث المباشر عن عنصر |
| البحث (غير مرتّبة) | O(n) | إيجاد عنصر |
| الإدراج في النهاية | O(1) مُستهلك | إضافة عنصر |
| الإدراج في موضع | O(n) | إزاحة العناصر لليمين |
| الحذف من موضع | O(n) | إزاحة العناصر لليسار |
أنماط المصفوفات الأساسية:
# النمط 1: مجموع اثنين (Hash Map + Array)
def two_sum(nums, target):
seen = {}
for i, num in enumerate(nums):
complement = target - num
if complement in seen:
return [seen[complement], i]
seen[num] = i
return []
# النمط 2: العكس في المكان
def reverse_array(nums):
left, right = 0, len(nums) - 1
while left < right:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right -= 1
السلاسل النصية (Strings)
السلاسل النصية هي أساسًا مصفوفات من الأحرف، لكن مع أنماط مقابلات فريدة:
- عدم القابلية للتغيير: في Python و Java، السلاسل النصية غير قابلة للتغيير. التعديلات تنشئ سلاسل جديدة (O(n) في كل مرة)
- العمليات الشائعة: العكس، فحص التناظر، كشف الحروف المبعثرة، البحث عن سلسلة فرعية
# كشف الحروف المبعثرة باستخدام عدّ التكرارات
from collections import Counter
def is_anagram(s, t):
return Counter(s) == Counter(t)
# فحص التناظر (Palindrome)
def is_palindrome(s):
s = s.lower()
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
جداول التجزئة (Hash Maps)
توفر جداول التجزئة بحثًا بتعقيد O(1) في الحالة المتوسطة وهي أهم أداة لتحسين الحلول في المقابلات.
متى تستخدم Hash Map:
- تحتاج لعدّ التكرارات
- تحتاج بحثًا بتعقيد O(1) بالمفتاح
- تحتاج لتجميع العناصر
- تحتاج لكشف التكرارات
- الحل المباشر O(n^2) وتريد O(n)
# تجميع الحروف المبعثرة باستخدام Hash Map
def group_anagrams(strs):
groups = {}
for s in strs:
key = tuple(sorted(s))
if key not in groups:
groups[key] = []
groups[key].append(s)
return list(groups.values())
# أول حرف غير مكرر
def first_unique_char(s):
freq = {}
for char in s:
freq[char] = freq.get(char, 0) + 1
for i, char in enumerate(s):
if freq[char] == 1:
return i
return -1
نصيحة للمقابلات: عندما يكون الحل المباشر O(n^2)، اسأل نفسك: "هل يمكن لـ Hash Map تقليل هذا إلى O(n)؟" الإجابة غالبًا نعم.
جدول مرجعي للتعقيد
| هيكل البيانات | الوصول | البحث | الإدراج | الحذف | المساحة |
|---|---|---|---|---|---|
| المصفوفة | O(1) | O(n) | O(n) | O(n) | O(n) |
| Hash Map | O(1)* | O(1)* | O(1)* | O(1)* | O(n) |
| السلسلة النصية | O(1) | O(n) | O(n) | O(n) | O(n) |
*الحالة المتوسطة. أسوأ حالة لعمليات Hash Map هي O(n) بسبب التصادمات.
التالي: سنغطي القوائم المترابطة والمكدسات والطوابير -- هياكل تختبر مهاراتك في التعامل مع المؤشرات. :::