الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

خوارزميات البحث و الترتيب (الجزء الرابع)

بدأه Snack3r في 17 يوليو 2012 · 1 رد · 1,916 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

نلتقي مُجددا لاستكمال ما بقي من الحلقة السابقة من سلسلة خوارزميات البحث و الترتيب.

توقفنا في الحلقة السابقة عند فقرة اختبر قدراتك. إليكم التكلمة :

لتكن M مصفوفة ثنائية البعد, عدد صفوفها L وعدد أعمدتها C. المصفوفة مُرتبة تصاعديا حسب الأعمدة و حسب الصفوف أيضا.

  1. اكتب دالة تبحث داخل M عن قيمة معينة (تستقبلها كوسيط) ثم تُعيد true إذا كانت القيمة موجودة و false في الحالة المعاكسة.
  2. أعط التعقيد الزمني للدالة السابقة بدلالة L و C ؟

:: تعديل ::

قمت بإدراج مشاركة جديدة (مخفية), تحتوي على الحل, سأظهرها بعد الإنتهاء من نقاش حلول الأعضاء.

بالتوفيق.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 18 يوليو 2012 في 15:50 — السبب: تمت إضافة الحل في المشاركة المخفية.

#2

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

:: تعديل ::

تمت إضافة الحل.

لإيجاد مكان المفتاح في المصفوفة, نبحث عن رقم السطر الذي يحوي قيمة المفتاح ثم نُطبق عليه خوارزمية البحث الثنائي, مع الأخذ في الاعتبار أن المصفوفة مُرتبة حسب الأعمدة و الصفوف أيضا:

#include <iostream>
using namespace std;

#define numberOfColumns 4

bool searchTwoDimensional(int array[][numberOfColumns], int rows, int columns, int value) {
    int i = 0;
    while (i <= rows - 1 && array[i++][0] <= value);
    if (i == 0) return false;
    else {
        i--;
        int low = 0, high = columns - 1, mid = (low + high) / 2;
        while (array[mid] != value && low <= high) {
            array[mid] < value ? low = mid + 1 : high = mid - 1;
            mid = (high + low) / 2;
        }
        if (high < low) return false;
        else return true;
    }
}

int main() {
    int newArray[3][numberOfColumns] = {
        {1, 3, 5, 7},
        {10, 15, 27, 28},
        {30, 39, 52, 100}
    };
    cout << searchTwoDimensional(newArray, 3, numberOfColumns, 52);
    return 0;
}

بعد الخروج من الحلقة الأولى, لدينا ثلاث حالات:

  • i=0 و هذا يعني أنه لم يتم الدخول إلى الحلقة ! لأن قيمة أول عنصر في المصفوفة أكبر تماما من قيمة المفتاح. و بما أن المصفوفة مرتبة حسب الأعمدة و الصفوف, فيمكننا القول بأن المفتاح غير موجود في المصفوفة. في هذه الحالة ستعيد الدالة false.
  • i أكبر أو يساوي 2 و أقل أو يساوي rows, في هذه الحالة سيمثل i رقم أول سطر يبدأ بقيمة أكبر تماما من قيمة المفتاح, لذا فإن المفتاح سيتواجد في السطر رقم i-1.
  • i = rows + 1, هذه الحالة تعني أن جميع الأسطر تبدأ بقيمة أكبر تماما من قيمة المفتاح , قد يتواجد المفتاح في السطر الأخير من المصفوفة.

بعد الخروج من الحلقة الأولى (في حالة i يختلف عن الصفر), سيتنقل التنفيذ إلى الجزء المخصص للبحث عن قيمة المفتاح باستخدام خوارزمية البحث الثنائي. (راجع الحلقة السابقة إن لم تفهم هذا الجزء)

في الدالة الرئيسية, قمنا بالإعلان عن مصفوفة ثنائية البعد, تحتوي على 3 أسطر و أربعة أعمدة. ثم قمنا بالبحث عن القيمة 52 التي تتواجد في آخر أسطر المصفوفة.

بالنسبة للتعقيد الزمني :

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

mimetex.cgi?\theta(rows)

الحلقة الثانية لها تعقيد لوغاريتمي

mimetex.cgi?\theta(log(columns))

إذا, التعقيد الكلي سيكون

mimetex.cgi?\theta(rows + log(columns))

لا يمكننا تبسبط هذه العبارة لأننا لا نعرف العلاقة ما بين rows و columns.

أنا في الخدمة, أي سؤال ؟ :)

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 18 يوليو 2012 في 03:52 — السبب: إضافة الحل.

مواضيع مشابهة