貪婪法,計數排序

2021-08-24 19:01:21 字數 2277 閱讀 1693

研究生期間的第乙個暑假,只有20多天,不過已經算是老闆開恩了,實驗室其他組最少的只放乙個星期,不過人家是有專案做唉,羨慕中……,廢話少說了。放假前參加了大老闆請的一位在美國搞演算法的老師上的高階演算法課,總體感覺一般般,八節課裡有的簡單到不想聽,有的難到聽不懂,不過老師還算認真,當做一次演算法複習還是好的,現將總結寫在這兒,也算是對這十幾天有個交代。

這次演算法課主要集中在幾個常用演算法:貪婪法,排序,圖周遊,最大流問題以及np問題

1.貪婪法

初學演算法時便知道這是解決問題一種很好很簡單的方法,聽課後才發現它能解決的問題還真是多。解決這類問題的方法可概括為「步步為營」,即每一步的選擇一定是最優的過後不能更改,這一點是與動態規劃最大的區別,動態規劃也是類似的自底向上的解決方法,但是其做每一次選擇的時候可能會對前面的選擇作出動態的調整,由於這種特性使用動態規劃時採用遞迴是很常見甚至是必須的方法。

貪婪法典型例題有郵局建設問題:在乙個一維空間裡居民點的座標已經給定,現打算籌建最大覆蓋半徑100裡的郵局,求郵局的最少個數。

這是典型的貪婪法問題,只需從第乙個居民點開始向右100裡建第乙個郵局,然後從這個郵局向右100裡第乙個覆蓋不到的居民點開始重複上述過程直至所有居民點都被覆蓋,偽**如下:

post-office(p,

h, m,

n)p[1] = h[1] + 100.m ¬

1 fori

¬2don

doifh[i]

> p[m] + 100,

then

ifp[m] > h[n]

thenp[m]

¬h[n]

returnp, m

end

complexity is obviously o(n).

當時自己寫的時候出了點小問題,我每次確定郵局後都去求最遠未覆蓋點easti,然後再從easti向右找,這完全沒必要,只對h陣列做一次掃瞄足矣。

其它問題還有諸如加油站選擇問題等,topcoder的演算法教程裡也有對greedy的很好的介紹

2.排序

主要講了整數排序中的計數排序(counting sort),也就是前段時間論壇上炒的沸沸揚揚的所謂「張仰彪排序法」,這個演算法在演算法導論裡已有詳細的陳述,不知道這位發明者有沒有看過,如果沒有參考過那我還真是挺佩服他的,這是外話。具體的做法就不再贅述,對counting sort的關注主要是因為其演算法複雜度為o(n),從而有些只針對整數的排序就不必採用標準的快排,提高排序的效率。

典型的例子是判斷n皇后共存問題,n皇后問題是用回溯法解決的,這裡只討論n皇后的共存判斷問題,我們注意到這個問題只需要排序就可以完成複雜度為 o(n)。原問題如下:

在乙個n´n

的棋盤裡如何放置互不攻擊的

n個皇后是個有名的問題。我們用座標

(i, j)

來表示乙個皇后被置於棋盤的第

i行和第

j列這一點上。乙個在座標

(i, j)

上的皇后和乙個在座標

(u, v)

上的皇后會互相攻擊當且僅當

它們在同一行,或者同一列,或者同一對角線,也就是

(i = u)

或(j = v)

或|i -u| = |j-v|

。現在假設有

n個皇后,他們的位置是(a1

, b1),

(a2, b2),

…,(an

, bn

)。請設計乙個

o(n)

的演算法來檢查他們是否可以相安無事。

解決方案是:將他們按行號排序後很容易檢查是否有兩個皇后在同一行。同樣可以在

o(n)

時間內查出是否有在同一列的皇后。兩個在座標

(i, j)

和(u, v)

上的皇后如果在對角線上互相攻擊,那麼必有

|i -u| = |j-v|

,也就是

i- u = j - v

,或者i

- u = v – j

。這也就是說必有

i - j = u – v

,或者i

+ j = u + v

。這兩種情況同樣可以用計數排序在

o(n)

時間內檢查

排序演算法之 計數排序法 八

include include include include define len 20 void show int str void malloc int size void show int str void malloc int size return result void count s...

Swift經典排序演算法 計數排序法

一 小序 我們先講解一道演算法題目 陣列中有10個隨機數值,數值取值範圍為從0到5,我們如何用最快的速度把這10個整數從小到大進行排序。首先你會想到我們之前學的快速排序這個演算法,因為快速排序演算法的時間複雜度只為o nlogn 其實這種方法還是不夠快,那有沒有比快速排序演算法更快的排序方法呢?你心...

貪婪演算法 拓撲排序

2 多說一句 這一部分,資料結構已經不再重要了,開始進入到了演算法設計的領域。在 資料結構 演算法與應用 一書中,描述了一部分重要的演算法設計方法,包括貪婪演算法 分治演算法 動態規劃 回溯和分支定界。並且對於演算法的討論不如 演算法導論 中細緻周密。資料結構專欄暫時只關注貪婪 分治和動規三種演算法...