إتقان هياكل البيانات

المصفوفات والسلاسل النصية وجداول التجزئة

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) بسبب التصادمات.


التالي: سنغطي القوائم المترابطة والمكدسات والطوابير -- هياكل تختبر مهاراتك في التعامل مع المؤشرات. :::

اختبار

اختبار الوحدة 2: إتقان هياكل البيانات

خذ الاختبار