هیپ دی تایی

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

d -ary heap یا d-heap یک ساختمان داده صف اولویت دار است، یک کلیت از یک هیپ دودویی که گره ها به جای دو فرزند d فرزند دارند.[۱][۲] بنابراین هیپ دودویی یک هیپ ـ 2 است. طبق گفته های Tarjan و Jensen و همکارانشان [۳] ، هیپ d تایی توسط Donald B. Hohnson در سال 1975 ابداع شده است.[۴]

این ساختمان داده به عملیات های با اولویت کمتر اجازه می دهد تا سریع تر از هیپ دودویی عمل کنند، با هزینه کندتر حذف کردن کمترین عملیات ها. این موازنه منجر به بهتر اجرا شدن الگوریتم هایی مثل الگوریتم دیکسترا که در آن کاهش عملیات های اولویت دار شایع تر از حذف حداقل عملیات ها است، شده است.[۴][۵] علاوه بر این، هیپ d تایی بهتر از هیپ دودویی از حافظه نهان استفاده می کنند، و در عمل به آنها اجازه میدهد تا سریع تر اجرا شوند با اینکه در تئوری بدترین سرعت اجرای بیشتری دارند. همانند هیپ دودویی، هیپ های d تایی الگوریتم درجا هستند که از هیچ فضای ذخیره سازی اضافه ای فراتر از آنچه که برای ذخیره اعضای آرایه در هیپ نیاز است، استفاده نمی کنند. همانند مبنای 2، هیپ dتایی هم یک ساختار اطلاعاتی درونی است که هیچ حافظه ی جانبی را فراتر از آنچه که نیاز دارد تا اعداد یک مبنا را ذخیره کند استفاده و اشغال نمی کند. [۱][۶]

ساختمان داده[ویرایش]

هیپ dتایی شامل آرایه n عضوی است، که هر کدام از آنها دارای اولویت در ارتباط با آن است. این اعضا ممکن است به عنوان گره هایی در یک درخت dتایی کامل که در جستجوی سطح اول ذکر شده، دیده شوند. عضوی که در جایگاه 0 آرایه قرار دارد، ریشه درخت را تشکیل می دهد، و اعضایی که در موقعیت  1-d آرایه قرار دارند، فرزندان ریشه و  d^2 عضو بعدی، نوه های آن هستند، و... . بنابراین، پدر عضوی که در مکان i است، (برای هر i > 0 ) عضوی است که در مکان کف {((1-i) / d)} ‎است و فرزندان آن اعضایی هستند که در مکان id + 1 تا id + d قرار دارند. با توجه به ویژگی هیپ در مین هیپ هر عضو یک اولویت دارد که حداقل به بزرگی پدرش است؛ در ماکس هیپ، هر عضو دارای اولولیتی حداکثر برابر پدرش است.[۱][۲]

عضو دارای اولویت کمتر در مین هیپ (یا عضو دارای بیشترین اولویت در ماکس هیپ) همیشه در مکان صفر آرایه قرار می گیرد. برای حذف این عضو از صف اولویت، آخرین عضو x آرایه جای آن را می گیرد، و سایز آرایه یکی کم می شود. سپس، در صورتی که عضو x و فرزندانش خاصیت های هیپ را برآورده نکنند، x با یکی از فرزندانش جابجا می شود. (در مین هیپ عضوی که دارای کمترین اولویت است، یا در ماکس هیپ عضو دارای بیشترین اولویت). آن را با اعضای پایین تر در درخت و عضوهای بعدی در آرایه جابجا می کنیم، تا جایی که سرانجام خاصیت های هیپ برآورده بشود. همانند فرایند جابجایی رو به پایین، برای افزایش اولویت هر عضو در مین هیپ یا کاهش اولویت هر عضو در ماکس هیپ استفاده می شود.[۱][۲]

برای وارد کردن عضو جدید به هیپ، عضو به آخر آرایه اضافه می شود و سپس در صورتیکه خاصیت های هیپ نقض شده باشد، آن عضو با پدرش جابجا می شود. آن را در درخت به بالا انتقال داده و در آرایه به عضوهای اولیه منتقل می کنیم، تا جایی که خاصیت های هیپ برآورده بشود. همانند فرایند جابجایی رو به بالا، برای کاهش اولویت هر عضو در مین هیپ یا افزایش اولویت هر عضو در ماکس هیپ استفاده می شود.[۱][۲]

برای ایجاد یک هیپ جدید از آرایه n عضوی، ممکن است یک حلقه در جهت معکوس ایجاد شود. این حلقه از عضوی با مکان {1 - n} شروع شده و به عضو در مکان صفر ختم می شود. فرایند جابجایی رو به پایین برای هر عضو اجرا می شود.[۱][۲]

تجزیه و تحلیل[ویرایش]

در هیپ d تایی با داشتن n عضو، هر دو فرایند جابجایی رو به بالا و فرایند جابجایی رو به پایین به تعداد { d gol / n gol = n _ {d} gol } ‎ جابجایی وجود دارد. در فرایند جابجایی رو به بالا، هر تعویض شامل تنها یک مقایسه هر عضو با پدرش است و یک زمان ثابت طول می کشد. بنابراین، زمان وارد کردن یک عضو جدید در هیپ، کاهش اولویت یک عضو در مین هیپ، یا افزایش اولویت یک عضو در ماکس هیپ { (d gol / n gol)O } می باشد. در فرایند جابجایی رو به پایین، هر تعویض شامل d مقایسه است و (d)O زمان لازم دارد. 1 – d مقایسه لازم است تا کوچکترین و بزرگترین فرزند تعیین شود و سپس یک مقایسه دیگر با پدر تا تعیین شود که آیا تعویض نیاز است یا نه. بنابراین، زمان حذف کردن عضو ریشه، افزایش اولویت هر عضو در مین هیپ، یا کاهش اولویت هر عضو در ماکس هیپ، { (d gol / n gol d)O } می باشد.[۱][۲]

وقتی یک هیپ d تایی از n عضو ساخته می شود، بیشتر اعضا در مکانی قرار دارند که سرانجام برگ های درخت d تایی را تشکیل می دهند و جابجایی رو به پایین برای آنها صورت نمی گیرد. در حداکثر {1+d/n} ‎ از اعضا، که برگ نیستند حداقل یک بار جابجایی رو به پایین با هزینه زمانی (d)O برای یافتن فرزند برای جابجایی با آن صورت می گیرد. در حداکثر {1+ ^2d/n} ‎ گره ممکن است جابجایی رو به پایین دو بار صورت بگیرد، که در این صورت (d)O هزینه اضافی برای دومین جابجایی، فراتر از هزینه ای که برای دوره اول محاسبه شده بود، نیاز است و... بنابراین، مقدار کل زمانی که برای ساختن یک هیپ با این روش نیاز است برابر است با:

فضای استفاده شده توسط هیپ d تایی با عملیات های درج و حذف کوچکترین عضو خطی است، به طوری که نسبت به آرایه های دیگری که شامل لیستی از اعضا در هیپ هستند، از فضای ذخیره سازی اضافی استفاده نمی کند.[۱][۶] اگر تغییراتی در اولویت های اعضای موجود نیاز باشد، یکی از اعضا باید اشاره گرهایی که فقط فضای ذخیره سازی خطی دوباره از آنها استفاده میکند را از اعضا به مکانشان در هیپ نگه دارد.[۱]

کاربردها[ویرایش]

الگوریتم دیکسترا برای یافتن کوتاهترین مسیر در گراف ها و الگوریتم پریم برای درخت فراگیر مینیمم، هر دو از مین هیپ استفاده می کنند که در آن n عملیات حذف مینیمم و m عملیات کاهش اولویت وجود دارد. که n تعداد رئوس در گراف و m تعداد یال ها است. با استفاده از یک هیپ d تایی با { n / m = d } ‎ کل زمان برای این دو نوع عملیات ممکن است متعادل شود که کل زمان برای الگوریتم برابر می شود با {(n_{n/m}gol m)O} ‎. زمان اجرای بهبود یافته هیپ دودویی این الگوریتم ها وقتی که تعداد یال ها به طور قابل ملاحظه ای بیشتر از تعداد راس ها باشد، برابر است با {(n gol m)O} .[۴][۵] یک ساختمان داده صف اولویت دیگر، هیپ فیبوناتچی است که زمان اجرای نظری بهتر {(n gol n + m)O} را می دهد. ولی در عمل، به طور کلی هیپ dتایی ها حداقل به همان اندازه سریع و یا اغلب سریع تر از هیپ فیبونانچی برای این کاربرد هستند. [۷]

4-هیپ ها در عمل ممکن است عملکرد بهتری حتی در عملیات های حذف مینیمم نسبت به هیپ دودویی داشته باشند.[۱][۲] علاوه بر این، معمولا هیپ های dتایی بسیار سریع تر از هیپ دودویی اجرا می شود. به خاطر اندازه هیپ که بیشتر از اندازه حافظه نهان کامپیوتر است. هیپ دودویی معمولا به کش سی‌پی‌یو بیشتر و page fault حافظه مجازی بیشتری نسبت به هیپ dتایی نیاز دارد. [۸][۹]


منابع[ویرایش]

  1. ۱٫۰۰ ۱٫۰۱ ۱٫۰۲ ۱٫۰۳ ۱٫۰۴ ۱٫۰۵ ۱٫۰۶ ۱٫۰۷ ۱٫۰۸ ۱٫۰۹ ۱٫۱۰ Tarjan, R. E. (1983), "3.2. d-heaps", Data Structures and Network Algorithms, CBMS-NSF Regional Conference Series in Applied Mathematics 44, Society for Industrial and Applied Mathematics, pp. 34–38 .
  2. ۲٫۰ ۲٫۱ ۲٫۲ ۲٫۳ ۲٫۴ ۲٫۵ ۲٫۶ ۲٫۷ Weiss, M. A. (2007), "d-heaps", Data Structures and Algorithm Analysis (2nd ed.), Addison-Wesley, p. 216, ISBN 0321370139 .
  3. Jensen, C.; Katajainen, J.; Vitale, F. (2004), An extended truth about heaps .
  4. ۴٫۰ ۴٫۱ ۴٫۲ Johnson, D. B. (1975), Priority queues with update and finding minimum spanning trees, Information Processing Letters 4 (3): 53–57, doi:10.1016/0020-0190(75)90001-0 .
  5. ۵٫۰ ۵٫۱ Tarjan (1983), pp. 77 and 91.
  6. ۶٫۰ ۶٫۱ Mortensen, C. W.; Pettie, S. (2005), "The complexity of implicit and space efficient priority queues", Algorithms and Data Structures: 9th International Workshop, WADS 2005, Waterloo, Canada, August 15-17, 2005, Proceedings, Lecture Notes in Computer Science 3608, Springer-Verlag, pp. 49–60, doi:10.1007/11534273_6, ISBN 978-3-540-28101-6 .
  7. Cherkassky, B. V.; Goldberg, A. V.; Radzik, T. (1996), Shortest paths algorithms: Theory and experimental evaluation, Mathematical Programming 73 (2): 129–174, doi:10.1007/BF02592101 .
  8. Naor, D.; Martel, C. U.; Matloff, N. S. (1991), Performance of priority queue structures in a virtual memory environment, Computer Journal 34 (5): 428–437, doi:10.1093/comjnl/34.5.428 .
  9. Kamp, Poul-Henning (2010), You're doing it wrong, ACM Queue 8 (6) .

http://en.wikipedia.org/wiki/D-ary_heap

پیوند به بیرون[ویرایش]