عندما نتحدث عن مقارنة بين unordered_map
و unordered_set
في لغة البرمجة C++, ندخل في عالم من الهياكل البيانية والعمليات التي تتيحها هذه الهياكل. في البداية، يجب فهم الفرق الرئيسي بينهما.
تبدأ القصة مع unordered_set
، وهو هيكل بيانات يعمل على تخزين عناصر فريدة من نوع معين، دون ترتيب محدد. وبمعنى آخر، فإنه يسمح فقط بوجود عناصر مميزة داخله دون تكرار. على سبيل المثال، إذا كان لديك مجموعة من الكلمات وترغب في تخزينها دون تكرار أي منها، فإن unordered_set
هو الخيار المناسب.
-
كيفية عد الوجوه على النرد05/03/2024
-
تحسين برنامج البحث في قائمة الطلاب في Java24/03/2024
أما بالنسبة لـ unordered_map
، فهو يشبه unordered_set
في الفكرة، لكنه يتيح تخزين القيم بالإضافة إلى المفاتيح. يمكنك التفكير فيه على أنه قائمة من الأزواج، حيث تمثل المفاتيح القيم التي يمكن البحث عنها، بينما تمثل القيم القيم المرتبطة بها. على سبيل المثال، يمكن استخدام unordered_map
لتخزين قائمة بأسماء الطلاب مع درجاتهم المقابلة.
الآن بالنسبة للوصول إلى العناصر في unordered_set
، فلا يتوفر لديك عامل الفهرسة []
كما هو الحال في unordered_map
، ولكن يمكنك استخدام وظيفة find()
للبحث عن العنصر. على سبيل المثال:
cppstd::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
وتحليل أدائهما واستهلاك ذاكرتهما أساسًا مهمًا لاختيار الهيكل البياني الأنسب لحل المشكلة المحددة في برنامجك.