從發明新的排序算法開始扯淡(四,挑戰)

前面講的尚未涉及到排序算法的核心部分。即有沒有辦法改進合併算法呢? web

合併兩個排號序列須要額外的等長空間。若是不額外申請空間,就只能用O(n2)至O(nlogn)的方法代替。可是這個問題真的就有那麼難嗎? 算法

事實上這是一系列看似十分簡單但真要解決起來難死無數人的問題之一。 spa

改進算法該從哪一個方向着手? 設計

先來看一下,全部的計算機算法,均可以用五個維度來衡量質量,他們是: 排序

  • 空間
  • 時間
  • 穩定度
  • 精確度
  • 數據特殊性

基本上,能夠下降一個方向上的標準來得到其餘四項方面的提高。那些普遍流傳,使用廣泛的算法無不是在各個方面都取得了較爲完美的平衡。有些算法在某幾個維度上比較極端,適合用來處理特殊狀況。而剩下的其餘算法基本上不具備實用價值。 開發

在通常工程上算法的設計,其實就是在平衡這五個項目,這裏麪包含了平時工做中用到的全部指導原則: get

空間若是容許使用額外的空間,經常能把時間複雜度降到比n更低,甚至1,好比查表法,基數排序法等。 it

時間若是空間使用受限,就極可能要接受時間上提升複雜度,最終可能得不償失。好比嘗試解決合併有序數列不額外耗費空間的問題. pdf

基本上算法複雜度 = 空間複雜度x時間複雜度 搜索

穩定度:若是願意犧牲算法的穩定度,或許可以在時間和空間上得到巨大的利益,好比快排就是用不穩定算法替換掉了O(N)的空間消耗,從而成爲目前排序算法中的王者。

精確度:通常咱們都要求計算機的運算結果100%精確,但若是容許計算結果哪怕犧牲掉一丁點兒的精確度,就能期待在空間和時間上得到極大的提高。下降精確度,在不要求得到真正精確的數據的場合特別有用,好比web搜索,近年來因爲雲服務,雲數據的概念炒熱,相關的算法也逐漸進入你們的視野。不過容許非100%精確度的使用場合仍是很是之少的。

數據特殊性:有一些比O(nlogn)更低的排序算法被開發出來,但都是基於特定的數據類型,或知足特定條件的數據集合等。在平常工做中,這是個頗有用的技巧,由於絕大部分時候咱們都只須要處理特定的數據類型和數據集合,所以,選擇應付特殊性的算法能夠節省大量的時間空間成本,好比前一篇文章中,將求最高位數的問題,轉成求最高位的奇偶性的問題,問題的解法直接從O(n)降到O(1)。

再來看咱們想要改進的算法,精確度確定是不能損失,泛用的算法數據也不能有特殊性,在算法複雜度不會低於O(NlogN)的狀況下,突破的方向看來就只剩降低低穩定度一條路可走了——而這正是快速排序作的事——用一個不穩定可是十分絕妙的交換順序算法代替了O(n)的空間消耗,從而摘走了排序算法的桂冠,甚至還成爲了上世紀最偉大的計算機算法之一。想象一下,一個耗費O(n)空間的快排算法其實還不如歸併算法。

因此歸併算法想要有所突破,就須要像快速排序那樣找個替換空間的不穩定算法出來,若是能找到的話,至少能和快排勢均力敵吧。

結果,還真有人宣稱找到了改進的方法:http://akira.ruc.dk/~keld/teaching/algoritmedesign_f04/Artikler/04/Huang88.pdf

在這個連接的論文裏,做者宣稱找到了合併有序數列,在線性時間,不耗費額外的On空間,可是不穩定的算法。這個算法知道的人很少,但看樣子是至關複雜吧,就算是On的算法,實施起來過於麻煩的話,大概你們仍是去用快排算法了。

相關文章
相關標籤/搜索