مقالات

7 هياكل بيانات (Data Structures) هي الأكثر شيوعًا واستخدامًا

هياكل البيانات (Data Structures) هي الطرق التي ينظّم بها البرنامج بياناته في الذاكرة. واختيار الهيكل المناسب يحدد سرعة برنامجك وبساطة الكود الذي تكتبه. في هذه المقالة ستتعرّف على 7 هياكل بيانات هي الأكثر شيوعًا في عمل المبرمج اليومي: ما هو كل هيكل، ومتى تستخدمه، وكيف يبدو في الكود.

ما المقصود بهيكل البيانات؟

هيكل البيانات طريقة محددة لتخزين البيانات وتنظيمها بحيث يسهل الوصول إليها وتعديلها. قد تكون البيانات نفسها واحدة، لكن طريقة ترتيبها هي التي تحدد هل تنتهي عملية مثل البحث في جزء من الثانية أم تستغرق وقتًا طويلًا.

مقارنة بين بيانات عشوائية مكدسة وبيانات منظمة في رفوف مرتبة

لا يوجد هيكل يصلح لكل المشكلات. لكل هيكل نقاط قوة ونقاط ضعف، ومهمتك كمبرمج أن تفهم طبيعة بياناتك والعمليات التي ستتكرر عليها أكثر من غيرها، ثم تختار الهيكل الأنسب لها.

أنواع هياكل البيانات: خطية وغير خطية

  • هياكل خطية (Linear): العناصر فيها مرتبة في تسلسل واحد، مثل المصفوفات والقوائم المترابطة والمكدسات والطوابير.
  • هياكل غير خطية (Non-linear): العناصر فيها مرتبطة بعلاقات متفرعة أو متشابكة، مثل الأشجار والرسوم البيانية.

أما جداول التجزئة فتعتمد داخليًا على مصفوفة، لكنك تصل إلى عناصرها بالمفتاح لا بالترتيب.

1. المصفوفات (Arrays)

المصفوفة من أبسط هياكل البيانات وأكثرها استخدامًا. عناصرها مخزنة متجاورة في الذاكرة، ولكل عنصر رقم ترتيب (Index) يبدأ عادةً من 0. ولأن العناصر متجاورة، يمكنك الوصول إلى أي عنصر برقمه مباشرة مهما كان حجم المصفوفة.

في لغات مثل C تكون المصفوفة ثابتة الحجم، فإذا امتلأت وأردت إضافة عنصر جديد يجب أن تنشئ مصفوفة أكبر وتنسخ إليها العناصر. أما اللغات الحديثة فتوفر مصفوفات ديناميكية (Dynamic Arrays) تتولى هذه الخطوة بدلًا منك، مثل list في بايثون وArray في JavaScript وArrayList في جافا.

scores = [90, 75, 88]
print(scores[1])       # 75
scores.append(95)      # add to the end: fast
scores.insert(0, 60)   # add to the start: shifts every element
print(scores)          # [60, 90, 75, 88, 95]

الإضافة في النهاية سريعة في الغالب، لكن الإضافة أو الحذف في البداية أو المنتصف يتطلب إزاحة باقي العناصر، وهذا مكلف مع البيانات الكبيرة.

2. القوائم المترابطة (Linked Lists)

القائمة المترابطة هيكل خطي، لكن عناصرها ليست متجاورة في الذاكرة. يُسمى كل عنصر عقدة (Node)، وتحتوي كل عقدة على قيمة ومؤشر (Pointer) إلى العقدة التالية. تُسمى العقدة الأولى الرأس (Head) والأخيرة الذيل (Tail).

لا يمكنك القفز إلى العنصر الخامس مباشرة، بل تبدأ من الرأس وتنتقل من عقدة إلى التي تليها. في المقابل، تكون إضافة عقدة في البداية أو حذفها سريعة جدًا، لأنها تتطلب تعديل مؤشر واحد دون إزاحة أي عناصر.

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

head = Node(1)
head.next = Node(2)
head.next.next = Node(3)

node = head
while node:
    print(node.value)   # 1, 2, 3
    node = node.next

وهناك أيضًا القائمة المترابطة المزدوجة (Doubly Linked List)، وفيها تحتوي كل عقدة على مؤشر إلى العقدة السابقة أيضًا، فتستطيع التنقل في الاتجاهين.

3. المكدسات (Stacks)

المكدس هيكل خطي تُرص فيه العناصر فوق بعضها مثل كومة الأطباق: آخر طبق تضعه هو أول طبق تأخذه. لذلك يوصف بأنه هيكل LIFO، أي (Last In, First Out).

أهم عمليتين فيه هما push لإضافة عنصر إلى القمة، وpop لسحب العنصر الموجود على القمة، وكلتاهما سريعة جدًا.

stack = []
stack.append("page1")   # push
stack.append("page2")   # push
print(stack.pop())      # page2

من أشهر استخداماته زر الرجوع (Back) في المتصفح، وخاصية التراجع (Undo) في المحررات، وتتبّع استدعاءات الدوال أثناء تشغيل البرنامج فيما يُعرف بـ Call Stack.

4. الطوابير (Queues)

الطابور هيكل خطي مثل المكدس، لكنه يتبع قاعدة FIFO، أي (First In, First Out): أول عنصر يدخل هو أول عنصر يخرج. تخيّل طابور شراء تذاكر القطار؛ من يصل أولًا يشتري أولًا، ومن يأتي متأخرًا يقف في نهاية الطابور حتى يحين دوره.

مقارنة بين المكدس كأطباق مرصوصة والطابور كطرود تتحرك على سير بالترتيب

العمليتان الأساسيتان هما enqueue للإضافة في نهاية الطابور، وdequeue للسحب من بدايته.

from collections import deque

queue = deque()
queue.append("order1")   # enqueue
queue.append("order2")   # enqueue
print(queue.popleft())   # order1

نصيحة عملية: لا تستخدم list.pop(0) في بايثون لتنفيذ طابور، لأنها تزيح كل العناصر في كل مرة. استخدم deque المصممة لهذا الغرض. ستجد الطوابير في أنظمة الطباعة، ومعالجة الطلبات على الخوادم، وطوابير المهام (Task Queues) التي تنفّذ الأعمال في الخلفية.

5. جداول التجزئة (Hash Tables)

جدول التجزئة، ويُسمى أيضًا خريطة التجزئة (Hash Map) أو القاموس (Dictionary)، يخزن البيانات في صورة أزواج من مفتاح (Key) وقيمة (Value). تحوّل دالة التجزئة (Hash Function) المفتاح إلى موقع داخل مصفوفة داخلية، فتصل إلى القيمة مباشرة دون المرور على كل العناصر.

مفاتيح يقود كل منها مباشرة إلى خزانة محددة تمثيلًا لجدول التجزئة

لهذا السبب يكون البحث والإضافة والحذف بزمن ثابت تقريبًا في المتوسط، وهذا ما يجعله من أكثر الهياكل استخدامًا. وقد يحدث تصادم (Collision) عندما يُنتج مفتاحان الموقع نفسه، والتطبيقات الجاهزة في اللغات تتعامل معه تلقائيًا.

prices = {"apple": 3, "banana": 1}
prices["orange"] = 2
print(prices["apple"])      # 3
print("banana" in prices)   # True

ستستخدمه في التخزين المؤقت (Caching)، وعدّ التكرارات، وربط كل مستخدم ببياناته. وتجده جاهزًا في كل اللغات تقريبًا: dict في بايثون، وMap في JavaScript، وHashMap في جافا.

6. الأشجار (Trees)

الشجرة هيكل غير خطي تترابط فيه العقد بشكل هرمي يشبه شجرة العائلة: عقدة جذر (Root) في الأعلى، ولكل عقدة أبناء (Children)، وتُسمى العقد التي ليس لها أبناء الأوراق (Leaves).

عقد مترابطة بشكل هرمي من الجذر إلى الأوراق تمثل هيكل الشجرة

من أشهر أنواعها:

  • شجرة البحث الثنائية (Binary Search Tree): لكل عقدة ابنان على الأكثر، القيم الأصغر في اليسار والأكبر في اليمين، فيصبح البحث سريعًا.
  • الأشجار المتوازنة مثل AVL Tree وRed-Black Tree: تعيد توازنها تلقائيًا بعد كل إضافة أو حذف حتى لا يبطؤ البحث.
  • B-Tree: تعتمد عليها قواعد البيانات وأنظمة الملفات في بناء الفهارس (Indexes).
  • الكومة (Heap): تُبقي أصغر عنصر أو أكبره في القمة دائمًا، وتُستخدم في طوابير الأولوية (Priority Queues).
  • Trie: تخزن الكلمات حرفًا حرفًا، وتُستخدم في الإكمال التلقائي.

أنت تتعامل مع الأشجار يوميًا دون أن تنتبه: مجلدات جهازك، وبنية صفحة الويب (DOM)، وفهارس قواعد البيانات.

7. الرسوم البيانية (Graphs)

الرسم البياني هيكل غير خطي يتكون من عقد (Nodes أو Vertices) تربط بينها حواف (Edges). وعلى عكس الشجرة، لا يوجد فيه جذر ولا تسلسل هرمي، ويمكن أن ترتبط أي عقدة بأي عقدة أخرى.

شبكة مدن متصلة بطرق مع إبراز أقصر مسار بين نقطتين تمثيلًا للرسم البياني

قد تكون الحواف موجّهة (Directed) مثل علاقة المتابعة على منصات التواصل، أو غير موجّهة (Undirected) مثل الصداقة. وقد تحمل وزنًا (Weight) مثل المسافة بين مدينتين. أشهر طريقة لتمثيله في الكود هي قائمة التجاور (Adjacency List):

graph = {
    "A": ["B", "C"],
    "B": ["A", "D"],
    "C": ["A", "D"],
    "D": ["B", "C"],
}
print(graph["A"])   # ['B', 'C']

تعتمد عليه تطبيقات الخرائط لحساب أقصر طريق، وشبكات التواصل لاقتراح الأصدقاء، وأنظمة التوصية، وحتى مديرو الحزم عند ترتيب الاعتماديات (Dependencies).

مقارنة سريعة بين هياكل البيانات السبعة

يلخص الجدول التالي سرعة العمليات الشائعة باستخدام ترميز Big O (Big O Notation)، حيث تعني O(1) زمنًا ثابتًا لا يتأثر بعدد العناصر، وتعني O(n) أن الزمن يزيد بزيادة عدد العناصر.

الهيكلالوصول أو البحثالإضافة والحذفمتى تستخدمه
المصفوفةبالرقم O(1)، والبحث O(n)O(1) في النهاية غالبًا، وO(n) في المنتصفالقراءة المتكررة بالترتيب أو بالرقم
القائمة المترابطةO(n)O(1) عند الرأسالإضافة والحذف المتكرر في البداية
المكدسالقمة فقط O(1)O(1)التراجع وتتبّع الخطوات
الطابورالبداية فقط O(1)O(1)معالجة المهام بترتيب وصولها
جدول التجزئةO(1) في المتوسطO(1) في المتوسطالبحث السريع بمفتاح
شجرة البحث المتوازنةO(log n)O(log n)بيانات مرتبة مع بحث سريع
الرسم البيانييعتمد على طريقة التمثيل والخوارزميةO(1) لإضافة حافة في قائمة التجاورالعلاقات والشبكات والمسارات

الفرق بين الخوارزميات وهياكل البيانات

هيكل البيانات يحدد كيف تُنظَّم البيانات في الذاكرة، أما الخوارزمية (Algorithm) فهي سلسلة الخطوات التي تعالج هذه البيانات لحل مشكلة معينة. فكّر في هيكل البيانات على أنه رفوف المكتبة، وفي الخوارزمية على أنها طريقتك في البحث عن كتاب.

الاثنان مرتبطان دائمًا: خوارزمية البحث الثنائي (Binary Search) تحتاج إلى مصفوفة مرتبة، وخوارزمية البحث بالعرض (Breadth-First Search) تحتاج إلى طابور لتتنقل في الرسم البياني. واختيار الهيكل الخطأ قد يجعل خوارزمية جيدة بطيئة جدًا.

هل ما زلت تحتاج إلى تعلم هياكل البيانات في 2026؟

نعم. أدوات المساعدة في كتابة الكود تستطيع اليوم أن تكتب لك قائمة مترابطة في ثوانٍ، لكنها لا تختار دائمًا الهيكل المناسب لمشكلتك، وقد تقترح حلًا يعمل جيدًا مع بيانات صغيرة ثم يبطؤ بشدة عندما يكبر حجم البيانات. فهمك لهياكل البيانات هو ما يمكّنك من مراجعة الكود المقترح واكتشاف مشكلاته قبل أن تصل إلى المستخدمين.

كما أن كثيرًا من مقابلات العمل التقنية ما زالت تختبر هذه الأساسيات بشكل مباشر.

من أين تبدأ؟

  1. أتقن أساسيات البرمجة بلغة واحدة أولًا: المتغيرات والشروط والحلقات والدوال. إذا كنت تبدأ من الصفر، فـمسار أساسيات البرمجة بلغة بايثون بداية مناسبة.
  2. تعلّم الهياكل الخطية بالترتيب: المصفوفات، ثم القوائم المترابطة، ثم المكدس والطابور، ونفّذ كل هيكل بنفسك مرة واحدة على الأقل.
  3. انتقل إلى جداول التجزئة والأشجار والرسوم البيانية، مع الخوارزميات المرتبطة بها مثل البحث والترتيب والتنقل.
  4. حلّ مسائل تطبيقية بانتظام؛ فالفهم الحقيقي يأتي من التطبيق لا من القراءة وحدها.

إذا أردت طريقًا منظمًا بالعربي يأخذك من الأساسيات إلى المستوى المتوسط مع تمارين وحلول، فـمسار تعلم هياكل البيانات من الصفر مصمم لذلك، ويبدأ بدورة هياكل البيانات الأساسية.

الخلاصة

المصفوفات والقوائم المترابطة والمكدسات والطوابير وجداول التجزئة والأشجار والرسوم البيانية هي الأدوات الأساسية التي تُبنى عليها معظم البرمجيات. لا تحتاج إلى حفظ كل تفاصيلها دفعة واحدة؛ ابدأ بفهم فكرة كل هيكل ومتى تستخدمه، ثم طبّقه بالكود، وستلاحظ أن اختياراتك أصبحت أدق وأن برامجك أصبحت أسرع.

أسئلة شائعة

ما هي هياكل البيانات (Data Structures)؟

هي طرق لتخزين البيانات وتنظيمها في الذاكرة بحيث يسهل الوصول إليها ومعالجتها بكفاءة. من أشهرها المصفوفات والقوائم المترابطة والمكدسات والطوابير وجداول التجزئة والأشجار والرسوم البيانية.

هل يجب أن أتعلم هياكل البيانات والخوارزميات قبل تعلم البرمجة؟

لا. تعلّم أساسيات البرمجة بلغة واحدة أولًا، مثل المتغيرات والشروط والحلقات والدوال، ثم انتقل إلى هياكل البيانات والخوارزميات لأنك ستحتاج إلى كتابة الكود لتطبيقها.

ما أفضل لغة لتعلم هياكل البيانات؟

المفاهيم واحدة في كل اللغات، لذلك ابدأ باللغة التي تتقنها. بايثون سهلة القراءة وتساعدك على التركيز على الفكرة، بينما تكشف لغات مثل C++ وجافا تفاصيل الذاكرة بشكل أوضح.

كيف تُستخدم هياكل البيانات في العالم الحقيقي؟

تستخدم ألعاب مثل الشطرنج الأشجار لتمثيل الحركات المحتملة، وتستخدم منصات التواصل الرسوم البيانية لتخزين علاقات الصداقة، ويستخدم المتصفح المكدس لتنفيذ زر الرجوع، وتستخدم قواعد البيانات أشجار B-Tree في الفهارس.

مقالات ذات صلة