عملکرد صف اولویت - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

عملکرد صف اولویت

+3 امتیاز
سلام.

دوستان کسی صف اولویت را پیاده سازی کرده ؟ و یا در مورد عملکردش اطلاعات داره یه توضیحی بده؟
سوال شده مهر 4, 1393  بوسیله ی Xavi (امتیاز 627)   24 83 110

2 پاسخ

+5 امتیاز
 
بهترین پاسخ

صف ساختاری هست که ما فقط به عنصر اول دسترسی داریم . (یعنی به همون ترتیبی که عناصر اضافه میشن بهشون دسترسی هم داریم)

صف اولویت صفی هست که اولین عنصری که بهش دسترسی داریم همیشه بزرگترین یا کوچکترین عنصر ما هست .

که بر همین اساس به 2 دسته max priority queue و min priority queue تقسیم میشه.

priority queue بوسیله ساختار max heap پیاده سازی میشه که این جا توضیح داده شده .

داخل ++C  این ساختار با اسم std::priority_queue وجود داره و ساختار درونی رو میشه تعیین کرد یعنی میشه تغیین کرد عناصر داخل وکتور ذخیره بشن یا list ,...

 

priority queue سه تا عملیات اصلی داره push و pop , top  .

  • push عنصر اضافه می کنه به صف .
  • top عنصر اول رو بهمون میده
  • pop عنصر اول رو حذف می کنه

 

چون این ساختار از heap استفاده می کنه برای push_back یکبار push_back هیپ رو انجام میده که   از (logn) هست یک بار هم push_back ساختار داخلی مثلا اگر vector باشه یکبار هم push_back وکتور انجام میشه که constant amortized ,و از (1)O هست .

عملیات top از (1)O هست .

عملیات pop هم یکبار pop ساختار هیپ رو صدا میزنه که از (O(logn هست یکبار هم pop برای ساختار داخلی .

 

مثال از استفاده داخل ++C :

#include <iostream>
#include <queue>
#include <vector>

int main ()
{
    std::priority_queue<int, std::vector<int>> queue;

    queue.push(6); queue.push(3); queue.push(7);
    queue.push(9); queue.push(2); queue.push(5);

    std::cout<<queue.top()<<'\n';//bozorgtaring onsor yani 9 chap mishe

    queue.pop();//hazf onsor aval

    std::cout<<queue.top();//bozorgtaring onsor badi yani 7 chap mishe

    return 0;
}

 

پاسخ داده شده مهر 4, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد مهر 11, 1393 بوسیله ی Xavi
0 امتیاز
صف اولویت یک نوع داده انتزاعی است که عناصر را در یک صف ذخیره می کند، اما به جای ذخیره سازی عناصر به ترتیب اول در اول خروج (FIFO)، عناصر بر اساس اولویت خود ذخیره می شوند. هنگامی که یک عنصر در صف قرار می گیرد، ابتدا عنصر با بالاترین اولویت حذف می شود.
 
راه های مختلفی برای اجرای صف اولویت وجود دارد، از جمله یک پشته باینری، یک هیپ فیبوناچی و یک پشته جفت. هر یک از این پیاده سازی ها پیچیدگی ها و معاوضه های زمانی و مکانی متفاوتی دارند.
 
پشته های باینری دارای پیچیدگی زمانی O(log n) برای درج و حذف عناصر و پیچیدگی فضایی O(n) هستند. اجرای آنها آسان است و ساختار نسبتاً ساده ای دارند.
 
پشته های فیبوناچی پیچیدگی زمانی O(1) برای درج و O(log n) برای حذف عناصر و پیچیدگی فضایی O(n) دارند. پیاده سازی آنها پیچیده تر است اما عملکرد بهتری نسبت به پشته های باینری ارائه می دهد.
 
پشته های جفتی دارای پیچیدگی زمانی O(1) برای درج و O(log n) برای حذف عناصر و پیچیدگی فضایی O(n) هستند. آنها شبیه به پشته های فیبوناچی هستند اما پیاده سازی ساده تری دارند.
 
به طور کلی، عملکرد یک صف اولویت به مورد استفاده خاص و الزامات پیچیدگی زمان و مکان بستگی دارد. هر پیاده سازی معاوضه های خاص خود را دارد و بهترین انتخاب به نیازهای خاص برنامه بستگی دارد.
پاسخ داده شده بهمن 13, 1401 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
...