《演算法技術手冊》一2 1 問題樣本的規模

2021-09-23 03:16:32 字數 1010 閱讀 9992

2.1 問題樣本的規模

問題樣本是解決問題的程式所使用的特定輸入資料集。在大部分問題中,隨著這一資料集規模的增長,程式的執行時間也在不斷增加。同時,過度地對樣本資料進行編碼(可能使用了壓縮技術),可能會不必要地降低程式的執行效率。尋找一種最優的樣本編碼方式是極其困難的,因為問題發生在複雜的現實世界,而且還需要進行合理的翻譯才能被程式求解。

在評估演算法時,我們會盡量假定問題樣本的編碼並不是影響演算法效率的決定性因素。問題樣本的表現方式應當僅僅依賴於待執行操作的型別。設計高效的演算法通常從選擇乙個合適的資料結構開始。

由於沒法對問題樣本給出正式定義,因此我們假設樣本以一種簡潔且可以普遍接受的方式對樣本進行編碼。例如,當對n個數字進行排序時,根據慣例,我們會假定數字可以儲存在計算平台上32位的字長裡,並且待排序的樣本規模為n。假如某些數字需要用多於1個字長的空間儲存,例如某個固定數量的字長,那麼在衡量樣本空間時會多乘上乙個常量。

演算法研究人員認為,即使給定編碼方式,要精確計算出效能費用也是不切實際的。因此,他們斷言,如果一些演算法的效能費用僅僅是常數倍的差異,那麼它們可以被認為是漸近等價的。換句話說,問題空間的不斷增長所帶來的演算法效能差異是無關緊要的。舉例來說,處理64位整數要比處理32位整數需要更長的處理時間,但是這些差異是可以忽略不計的。如果乙個優秀的演算法能夠處理上百萬的32位整數,那麼它同樣可以處理相同數量的64位整數。不過,這個假定在現實世界中是不可行的(誰會願意將自己應付的賬單乘上1000 呢?),因此這種方式只作為演算法比較時的一種通用手段。

對於本書所涉及的演算法,常量對所有平台的影響幾乎都是很小的,但在產品**中具體實現演算法時,讀者還必須要注意這些常數所帶來的影響。這種漸近表示方式之所以非常實用,是因為它可以根據演算法在小資料中的效能,來**其在大資料中的效能。此外,它可以幫助決定特定演算法實現能夠處理的最大問題樣本(bentley,1999)。

大多數程式語言都支援使用陣列儲存資料集。陣列是一塊連續的記憶體區域,這些區域可以通過整數索引i直接和快速地訪問第i個元素。當陣列元素大小都在1個字長以內時,可以使用一維陣列儲存(例如整數陣列和布林陣列)。當然,陣列還可以擴充套件到多維來表示更為複雜的資料。

《演算法技術手冊》一1 1 理解問題

用演算法的眼光去看問題 演算法真的是非常重要!演算法的選擇會對軟體的效能產生巨大影響。本書將指導你學習一系列的演算法,例如搜尋和排序,還會介紹一些演算法經常採用的策略,例如分治或貪心。希望從此之後,你能夠靈活運用這些演算法來改善軟體的效能。自 計算 出現之後,資料結構便一直與演算法緊密相關。本書將介...

《演算法技術手冊》一導讀

1.1 理解問題 1.2 簡單解法 1.3 高明做法 1.3.1 貪心演算法 1.3.2 分治演算法 1.3.3 並行演算法 1.3.4 近似演算法 1.3.5 融會貫通 1.4 總結 1.5 參考文獻 第2章 演算法的數學原理 2.1 問題樣本的規模 2.2 函式的增長率 2.3 最好 最壞和平均...

《演算法技術手冊》一1 3 1 貪心演算法

1.3.1 貪心演算法 以下的貪心演算法展示了如何找到凸包上的每個點 刪除p中的最低點low low必須在凸包上。垂直畫一條穿過點low的直線,將剩餘的n 1個點分別和點low連線,以垂直直線右側的點的夾角為正值降序排列,夾角的範圍是從90皛 90啊 n 2是最右側的點,而p0是最左側的點。圖1 3...