البرمجة

مقارنة unordered_map vs unordered_set

عندما نتحدث عن مقارنة بين unordered_map و unordered_set في لغة البرمجة C++, ندخل في عالم من الهياكل البيانية والعمليات التي تتيحها هذه الهياكل. في البداية، يجب فهم الفرق الرئيسي بينهما.

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

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

الآن بالنسبة للوصول إلى العناصر في unordered_set، فلا يتوفر لديك عامل الفهرسة [] كما هو الحال في unordered_map، ولكن يمكنك استخدام وظيفة find() للبحث عن العنصر. على سبيل المثال:

cpp
std::unordered_set<int> mySet = {1, 2, 3, 4, 5}; auto it = mySet.find(3); if (it != mySet.end()) { std::cout << "Found: " << *it << std::endl; } else { std::cout << "Not found!" << std::endl; }

هذا التعليمات البرمجية تبحث عن القيمة 3 في unordered_set وتطبعها إذا تم العثور عليها.

بالنسبة لسؤالك حول الوصول العشوائي إلى الذاكرة، فإن كلا الهيكلين، unordered_map و unordered_set، لا يوفران هذه الإمكانية، حيث أن الوصول إلى العناصر يتم عن طريق قيمها (hash) وليس عن طريق مؤشرات مباشرة.

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

باختصار، تختلف استخدامات unordered_set و unordered_map وفقًا لمتطلبات التطبيق الفعلية، ويجب اختيار الهيكل المناسب بناءً على العمليات المطلوبة وكيفية استخدام البيانات.

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

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

بدءًا من عمليات الإضافة والحذف، يتمتع كل من unordered_set و unordered_map بأداء جيد في العمليتين. حيث تكون عمليتي الإضافة والحذف في الحالات العامة بتعقيد زمني متوسط O(1)، وهذا يعني أن الوقت الذي يستغرقه كل من الإضافة والحذف لا يتغير بشكل كبير بالنسبة لحجم الهيكل.

أما بالنسبة لعملية البحث، فإن تعقيد الوقتي لكل من unordered_set و unordered_map يكون أيضًا O(1) في الحالات الأفضل، ولكن يمكن أن يكون O(n) في الحالات السيئة، حيث يحدث اصطدام (collision) في الدالة الهاش. ومع ذلك، تقوم معظم مكتبات STL المستخدمة لتنفيذ هذه الهياكل بتفادي هذه الاصطدامات بشكل فعال، مما يجعل البحث غالبًا ما يكون سريعًا وفعالًا.

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

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

باختصار، يمثل فهم الاختلافات بين unordered_set و unordered_map وتحليل أدائهما واستهلاك ذاكرتهما أساسًا مهمًا لاختيار الهيكل البياني الأنسب لحل المشكلة المحددة في برنامجك.

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

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

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

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