原创 【坐在馬桶上看算法】算法10:二叉樹

    二叉樹是一種特殊的樹。二叉樹的特點是每個結點最多有兩個兒子,左邊的叫做左兒子,右邊的叫做右兒子,或者說每個結點最多有兩棵子樹。更加嚴格的遞歸定義是:二叉樹要麼爲空,要麼由根結點、左子樹和右子樹組成,而左子樹和右子樹分別是一棵二叉樹。

原创 【坐在馬桶上看算法】算法7:Dijkstra最短路算法

       上週我們介紹了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意兩點的最短路徑,這稱爲“多源最短路”。本週來來介紹指定一個點(源點)到其餘各個頂點的最短路徑,也叫做“單源最短路徑”。例如求下圖中的1號頂點到2、3、4

原创 【坐在馬桶上看算法】算法2:鄰居好說話:冒泡排序

       簡化版的桶排序不僅僅有上一節所遺留的問題,更要命的是:它非常浪費空間!例如需要排序數的範圍是0~2100000000之間,那你則需要申請2100000001個變量,也就是說要寫成int a[2100000001]。因爲我們需

原创 【啊哈!算法】算法11:堆——神奇的優先隊列(上)

        堆是什麼?是一種特殊的完全二叉樹,就像下面這棵樹一樣。        有沒有發現這棵二叉樹有一個特點,就是所有父結點都比子結點要小(注意:圓圈裏面的數是值,圓圈上面的數是這個結點的編號,此規定僅適用於本節)。符合這樣特點的完

原创 【坐在馬桶上看算法】算法12:堆——神奇的優先隊列(下)

        接着上一Pa說。就是如何建立這個堆呢。可以從空的堆開始,然後依次往堆中插入每一個元素,直到所有數都被插入(轉移到堆中爲止)。因爲插入第i個元素的所用的時間是O(log i),所以插入所有元素的整體時間複雜度是O(NlogN)

原创 【啊哈!算法】最快最簡單的排序——桶排序

最快最簡單的排序——桶排序  在我們生活的這個世界中到處都是被排序過的。站隊的時候會按照身高排序,考試的名次需要按照分數排序,網上購物的時候會按照價格排序,電子郵箱中的郵件按照時間排序……總之很多東西都需要排序,可以說排序是無處不在。現在我

原创 【坐在馬桶上看算法】算法6:只有五行的Floyd最短路算法

       暑假,小哼準備去一些城市旅遊。有些城市之間有公路,有些城市之間則沒有,如下圖。爲了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。        上圖中有4個城市8條公路,公路上的數字表示這條公路

原创 【坐在馬桶上看算法】算法3:最常用的排序——快速排序

       上一節的冒泡排序可以說是我們學習第一個真正的排序算法,並且解決了桶排序浪費空間的問題,但在算法的執行效率上卻犧牲了很多,它的時間複雜度達到了O(N2)。假如我們的計算機每秒鐘可以運行10億次,那麼對1億個數進行排序,桶排序則

原创 【坐在馬桶上看算法】啊哈算法13:零基礎徹底弄懂"並查集"

咱們從一個故事說起——解密犯罪團伙。快過年了,犯罪分子們也開始爲年終獎“奮鬥”了,小哼的家鄉出現了多次搶劫事件。由於強盜人數過於龐大,作案頻繁,警方想查清楚到底有幾個犯罪團伙實在是太不容易了,不過警察叔叔還是蒐集到了一些線索,需要咱們幫忙分

原创 我的友情鏈接

51CTO博客開發

原创 零基礎徹底弄懂"並查集"

咱們從一個故事說起——解密犯罪團伙。快過年了,犯罪分子們也開始爲年終獎“奮鬥”了,小哼的家鄉出現了多次搶劫事件。由於強盜人數過於龐大,作案頻繁,警方想查清楚到底有幾個犯罪團伙實在是太不容易了,不過警察叔叔還是蒐集到了一些線索,需要咱們幫忙分

原创 【啊哈!算法】算法11:堆——神奇的優先隊列(上)

        堆是什麼?是一種特殊的完全二叉樹,就像下面這棵樹一樣。        有沒有發現這棵二叉樹有一個特點,就是所有父結點都比子結點要小(注意:圓圈裏面的數是值,圓圈上面的數是這個結點的編號,此規定僅適用於本節)。符合這樣特點的完

原创 【坐在馬桶上看算法】算法8:巧妙的鄰接表(數組實現)

之前我們介紹過圖的鄰接矩陣存儲法,它的空間和時間複雜度都是N2,現在我來介紹另外一種存儲圖的方法:鄰接表,這樣空間和時間複雜度就都是M。對於稀疏圖來說,M要遠遠小於N2。先上數據,如下。4 5 1 4 9 4 3 8 1 2 5 2 4 6

原创 【坐在馬桶上看算法】算法5:解密迴文——棧

     上一節中我們學習了隊列,它是一種先進先出的數據結構。還有一種是後進先出的數據結構它叫做棧。棧限定只能在一端進行插入和刪除操作。比如說有一個小桶,小桶的直徑只能放一個小球,我們現在向小桶內依次放入2號、1號、3號小球。假如你現在需

原创 【坐在馬桶上看算法】算法12:堆——神奇的優先隊列(下)

        接着上一Pa說。就是如何建立這個堆呢。可以從空的堆開始,然後依次往堆中插入每一個元素,直到所有數都被插入(轉移到堆中爲止)。因爲插入第i個元素的所用的時間是O(log i),所以插入所有元素的整體時間複雜度是O(NlogN)