/Data structure: المصفوفات #ببساطة

Data structure: المصفوفات #ببساطة

أهلاً بك في هذا المقال الذي أحاول فيه شرح النوع اﻷول من هياكل البيانات أو (Data Structure) وهو ما يمكن تسميته بالعربية مصفوفة او باﻹنجليزية (Array) عن طريق استخدام مصفوفات C++.
في البداية أنت بحاجة لمعرفة بسيطة بالبرمجة، تتضمن loops, if، إذا كنت تمتلك المعرفة بهذه اﻷشياء مع إستحسان وجود لمعرفة بسيطة بلغة سي بلس أيضاً فأنت مؤهل لإكمال القراءة 🙂

ما هي هياكل البيانات؟

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

لماذا تكتسب السرعة والكفاءة أهمية؟

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

لكن هل هناك عدة أنواع مما يسمى بهياكل البيانات؟

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

ما هي المشكلات التي قد نحتاج هياكل البيانات للتعامل معها؟

قد يبدو هذا اﻷمر غريباً أو صعباً في بداية تعرضك لهذه المنطقة من علوم الحاسب، لكن مع الوقت والتدريب ستتضح لك الصورة بشكلٍ أكبر بالتأكيد، لكن على سبيل المثال تخيل جمع معلومات عدة طلاب في صفك فمثلاً لكل طالب رقمه التعريفي، واسمه، كيف نستطيع إدخال 30 طالب مثلاً إلى الحاسب والوصول إليهم في سرعة؟ إذا كنت تستخدم لغة C++ مثلاً فربما قد تبدأ في إنشاء struct يدعى student كالتالي:


بالطبع struct نفسه هو أيضاً شكل من أشكال هياكل البيانات في لغة سي بلس بلس، لكنه بسيط جداً ويستخدم لجمع أكثر من معلومة عن كائن معين في مُربع واحد، إذا كنت لا تعرفه فهذه النبذة ستكفيك أو اقرأ المزيد عنه هنا.
 حتى مع استخدام هيكل كـ struct انت ما زلت بحاجة ﻹستخدام هيكل آخر هنا لجمع كل الطلاب في مكان واحد، بدلاً من وضع كل طالب على حدة، وهذا ما سيقوم به هيكل البيانات الآخر المسمى بالمصفوفة array. هل يبدو هذا معقداً؟ بإمكاننا ببساطة أكثر وضع كل أسماء الطلاب في مصفوفة واحدة، مصفوفة من نوع string. بحيث تصبح هكذا مثلاً
 

هل يمكنك ملاحظة ما فعلناه هنا؟ لنعد المرور على هذه النقطة السابقة إذا، كان لدينا مشكلة بيانات طلاب الصف، وأردنا تخزينها في شكل من اﻷشكال في الحاسوب لتسهيل الوصول إليها عند إستدعائها، ومن ثم كان لدينا معلومات لكل طالب، وبعدها معلومات كُل الطلاب في الصف، إذا لدينا مجموعتان من المعلومات، قمنا بتقسيمها وِفق معرفتنا بهياكل البيانات المتاحة في لغة مثل سي بلس بلس واستخدمنا نوعين هما array و struct.

هل يمكن إستخدام أنواع أخرى من قواعد البيانات؟

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

ما هي المصفوفة؟

حسناً يبدو أنك قد أُصبت بالملل، وتريد أن تعرف الموضوع اﻷساسي الذي جئت من أجله هنا، لكن بالتأكيد كانت تلك المُقدمة مُهمة لمعرفة سبب وجود المصفوفة وغيرها من هياكل البيانات.
array
تأتي المصفوفة أصلاً من الرياضيات، حيث تُعرف بأنها مجموعة من العناصر لها خصائص متشابهة مُرتبة غالباً في صفوف ولها ترقيم محدد يمكنك من الوصول ﻷي عنصر عبر رقمه. نفس هذا التعريف ينطبق برمجياً، بما إن البرمجة قدمت من خلفية رياضية بحتة فهي تستقي كثيراً من القواعد الرياضية في بنيتها فالمصفوفة في البرمجة هي سلسلة من العناصر المتشابهة قد تكون رقماً صحيحاً أو حرفاً أو حتى عنصراً جديداً مثل العنصر student الذي قمنا بتكوينه في المشكلة السابقة، ترتبط هذه العناصر بترقيم وأرشفة تبدأ من الرقم صفر وتنتهي بطول المصفوفة ناقص واحد ( عدد عناصر المصفوفة – 1) وذلك بسبب بدء العد من الصفر لا الواحد.
array representation

ما هي العمليات التي يمكن إجرائها على المصفوفة؟

يمكن إجراء العديد من العمليات على المصفوفة منها اﻹدخال والحذف والوصول لسجل معين من خلال رقم الموقع او التخزين. دعنا نتحدث أولا عن الوصول، خذ مثالاً مصفوفة مكونة من شهور السنة الميلادية:
يمكن الوصول للشهور في هذه المصفوفة من خلال موقع الشهر فتخيل أنك تبحث عن شهر 5 وهو مايو بالطبع فكل ما عليك حينها هو كتابة:
 
بالعودة إلى المثال يمكن الوصول للطالب من خلال رقمه في الكشف إذا كان ترتيبه أبجدياً مثلاً. كانت هذه هي عملية الوصول من خلال المصفوفة، تتميز المصفوفة بالسرعة في هذه الناحية حيث تمثل سرعة الوصول هنا باللحظية ذلك بسبب معرفة موقع العنصر المراد الوصول إليه في المصفوفة. تعتبر سرعة الوصول في حالة المصفوف O(1) ، إذا كنت لا تعرف ما هذا فيمكنك تجاوزه اﻵن فسنتعرض له فيما بعد أو قراءة مقال ويكي.
 

لكن ماذا عن اﻹدخال في المصفوفة؟

للإدخال عدة أوجه منها اﻹدخال مباشرة في اخر المصفوفة وبالتالي سيصبح اﻷمر سهلاً جداً ولحظياً في الوقت ذاته بسرعة تساوي O(1)، بينما لو قررت مثلاً إدخال طالب جديد في المصفوفة الخاصة بطلاب الفصل فسيترتب على ذلك إعادة ترتيب جميع الطلاب الذين يأتون خلفه في الترتيب، لتصل سرعتها إلى O(n) تسمى تلك العملية بعملية التحريك او shifting وهي عملية مكلفة من خلال النقل وإعادة الترتيب بحيث يحصل العنصر الجديد على المكان المرغوب بينما تحصل العناصر الجديدة على مكان جديد = العنوان القديم + 1 أو n+1.
في لغة مثل سي بلس بلس مثلاً لا يمكنك إضافة عنصر جديد في منتصف المصفوفة ﻹنها تستخدم النسخة اﻷولية من المصفوفة الثابتة، بينما تسمح بذلك العديد من اللغات الحديثة مثل بايثون و جافا وسي شارب من خلال مصفوفة جديدة تحت اسم dynamic array او المصفوفة المرِنة بالطبع بإمكانك تصميم المصفوفة المرنة الخاصة بك في سي بلس بلس ومن ثم ستعرف أنه ﻹنتاج مصفوفة مرنة فإنه سيتوجب عليك تحريك العناصر لمكان جديد وإعادة إنشاء المصفوفة أحياناً مما يتطلب بالتأكيد عمليات أكثر تعقيداً وتكلفة، أو بإمكانك أيضاً إستخدام vectors من STL.
 

حتى اﻵن استخدمنا المصفوف لجمع الطلاب والشهور جميعاً في مكان واحد، مالعمليات التي ربما نرغب في تنفيذها؟ هل يمكن مثلاً كتابة الشهور بالترتيب؟

 

هل واجهتك أي مشاكل في النقاط السابقة؟

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

طالب يدرس علوم الحاسب، مهتم بالذكاء اﻹصطناعي والمعلومات، يكتُب ويدوّن ويقرأ، وأشياء أخرى تبقيه على مسافة من العالم