در علوم رایانه، **صف اولویت دار دوطرفه** یا **هرم دوطرفه** (به انگلیسی: DEPQ) داده ساختاری شبیه هرم یا صف دوطرفه می‌باشد که برای حذف عضو کمینه و بیشینه بهینه است. هر عضو در صف اولویت دار دوطرفه دارای یک اولویت یا ارزش می‌باشد و می‌توان عناصر را به ترتیب صعودی یا نزولی با پیچیدگی زمانی برابر، حذف کرد.

عملیات‌ها
---------

()isEmpty

چک می‌کند صف خالی است یا نه و اگر خالی بود مقدار درست (به انگلیسی: true) برمی‌گرداند.

()size

تعداد کل عناصر موجود در صف را برمی‌گرداند.

()getMin

عنصر با اولویت کمینه را برمی‌گرداند.

()getMax

عنصر با اولویت بیشینه را برمی‌گرداند.

x)put)

عنصر x را به صف اضافه می‌کند.

()removeMin

عنصر با اولویت کمینه را حذف می‌کند و آن را بازمی‌گرداند.

()removeMax

عنصر با اولویت بیشینه را حذف می‌کند و آن را بازمی‌گرداند.
اگر عملیاتی بر دو عنصر با اولویت یکسان اجرا شود، اولویت با عنصری است که ابتدا وارد شده‌است.

پیاده‌سازی
----------

صف اولویت دار دوطرفه می‌تواند با درخت دودویی جستجو متعادل (به انگلیسی: balanced binary search trees) یا داده ساختاری خاص مثل min-max heap و pairing heap پیاده‌سازی شود.

### روش ساختار دوتایی

دراین روش دو داده ساختار هرم کمینه و هرم بیشینه با عناصر یکسان داریم که هر دوعنصر یکسان در دو هرم به هم اشاره (به انگلیسی: pointer) می‌کنند.

### تناظر کلی (به انگلیسی: Total correspondence)

در این روش، اگر عناصر را مرتب کنیم یکی در میان هنصرها در هرم بیشینه و کمینه نگه می‌داریم یعنی نصف عناصر در هرم کمینه و نصف دیگر هرم بیشینه قرار می‌گیرد و هر عنصر به عنصر بعدی خود - که بدیهی است در هرم دیگر قرار دارد – اشاره می‌کند.

### هرم ورودی (به انگلیسی: Interval heaps)

دراین روش داده ساختار یک هرم است که هر گره در آن دوعضو دارد و براساس عضو اول هرم کمینه و براساس عضو دوم هرم بیشینه می‌باشد.

پیچیدگی زمانی
-------------

وقتی صف اولویت دار دوطرفه با هرم فاصله پیاده‌سازی شود و n عنصر داشته باشد پیچیدگی زمانی هر عملیات به شرح زیر است.


| عملیات | پیچیدگی زمانی |
| --- | --- |
| init() | O(n) |
| isEmpty() | O(1) |
| getmin() | O(1) |
| getmax() | O(1) |
| size() | O(1) |
| insert(x) | O(log *n*) |
| removeMin() | O(log *n*) |
| removeMax() | O(log *n*) |

وقتی صف اولویت دار دوطرفه با هرم یا هرم جفت پیاده‌سازی شود پیچیدگی زمانی عملیات‌های مختلف به شرح زیر است. پیچیدگی زمانی برای هرم جفت به صورت سرشکن است.


| عملیات | پیچیدگی زمانی |
| --- | --- |
| isEmpty() | O(1) |
| getmin() | O(1) |
| getmax() | O(1) |
| insert(x) | O(log *n*) |
| removeMax() | O(log *n*) |
| removeMin() | O(log *n*) |

کاربرد
------

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

منابع
-----



| * ن
* ب
* و
ساختمان داده‌هاs |
| --- |
| Types | 
* Collection
* ظرف (نوع داده انتزاعی)

 |
| نوع داده انتزاعی | 
* آرایه انجمنی
	+ Multimap
* List
* پشته
* صف (نوع داده انتزاعی)
	+ صف دوطرفه
* صف اولویت‌دار
	+ Double-ended priority queue
* Set
	+ Multiset
	+ مجموعه‌های مجزا (ساختمان داده)

 |
| آرایه (ساختار داده)s | 
* آرایه بیتی
* بافر چرخشی
* آرایه پویا
* جدول درهم‌سازی
* درخت آرایه درهم
* Sparse array

 |
| Linked | 
* Association list
* لیست پیوندی
* فهرست پرشی
* Unrolled linked list
* XOR linked list

 |
| درخت (ساختار داده) | 
* درخت بی
* درخت جستجوی دودویی
	+ درخت آآ
	+ درخت ای‌وی‌ال
	+ درخت سرخ-سیاه
	+ درخت جستجوی دودویی خود-متوازن
	+ درخت اسپلی
* هرم (علوم رایانه)
	+ هرم دودویی
	+ پشته‌های دوجمله‌ای
	+ هیپ فیبوناتچی
* درخت مستطیلی
	+ R\* tree
	+ R+ tree
	+ Hilbert R-tree
* درخت پیشوندی
	+ Hash tree

 |
| گراف (ساختار داده) | 
* Binary decision diagram
* گراف جهت‌دار غیرمدور
* ماشین غیر مدور قطعی متناهی

 |
| 
* فهرست ساختار داده

 |