در علوم رایانه، هرم (Heap) داده ساختاری است که بر اساس درختها پیادهسازی میشود. هرم یک داده ساختار بهینه برای پیادهسازی یک داده گونه انتزاعی(abstract data type) به نام صف اولویت دار است. هرمها میتوانند به شکلهای مختلفی پیادهسازی شوند. یکی از رایجترین پیادهسازیها، هرم دودویی است که با استفاده از درخت دودویی مدل میشود.
هرم دودویی دو نوع دارد:
برای الگوریتم مرتبسازی هرمی از هرم بیشینه و برای پیادهسازی صف اولویت دار معمولاً از هرم کمینه استفاده میشود.[۱]
در هر دو نوع، مقادیر گرهها از خاصیت هرم پیروی میکنند. خاصیت هرم بیشینه این است که به ازای هر گره، مقدار موجود در والدش (parent) در صورت وجود بزرگتر مساوی با مقدار آن گره است؛ بنابراین عنصر بیشینه در ریشه درخت (root) قرار دارد.
خاصیت هرم کمینه، برعکس هرم بیشینه است به این صورت که به ازای هر گره، مقدار موجود در والدش (parent) در صورت وجود کوچکتر مساوی با مقدار آن گره است؛ بنابراین عنصر کمینه در ریشه درخت (root) قرار دارد.
در هرمهای دودویی روابطی بین اندیس هر گره (i)، والد ((parent(i)، فرزند چپ ((left(i) و فرزند راست ((right(i) آن در آرایه مرتب شده وجود دارد:
اگر هرم را به چشم یک درخت ببینیم ارتفاع ( height ) برای هر گره ، اندازه طولانیترین مسیر نزولی از آن گره تا یکی از برگها و ارتفاع هرم معادل با ارتفاع گره ی ریشه خواهد بود .بنابراین در هرمی دودویی متشکل از n عنصر ، ارتفاع هرم ( Θ( log n است.[۲] همچنین عمق (depth) هر گره برابر با طول مسیر از آن گره تا گرهٔ ریشه و عمق هرم معادل با عمق آخرین لایه از برگها خواهد بود.
توابعی که بر روی هرمها پیادهسازی میشوند عبارتند از:
داده ساختار هرم نباید با مفهوم Heap که برای اختصاص پویای حافظه به کار میرود اشتباه شود. بعضی از زبانهای برنامهنویسی مانند لیسپ برای این شیوهٔ اختصاص حافظه از داده ساختار هرم استفاده میکنند. هرمها معمولاً به صورت آرایه پیادهسازی میشوند و نیاز به اشاره گر ندارند.
Build_Max_Heap(A)
A.heap-size = A.length
for i = [A.length / 2] downto 1
Max-Heapify( A , i )
Max-Heapify(A,i)
l = Left(i)
r = Right(i)
if l <= A.heap-size and A[l] > A[i]
largest = l
else
largest = i
if r <= A.heap-size and A[r] > A[largest]
largest = r
if largest != i
exchange A[i] with A[largest]
Max-Heapify( A , largest )
پیچیدگی زمانی تعدادی از انواع هرم برای تابعهای مختلف در جدول زیر آمدهاست. خانههای ستاره دار نشان دهندهٔ زمان سرشکن است و خانههایی که دو ستاره دارند نشاند دهندهٔ این است که n اندازهٔ هرم بزرگتر است.
Operation | Binary | Binomial | Fibonacci heap | Pairing heap | Brodal queue |
---|---|---|---|---|---|
create-heap | Θ(۱) | Θ(۱) | Θ(۱) | ? | O(1) |
findMin | Θ(۱) | O(log n) | Θ(۱) | O(1)* | O(1) |
deleteMin | Θ(log n) | Θ(log n) | O(log n)* | O(log n)* | O(log n) |
insert | Θ(log n) | O(log n) | Θ(۱) | O(1)* | O(1) |
decreaseKey | Θ(log n) | Θ(log n) | Θ(۱)* | O(log n)* | O(1) |
merge | Θ(n) | O(log n)** | Θ(۱) | O(1)* | O(1) |
داده ساختار هرم کاربردهای زیادی دارد که برخی از آنها عبارتند از:
[[[:en:Binary|heap:]]]