یک هیپ(Heap) مورب (یا خود سازگار شونده) یک داده ساختار به صورت هیپ است که مانند یک درخت دودویی پیادهسازی شدهاست. هیپهای مورب در مقایسه با هیپهای دودویی با سرعت بیشتری ادغام میشوند. برخلاف هیپهای دودویی، هیچ محدودیتی در ساختار هیپ مورب وجود ندارد، در نتیجه هیچ تضمینی نیست که ارتفاع درخت از مرتبهٔ لگاریتمی باشد. تنها دو شرط باید در هیپ مورب برقرار باشد:
هیپ مورب، یک نوع درخت چپگرا است که از طریق جا به جایی همهٔ گرهها هنگام ادغام، تعادل هیپ را حفظ میکند. (عملیات ادغام همچنین در جمع و حذف مقادیر به کار برده میشود.)
ممکن است هیپ مورب به دلیل نداشتن محدودیتهای ساختاری، نامناسب و غیرمفید به نظر بیاید. اگرچه، با استفاده از تحلیل سرشکنی میتوان نشان داد که تمام عملیات روی هیپ مورب را میتوان در (O(logn انجام داد.[۱]
هیپهای مورب با استفاده از الگوریتم بازگشتی زیر تعریف میشوند:
می توان از الگوریتمی مشابه با ادغام دو درخت چپگرا استفاده کرد:
یک الگوریتم غیربازگشتی هم وجود دارد، که طولانی تر است و در ابتدا به مرتب سازی نیاز دارد.
اضافه کردن یک مقدار جدید به هیپ مورب، مانند ادغام آن هیپ با یک هیپ تک عضوی است.
حذف اولین مقدار در یک هیپ مانند حذف ریشه و ادغام دو زیردرخت آن است.
در بسیاری از زبان های برنامه نویسی که دارای تابع هستند، پیادهسازی هیپ مورب بسیار ساده است. قطعه کد زیر، پیادهسازی کامل این داده ساختار به زبان Haskell را نشان میدهد:
data SkewHeap a = Empty
| Node a (SkewHeap a) (SkewHeap a)
singleton :: Ord a => a -> SkewHeap a
singleton x = Node x Empty Empty
union :: Ord a => SkewHeap a -> SkewHeap a -> SkewHeap a
Empty `union` t2 = t2
t1 `union` Empty = t1
t1@(Node x1 l1 r1) `union` t2@(Node x2 l2 r2)
| x1 <= x2 = Node x1 (t2 `union` r1) l1
| otherwise = Node x2 (t1 `union` r2) l2
insert :: Ord a => a -> SkewHeap a -> SkewHeap a
insert x heap = singleton x `union` heap
extractMin :: Ord a => SkewHeap a -> Maybe (a, SkewHeap a)
extractMin Empty = Nothing
extractMin (Node x l r) = Just (x, l `union` r)