البرمجة

تعلم فنون فرز البيانات باستخدام خوارزمية الدمج في لغة Ruby

في بداية الأمر، أحب أن أشيد بجهودك في تعلم لغة Ruby والخوارزميات. إن الالتفات للتفاصيل والحرص على فهمها بشكل صحيح هو أساسي في عملية التعلم. الآن، سنقوم بفحص الكود الذي قدمته ونحاول فهم السبب وراء حدوث حلقة الانتظار اللانهائية في تنفيذ خوارزمية فرز الدمج (Merge Sort) الخاصة بك.

لكن أولاً، يجدر بنا أن نلاحظ أن الخوارزمية تحتاج إلى مزيد من التفصيل والتحسين. سنقوم بذلك بعد حل المشكلة الحالية. السبب الرئيسي لحدوث حلقة الانتظار اللانهائية يعود إلى عدم تحديث حجم القائمتين left وright داخل الحلقة until. يجب أن يقل حجم القائمتين عند تقسيمهما إلى قطع فرعية. إليك كيف يمكنك تصحيح ذلك:

ruby
def mergesort(list) mid = list.length / 2 left = list[0, mid] right = list[mid, list.size] # قم بتحديث الحجم داخل الحلقة until until left.size <= 1 || right.size <= 1 do left = mergesort(left) right = mergesort(right) end test(left, right) end def test(left, right) sorted = [] # هذه الخطوتين غير واضحتين، يجب عليك تعيينها إلى متغيرين أو استخدامهما بشكل صحيح left_length = left.length / 2 right_length = right.length / 2 # print sorted end # قم بتجربة الكود list = [4, 2, 7, 1, 9, 3] mergesort(list)

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

المهمة التالية هي معاودة التفكير في كيفية تجميع وفحص النتائج المرتجعة من الدوال المستدعاة داخل حلقة الـ until وكيفية تحديث القوائم left و right. بالتأكيد، مواصلة الابتعاد في هذا المسار ستساعدك على فهم الخوارزمية بشكل أفضل وسيسهم في تطوير مهاراتك في Ruby وفي فهم الخوارزميات بشكل عام.

المزيد من المعلومات

بالطبع، دعوني أوسع شرحي لموضوع الدمج (Merge Sort) وأضيف بعض المفاهيم الإضافية حول استخدام Ruby في تنفيذ هذا الخوارزمية.

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

التعديلات التي قمت بها في الكود تهدف إلى تحديث قيم القوائم left و right بشكل صحيح داخل حلقة until لضمان تقليل حجم القوائم بشكل صحيح بعد كل تقسيم.

الخطوة التالية هي النظر في كيفية دمج النصفين المرتبين، وهنا ستكون دالة test محورية. فيما يلي تحسين لهذه الدالة:

ruby
def test(left, right) sorted = [] until left.empty? || right.empty? if left.first <= right.first sorted << left.shift else sorted << right.shift end end # إضافة أي عناصر باقية إذا كانت هناك sorted.concat(left).concat(right) print sorted end

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

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

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

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

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