logo

logo

logo

logo

logo

بنى المعطيات

بني معطيات

Data structure - Structure de donnée

بنى المعطيات

 

بنية المعطيات Data Structure هي خطة تنظيمية، يمكن تطبيقها على المعطيات ليسهل تفسيرها أو إجراء العمليات عليها. ولتوضيح ذلك يلاحظ أن الحاسوب آلة تتعامل مع المعلومات، بمعنى أنها تطبق عمليات محددة، تسمى بمجموعها «خوارزمية» على المعلومات التي يُزوَّد بها الحاسوب، والتي تسمى «معطيات» للحصول على النتائج المرجوة. ويعتمد نجاح هذا العمل على شقين: أوّلهما صحة الخوارزمية ودقتها وفعّاليتها، والآخر طريقة  تخزين المعطيات، فالحاسوب يمتلك قدرة هائلة على تخزين المعلومات الضخمة، وتؤثر طريقة التخزين في إمكان النفاذ إلى المعطيات والتعامل معها.

ولاعتماد الحاسوب على النظام الثنائي، تخزن المعطيات وفق هذا النظام على شكل سلاسل من خانات ثنائية تأخذ كل منها إحدى قيمتين 0 أو1، وتسمى كل خانة بِتّة bit. غير أن هذا التخزين لا يمكن أن يكون عشوائياً، وإلا أخفقت عملية استحضار المعطيات في هذا الخضم الهائل من 0 و1. فالمعطيات التي يزود بها الحاسوب مختلفة الطبيعة، فمنها الأسماء ومنها الأرقام ومنها الأحرف ... تبعاً للمسألة. وفي الذاكرة، لايوجد ما يميز السلاسل فمثلاً، يحوّل الحرف a في النظام الثنائي إلى السلسلة 0110001، ويحوّل العدد 106 إلى السلسلة 01101010. فكيف نميز أن هاتين السلسلتين تمثلان نوعين مختلفين من المعطيات.

للحصول على طريقة فعّالة في تخزين المعطيات، أُعطِيت كلُّ معطاة سِمةً تضاف إلى قيمتها data value هي نوعها data type، يحدِّد هذا النوع مجموعةَ القيم المحتملة التي يمكن أن تأخذها العناصر التي تنتمي إلى هذا النوع، ويحجز له طول (عدد ثابت من الخانات) في الذاكرة، يختلف من نوع لآخر. وهكذا، عند استحضار المعطاة المخزنة، تؤخذ سلسلة الأصفار والواحدات بالطول الموافق لنوعها.

وقد زوّدت لغات البرمجة الأولى بعدد من أنواع المعطيات التي تسمح بالتعامل مع الأعداد والأحرف والقيم المنطقية وهي الأنواع الأساسية التي لا بد منها في أي لغة، تكوّن هذه الأنواع الأشكال الأساسية لتمثيل المعطيات في الحاسوب، ونذكر منها: نوع الأعداد الصحيحة integer ونوع الأعداد الحقيقية real أو float ونوع المعطيات المنطقية boolean ونوع المعطيات المحرفية char.

وهكذا، لتخزين الحرفين a و d في الذاكرة، تحجز لكل منهما سلسلة في الذاكرة يحدد نوعها بأنه char وطولها 8 بتّة في بعض التنجيزات. يجري تحويل الحرف a إلى السلسلة: 01100001، ويجري تحويل الحرف d إلى السلسلة: 01100100. أما العددان 2730 و18724 فيخزّن كل منهما في سلسلة نوعها integer وطولها 16 بتّة في بعض التنجيزات، فيحوّل 2730 إلى السلسلة: 0000101010101010 ويحوّل 18724 إلى السلسلة: 0100100100100100.

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

var  note:integer;

note:=75

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

فلتمثيل علامات طلاب في صف يمكن بناء بنية معطيات تسمى صفيفة array تعرف باسم وحيد، ولكنها تحوي مجموعة العلامات كلها، ولتمثيل معطيات موظف في مؤسسة يمكن بناء بنية معطيات تسمى تسجيلة record تتألف من عدة حقول كل منها من نوع (حقل للاسم، حقل للعمر، حقل للراتب، حقل للعمل المكلف إياه)  وتعرف في مجموعها باسم وحيد، وتحتوي المعلومات الخاصة بالموظف.

ويمكن تعقيد البنية حسب طبيعة العمل المطلوب، كأن ننشىء بنية صفيفة من تسجيلات الموظفين للدلالة على الموظفين في كامل المؤسسة،... وهكذا.

ومع المزيد من الدراسة في حقول علوم الحاسوب، تبين أن تزويد لغات البرمجة بآلياتٍٍ لبناء هذه البنى غير كاف، فوضع مجموعة من العناصر ضمن صفيفة لا يعطي دلالة على كيفية التعامل مع هذه الصفيفة ، فطبيعة المسألة قد تقتضي أن يجري استحضار العناصر بترتيب دخولها (أول داخل للصفيفة هو أول خارج منها)، أو يجري استحضار العناصر بعكس ترتيب دخولها (آخر داخل للصفيفة هو أول خارج منها)، وقد لا يكون لترتيب الدخول والخروج أي معنى، وقد يكون الارتباط بين العناصر شجرياً أو غير ذلك.

من هنا بدأ التفكير في إنشاء بنى معطيات مزودة بعمليات التعامل الخاصة بها، فأنشأ المختصون بنى معطيات خاصة كالرتل queue (أول داخل للصفيفة هو أول خارج منها)، والمكدس stack (آخر داخل للصفيفة هو أول خارج منها)، والكومة heap (لا يكون لترتيب الدخول والخروج أي معنى)، والشجرة tree (يكون الارتباط بين العناصر شجريا)... وتجسد هذه البنى مفهوم أنواع المعطيات المجردة.

يقصد بالمصطلح «أنواع المعطيات المجردة» أن تسمح للمبرمج استخدام بنية المعطيات للتخزين، وأسماء العمليات المتاحة للتعامل مع هذه البنية، من دون معرفة كيفية التنجيز الداخلي لهذه العمليات.

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

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

صارت هذه البنى واسعة الانتشار تصنعها شركات وتضعها في مكتبات وتبيعها للمبرمجين ففتحت باباً لسوق تجارية كبيرة، وصارت المتَرجِمات[ر] compilers تتنافس في تقديم عدد أكبر من هذه البنى ضمن بيئتها.

 

غيداء ربداوي

 

 


التصنيف : الرياضيات و الفلك
النوع : علوم
المجلد: المجلد الخامس
رقم الصفحة ضمن المجلد : 415
مشاركة :

اترك تعليقك



آخر أخبار الهيئة :

البحوث الأكثر قراءة

هل تعلم ؟؟

عدد الزوار حاليا : 19
الكل : 9026903
اليوم : 820

ثلايا (غابرييل-)

المزيد »