考慮這樣一種排序問題,即無法準確的知道等排序的各個數字到底是多大.對於其中的每個數字,我們只知道它落在實軸上的某個區間內.亦即,給定的 n 個形如[ai, bi ]的閉區間,其中ai,≤bi .演算法的目標是對這些區間進行模糊排序(fuzzy-sort),亦即,產生各區間的乙個排序1, i2, i3, i4,…in >,使得存在乙個 cj ∈[ai, bi ],滿足c1≤c2≤…≤cn .
a) 為n個區間的模糊排序設計乙個演算法,你的演算法應該具有演算法的一般結構,它可以快速排序左部端點(即各ai
),也要能充分利用重疊區間來改善執行時間.(隨著各區間重疊得越來越多,對各區間的排序的問題會變得越來越容易,你的演算法應該能充分利用這種重疊.)
b) 證明: 在一般情況下,你的演算法的區望執行時間為 o(n*lgn),但當所有的區間都重疊時,期望的執行時間為o(n) (亦即,當存在乙個值 x, 使得對所有的 i, 都有x∈[ai, bi ] ).你的演算法不應顯式的檢查這種情況,而是應當隨著重疊量的增加,效能自然地有所改善.
借用快排的劃分思路,以某個元素為主元,把區域劃分成三段,第一段都小於主元,第二段都等於主元
重點是劃分,區間如果重疊的部分,就把它們看做是相等的,並提取公共部分繼續劃分
a.end < b.start ==> a < b
a.start > b.end ==> a > b
其它情況 ==> a = b
為了避免類似於(2,2) (7,7) (1,8)這樣的情況,相等時要提取公因子,並更新主元(主元不一等是某個元素)
具體解釋都在**中
產品**
測試**
演算法導論 區間樹上的重疊區間查詢演算法
一 演算法設計與分析 1 資料結構設計 區間 struct interval 節點 struct node int key int color int max interval int node parent node left node right 樹 struct tree node root ...
《演算法導論》學習 歸併排序(哨兵) 逆序對問題
void merge int a 8 int left,int mid,int right la nla max num 哨兵 for int i 0 i nra i ra nra max num 哨兵 int i 0 int j 0 for int k left k right k else vo...
演算法導論 7 2 針對有相同元素值的快速排序
題目詳見演算法導論7 2習題,在這裡我就不再贅述。本文分為三個部分,第一部分是寫我改進演算法的思路,第二部分是演算法實現,第三部分是程式執行結果。思路 演算法導論 裡介紹的partition沒有考慮元素相等的情況,但是就算存在相同元素快排其實也可以適用的,只是相等的元素當作大於key的元素處理了。習...