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

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

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 MapO(1)*O(1)*O(1)*O(1)*O(n)
السلسلة النصيةO(1)O(n)O(n)O(n)O(n)

*الحالة المتوسطة. أسوأ حالة لعمليات Hash Map هي O(n) بسبب التصادمات.


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

اختبار

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

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.