關於證明斜堆的非遞迴定義

2021-06-28 01:29:49 字數 1402 閱讀 9498

斜堆這種資料結構是在weiss《數學結構與演算法分析》的書裡看到的,實際上它作為一種接近左式堆的資料結構,在遞迴合併時無條件進行左右子堆交換,減少左子堆npl與右子堆npl的比較判斷。但是,這樣的簡略處理使斜堆的右路徑可能很長,在合併遞迴時導致棧溢位,所以感覺斜堆本身並不是乙個特別好用的結構。也許正是因為如此,許多地方對斜堆的描述都甚少,weiss只給了乙個斜堆的遞迴定義,找過各種百科和部落格找了一圈也沒有發現討論斜堆非遞迴定義的內容,於是花時間想了一下並且寫了個證明,實際使用意義也許並不大,但是大致可以作為一種思維訓練,具體內容如下:

已知條件(斜堆的遞迴定義):

a、只有乙個結點的堆是斜堆

b、兩斜堆按【斜堆合併法】合併後的堆是斜堆

c、斜堆合併法(遞迴)的步驟:

步驟①:如其中一斜堆為空,則返回另一斜堆

步驟②:如兩斜堆均不為空,則將根節點值較小(根據對稱性,不妨設其為小頂堆)的斜堆與根結點值較大的斜堆的右子堆以【斜堆合併法】合併,作為新的右子堆。合併完成後,交換所得堆的左右子堆。

求並證明:斜堆的非遞迴定義

證明:先給出結論——斜堆即,除了葉結點以外,其它所有結點都有左子堆的大頂堆或小頂堆

證明充分性——

如對於任意兩個堆(是否斜堆都無所謂)進行【斜堆合併法】例程,由於步驟②,堆a先與堆b的右子堆合併作為新的右子堆,並且交換新堆b的左右子堆,顯而易見地,合併後所得堆的左子堆必不為空。

由於斜堆屬於任意堆,故任意兩個斜堆進行【斜堆合併法】後,其左子堆必不為空。同時根據遞迴定義,此時合併所得的堆是斜堆。因此,所有的斜堆都是除了葉結點以外,其它所有結點都有左子堆的大頂堆或者小頂堆。

充分性得證。

證明必要性——

反證法,假設存在某個高度為h的大頂或小頂堆h,它滿足【除了除了葉結點以外,其它所有結點都有左子堆】這一條件,並且它不是斜堆。以下試圖推出矛盾。

根據斜堆的定義,類似左式堆的【左式堆的左右子堆都是左式堆】,易知斜堆的左右子堆都是斜堆。根據逆反命題,僅當堆的左右子堆至少有乙個不是斜堆時,該堆不是斜堆。

那麼對於此前假設的堆h,其左子堆與右子堆必有其一不是斜堆。即必有一高度為h-k(1≤k≤h-1)的子堆,滿足【除了除了葉結點以外,其它所有結點都有左子堆】這一條件,並且它不是斜堆。

依次類推,多次迴圈後,可得,在堆h中,至少有一高度為1的子堆,它不是斜堆,且滿足【除了除了葉結點以外,其它所有結點都有左子堆】。

但是,對於高度為1且滿足條件的堆,僅兩種情況(一種有三結點即根+左右結點,一種有二結點即根+左結點),此兩種堆都為斜堆,所以產生矛盾,假設不成立。

所以,所有滿足【除了除了葉結點以外,其它所有結點都有左子堆】的大頂堆或者小頂堆,都是斜堆。

必要性得證。

至此證明完畢,最後再重複一下對斜堆的非遞迴定義吧:

斜堆是除了葉結點以外其它所有結點都有左子堆的大頂堆或小頂堆。

斜堆的實現

斜堆,也稱為自適應堆,它是左傾堆的乙個變種。與左傾堆一樣,它通常也用於優先佇列的實現,它的合併操作的時間複雜度也是o logn 斜堆的結點 template class t class node 1 合併操作 合併斜堆x和斜堆y template class t node skewheap merg...

關於非旋FHQ Treap的複雜度證明

a,b都是sort之後的排列 從小到大 由乙個排列a構造一顆bst,由於我們只確定了中序遍歷 a,但這顯然是不能確定一棵樹的形態的。由乙個排列b構造一顆heap 大根 由於沒有重複元素,然後人為欽定左兒子 右兒子,那麼他的後序遍歷 b。但是一棵樹,如果中序遍歷和後續遍歷確定了,那麼他的形態也就確定了...

關於熵的證明練習

這個學期有一門叫做 資訊理論與編碼 的課程,上課老師是我們學院的副院長,姓華,他不幽默,但是課程內容安排得很有條理,一層一層深入,最後有總結和隨堂複習題,3節課下來學到很多。這個星期一的晚上是本學期的第2次課,講起了entropy 熵 用符號 h 來表示,及其性質,課後的練習題裡來了這麼一道題目 證...