演算法聽起來很高大上,其實它的確很高大上,只要大學裡面學習計算機的肯定接觸過演算法,只是絕大數情況下我們學習的課程叫做資料結構,它包含兩部分內容:資料結構和演算法,說這個的目的是告訴大家演算法並不是女神,雖然我們都是屌絲但是演算法和我們已經很熟悉了,如果碰巧你畢業了並且如願以償的做了碼農、it狗那麼演算法將要跟隨我們一生,鑑於此我們對演算法還是要給予高度重視的。
演算法的重要性
社會是網際網路的、是智慧型的,他們背後的支撐就是演算法,演算法的好壞就要在於它的效能即我們常說的時間效能與空間效能,但是隨著計算機硬體技術,計算機系統結構的發展,cpu越來越快,記憶體越來越大!大家都是土豪為什麼要在乎效能呢?換cpu加記憶體條不就行了嗎?不!演算法的存在是很有必要的。
演算法是衡量程式的一般性標準:演算法在現代電腦科學至少在軟體工程領域,它的地位實在是尷尬因為他是用來被出賣的!我們的程式,我們的軟體對於使用者來說需要使用者友好、需要安全這是需要付出效能代價的,對於開發者而言我們更喜歡用java而不是c因為前者的物件導向特性、更高層次的抽象使得我們更容易使用但我們需要付出效能代價,如果它的效能本來就很低,我們就無法對程式對軟體提出更高的要求,大資料、多併發、雲計算更是空談!隨著計算機能力的不斷增強,我們使用計算機來求解比以前更大的問題,我們需要效能更加優越的演算法就像我們需要更多的鈔票一樣,我們不僅僅滿足於吃飽飯,我們需要旅遊、需要看書、需要談戀愛但是前提是需要用鈔票來換取!
如何衡量演算法的效能
把執行時間看作是輸入規模的函式
為了保證軟體的正常使用,我們關心的肯定是最壞情況,最壞情況代表了對使用者的承諾!t(n)定義為輸入規模為n時的最長執行時間!那麼如何來確定這個最長執行時間呢?找一台配置最差的計算機來執行一次程式?就算是同一臺計算機每次執行時間也是不盡相同的!
演算法分析的大局觀(big idea)——漸近分析
忽略掉與機器有關的常量。
關注執行時間的增長代替關注具體的執行時間
漸進符號⊙:棄去低階項,忽略常數因子。
ex:3n^3+2n^2+1024=⊙(n^3).
現在擺在我們面前的有兩台計算機:天河二號與486機器,可能前者的機器效能是後者的十億倍,百億倍甚至更高,那麼對於同乙個問題如果後者程式採用了效能更佳的演算法那麼隨著輸入規模的增大,必然存在某一點n當輸入規模等於n時兩者所耗費的時間是一樣的,超過這個n時486機器將執行的更快!這就是演算法的威力。
1. 無論機器效能多麼優越,那只是個常數(10億or100億),可以省略。
2. 乙個壞演算法,當輸入規模逐漸變大時,執行時間的增長率也越來越快就好比
⊙(1)與⊙(n):前者的執行時間是個常數,好比是100s,後者的執行時間是線性增長的,當輸入規模很小的時候後者的執行時間很小甚至比100s還小,可是它的執行時間是線性增長的當n大於臨界點的時候,後者必然需要更多的執行時間(從這裡我們也可以看到演算法的時間複雜性是不一定的,它與輸入規模有關,並且高時間複雜度的演算法也是有研究必要的至少在臨界點之前它所花費的時間更少,對於小規模輸入的問題任然很有效)。
對於插入排序來說當輸入已經是有序時,我們只需移動n-1(輸入個數)次即可是⊙(1)級別
*輸入是逆序時我們需要移動1+2+3+…….+n-1是⊙(n^2)級別的
歸併排序是⊙(nlgn)級別的,但是要使nlgn 也是需要條件的,即輸入規模要大於臨界點*
演算法是it狗、碼農必須接觸的演算法的效能是很重要的,也是衡量程式的一般性標準我們關心隨著輸入規模增大,程式執行時間的增長率,而不關心程式具體執行了多長時間對於演算法時間複雜性的研究我們採用漸近分析的方法
演算法 Kmp演算法初見
上面的說法有些官方了,其實用最最簡單的話來說就是,給計算機乙個最快的方法從乙個名單中找到你的名字,這個時候我們用這個演算法就再合適不過了。我們一般如果要是寫乙個文字匹配的演算法的話,最最簡單的就是用迴圈去匹配了,這個應該是個只要學過程式設計的同志都應該了解的方法,如果想要在一堆字母中找到abc的話,...
初初初級演算法
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...
所謂心如磐石,初見面即見分曉?
彪悍的人生,的確不是一天兩天能夠完成修煉的,一般來說,老妖怪之所以稱之為老妖怪,是因為修煉了多年,其妖孽指數已經遠超出其他同行。今天早上,很無辜的被黑了一把,不知道為啥子,某些人定的會議居然是早上九點,很不幸的是,成都的班車基本都晚點,這玩意最終結果成了我們的藉口。很不出意外的是,大部分的人都遲到了...