نشاط برمجي: تمثيل شجري من خلال المعرف فقط ؟

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

المألوف في استخدام جداول قواعد المعطيات لتمثيل النظام الشجري لأسطرها هو تشكيل عمود يمثل معرف الأب وعمل علاقة واحد إلى متعدد بحيث يشير الجدول لنفسه والربط بين معرف الأب إلى المعرف

حتى أن هناك بعض العناصر المرئية المتقدمة تقبل مصدر البيانات من الجدول مباشرة مع تحديد حقل المعرف وحقل معرف الأب وهي تتولى إظهار الشجرة

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

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

السؤال هو كيف يمكنني تمثيل شجري من خلال جدول بسيط عبارة عن معرف وبقية معلومات أي بدون عمل علاقة

قد تكون سهلة لأنها مستخدمة في إحدى المجالات

ولكن السؤال عمل دالة بأي لغة كانت أو حتى بشكل خوارزمية نمرر لها سطر من الجدول فيعيد لنا أبناؤه ودالة أخرى تعيد لنا أبوه ؟

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

الحل مًستوحى من طريقة ترتيب العناصر الرقمية في Microsoft word و غيرها. المعرف طريقته معرّف الابن="<معرّف الأب>.<رقم الابن>" مفصولا بنقطة. لو الأب معرّفه "1.2.4" فإن أول ابن رقمه "1.2.4.1" (اقرأ المعرّف من اليسار لليمين :))

الخوارزمية كالتالي لجدول data و المعرف id لابن CHILD_ID:

get_parent() { 
// استخرج <معرّف الأب> كـ PARENT_ID و ابحث عنه في قاعدة البيانات
    return "SELECT * from data where id = {PARENT_ID}; 
}


get_children() {
// ابحث عن المعرّفات التي تبدأ بـ CHILD_ID متبوعة بنقطة
    return "SELECT * from data where id LIKE '{CHILD_ID}.%"); 
}

أنت افترضت أن المعرف هو نص وحينها كلامك صحيح مع أننا بإمكاننا الاستغناء عن الفصل بالنقطة بافتراض فواصل وهمية تعتمد على أمر آخر إن كان المعرف نص و يمكن كذلك إن كان صحيحا لكن مع بعض الشروط

يمكن تمثيل شجرة لجدولك البسيط (معرف واسم) إذا كانت طبيعة المعرف عددا صحيحا، وأعتقد أنه كذلك، وطريقة اضافة السطر أو السجل للشجرة يكون بتحليل المعرف إلى أعداده المكونه له (مثلا 945 أعدادها 5 ثم 4 ثم 9) والتفكير فيها بأنها مسارات تنقل بالشجرة، العدد السابق 945 يحتاج لثلاثة مسارات أو تحركات للوصول للبيان الخاص به ألا وهو الاسم في حالتنا هذه، ستكون الشجرة عشرية المسارات وليست شجرة ثنائية المسارات، وكذلك لن يكون للشجرة عنصر أب لجميع السجلات بها، سيكون عوضا عنه عشرة 10 آباء محتملين للشجرة في شكل مصفوفة ثابته ومنها حسب أول عدد مكون للمعرف يتم التنقل بالشجرة وصولا للبيان، أي أن المصفوفة بحد ذاتها هي العنصر الأب للشجرة. 

أعتقد أن هذا يكفي لتكوين الشجرة التي تريد بما أنك ذكرت أنه ليس لسجلات جدولك حقل يمثل الأب له.

كلامك صحيح لكن نريد أن نسخر فكرنا لإيجاد حلول لتجاوز بعض القيود مثل التي عرضتها

كأن نريد أن يكون هناك جذر رئيسي وحيد وليس عشرة محتملين

وأن عدد الأبناء نريده مفتوح أو على الأقل بأعداد ذات سقف أعلى ويكون أكثر من عشرة

أدري أن تحويل نوع المعرف إلى نص سيحررنا من بعض القيود لكن على افتراض أنه سيبقى عدد صحيح فكيف لنا أن نتجاوز القيود السابقة ؟

كأن نريد أن يكون هناك جذر رئيسي وحيد وليس عشرة محتملين

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

وأن عدد الأبناء نريده مفتوح أو على الأقل بأعداد ذات سقف أعلى ويكون أكثر من عشرة

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

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