導航:首頁 > 源碼編譯 > 有哪些提升演算法

有哪些提升演算法

發布時間:2023-11-02 23:03:48

㈠ 如何提升數據結構方面的演算法能力

我們學習c語言是學習如何編寫程序,而數據結構可以幫助我們如何簡潔高效的編寫程序,那如何提升數據結構體的演算法能力呢?

當我們遇到一個實際的問題,需要寫程序去解決,我們需要解決的是兩方面的問題,一是如何表達數據之間的邏輯規律及如何將數據存儲到計算機中,二是採用什麼方法來解決問題。這兩個方面可以直接概括為:

數據結構:也就是數據之間的關系

演算法:解決問題的方法

由此可見,如何提升數據結構的演算法能力,其實就是如何更好的培養自己去解決問題能力的同時,採取最合理的方法。

當我們遇到一個演算法問題,我覺得解決問題所需要的技能可以大致分為以下幾個方面:

1.數據結構方面的基礎理論知識

2.演算法的知識

3.數據結構和演算法知識的應用

第一第二可以說是我們提升自己演算法能力的「基元」,也可以說它就相當於人體的基本單位-細胞。只有將這些基本的理論用法掌握清楚,我們才能去應用。簡單來說,你不理解數組、鏈表、樹、圖分別的特點及使用方法,當你遇到問題,最適合的方式就沒有辦法進行比較選擇。

第三點就需要涉及到如何將數據結構和演算法應用於特定的場景,有一些特點的數據之間關系的表示,它就僅僅只使用於特定的方式進行表示,特定的演算法結合使用實現數據之間的運算。例如:學校運動會,學生參加運動會項目,同一時間只能進行一項運動,但是我們學校每個項目時間安排表是已經確定的,且同一時間不可能只進行一個運動項目,那這種情況的話特定的情況下,我們需要採用的就是圖形結構,既然邏輯存儲結構已經確定,用什麼樣的演算法實現就可以清晰明了了。

針對於第三點,在第一和第二點的基礎上,更多的就是要學會處於不同的場景,抓住數據之間關系的本質,當然這個離不開對基礎知識的熟練掌握。

提升這三個方面的小建議:

1.數據結構的學習之前,我覺得我們應該首先將c語言的基礎打扎實。很多人在編程過程出現很多bug,不知道怎麼入手解決,其實很多時候c語言夠扎實你會發現很多問題都和c語言基礎中的知識點有關。

2.對於數據結構的學習,建議大家分版塊學習練習,總結使用區別、演算法特點。

3.所有的學習都離不開重復的練習和大量的使用。

4.學會有意識的去培養自己思考問題的邏輯思維、遇到問題的分析能力。

以上就是關於如何提升數據結構的演算法能力的一些小建議,希望對大家有所幫助。私信【 嵌入式 】領取學習視頻。

㈡ 數據挖掘的十大經典演算法,總算是講清楚了,想提升自己的趕快收藏

一個優秀的數據分析師,除了要掌握基本的統計學、數據分析思維、數據分析工具之外,還需要掌握基本的數據挖掘思想,幫助我們挖掘出有價值的數據,這也是數據分析專家和一般數據分析師的差距所在。

國際權威的學術組織the IEEE International Conference on Data Mining (ICDM) 評選出了數據挖掘領域的十大經典演算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART.

不僅僅是選中的十大演算法,其實參加評選的18種演算法,實際上隨便拿出一種來都可以稱得上是經典演算法,它們在數據挖掘領域都產生了極為深遠的影響。今天主要分享其中10種經典演算法,內容較干,建議收藏備用學習。

1. C4.5

C4.5演算法是機器學習演算法中的一種分類決策樹演算法,其核心演算法是ID3演算法. C4.5演算法繼承了ID3演算法的優點,並在以下幾方面對ID3演算法進行了改進:

1) 用信息增益率來選擇屬性,克服了用信息增益選擇屬性時偏向選擇取值多的屬性的不足;

2) 在樹構造過程中進行剪枝;

3) 能夠完成對連續屬性的離散化處理;

4) 能夠對不完整數據進行處理。

C4.5演算法有如下優點:產生的分類規則易於理解,准確率較高。其缺點是:在構造樹的過程中,需要對數據集進行多次的順序掃描和排序,因而導致演算法的低效(相對的CART演算法只需要掃描兩次數據集,以下僅為決策樹優缺點)。

2. The k-means algorithm 即K-Means演算法

k-means algorithm演算法是一個聚類演算法,把n的對象根據他們的屬性分為k個分割,k < n。它與處理混合正態分布的最大期望演算法很相似,因為他們都試圖找到數據中自然聚類的中心。它假設對象屬性來自於空間向量,並且目標是使各個群組內部的均 方誤差總和最小。

3. Support vector machines

支持向量機,英文為Support Vector Machine,簡稱SV機(論文中一般簡稱SVM)。它是一種監督式學習的方法,它廣泛的應用於統計分類以及回歸分析中。支持向量機將向量映射到一個更 高維的空間里,在這個空間里建立有一個最大間隔超平面。在分開數據的超平面的兩邊建有兩個互相平行的超平面。分隔超平面使兩個平行超平面的距離最大化。假定平行超平面間的距離或差距越大,分類器的總誤差越小。一個極好的指南是C.J.C Burges的《模式識別支持向量機指南》。van der Walt 和 Barnard 將支持向量機和其他分類器進行了比較。

4. The Apriori algorithm

Apriori演算法是一種最有影響的挖掘布爾關聯規則頻繁項集的演算法。其核心是基於兩階段頻集思想的遞推演算法。該關聯規則在分類上屬於單維、單層、布爾關聯規則。在這里,所有支持度大於最小支持度的項集稱為頻繁項集,簡稱頻集。

5. 最大期望(EM)演算法

在統計計算中,最大期望(EM,Expectation–Maximization)演算法是在概率(probabilistic)模型中尋找參數最大似然 估計的演算法,其中概率模型依賴於無法觀測的隱藏變數(Latent Variabl)。最大期望經常用在機器學習和計算機視覺的數據集聚(Data Clustering)領域。

6. PageRank

PageRank是Google演算法的重要內容。2001年9月被授予美國專利,專利人是Google創始人之一拉里·佩奇(Larry Page)。因此,PageRank里的page不是指網頁,而是指佩奇,即這個等級方法是以佩奇來命名的。

PageRank根據網站的外部鏈接和內部鏈接的數量和質量倆衡量網站的價值。PageRank背後的概念是,每個到頁面的鏈接都是對該頁面的一次投票, 被鏈接的越多,就意味著被其他網站投票越多。這個就是所謂的「鏈接流行度」——衡量多少人願意將他們的網站和你的網站掛鉤。PageRank這個概念引自 學術中一篇論文的被引述的頻度——即被別人引述的次數越多,一般判斷這篇論文的權威性就越高。

7. AdaBoost

Adaboost是一種迭代演算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然後把這些弱分類器集合起來,構成一個更強的最終分類器 (強分類器)。其演算法本身是通過改變數據分布來實現的,它根據每次訓練集之中每個樣本的分類是否正確,以及上次的總體分類的准確率,來確定每個樣本的權 值。將修改過權值的新數據集送給下層分類器進行訓練,最後將每次訓練得到的分類器最後融合起來,作為最後的決策分類器。

8. kNN: k-nearest neighbor classification

K最近鄰(k-Nearest Neighbor,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。

9. Naive Bayes

在眾多的分類模型中,應用最為廣泛的兩種分類模型是決策樹模型(Decision Tree Model)和樸素貝葉斯模型(Naive Bayesian Model,NBC)。 樸素貝葉斯模型發源於古典數學理論,有著堅實的數學基礎,以及穩定的分類效率。

同時,NBC模型所需估計的參數很少,對缺失數據不太敏感,演算法也比較簡單。理論上,NBC模型與其他分類方法相比具有最小的誤差率。 但是實際上並非總是如此,這是因為NBC模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,這給NBC模型的正確分類帶來了一定影響。在屬 性個數比較多或者屬性之間相關性較大時,NBC模型的分類效率比不上決策樹模型。而在屬性相關性較小時,NBC模型的性能最為良好。

10. CART: 分類與回歸樹

CART, Classification and Regression Trees。 在分類樹下面有兩個關鍵的思想。第一個是關於遞歸地劃分自變數空間的想法(二元切分法);第二個想法是用驗證數據進行剪枝(預剪枝、後剪枝)。在回歸樹的基礎上的模型樹構建難度可能增加了,但同時其分類效果也有提升。

參考書籍:《機器學習實戰》

程序員如何提升演算法思維

持續學習,持續開發,是目前主流IT業界程序員的一個生活常規,在現代技術迭代速度非常快的情況下型罩,只有不斷保持自我學習和探索才不會與時代脫節。無論是專業的IT從業者還是IT小白,都需要培養自己的算卜兄鬧法思維。南邵電腦培訓發現擁有良好演算法思維後的直接好處有:更高的面試成功機會,和更快的日常問題處理能力。

何為演算法思維,並不是對一些已經設計好的優秀代碼的反復背誦和背板,而是自己對於問題的抽象能力的練習,即從抽象問題到實際進行編碼或者設計程序解決問題的一個能力,如果單純對於一些演算法進行背誦的話,我們的思維能力不會得到提升,最多就是熟練的碼農而已。所以,當看到別人設計的優秀演算法後,我們一定要探尋演算法背後那「曲徑通幽」的思維之路。只有經歷了思維之路的磨難,才能永遠佔有一個演算法,並有可能舉一反三,或者是設計一個巧妙演算法。


個人認為,對於提升演算法思維的方法,首先我們需要深入思考各種苦惱的問題,例如:


假設我喜歡租車出行,那麼對於某一個地方的停車點一般在什麼時候有車的機率最大?有車的概率是否與天氣,溫度等因素有關?


我希望可以在回家之前通過手機APP讓家裡的空調提前工作起來,但塵飢是我非常Geek,不想使用現成的產品而想自己實現一個,和同學吹牛的時候可以更加脫穎而出?


在明確了這些問題以後我們就可以開始思考如何嘗試寫一個小的程序來幫助自己解決,這個時候如果手頭有一個習慣的語言就非常合適了(比如我個人就喜歡Python,有很多庫可以使用,而且入門非常容易),如果沒有的話,可以去看看各個語言合適的場景,不過對於爬蟲、數據分析相關個人認為更加貼合日常生活的項目來看,還是考慮直接從Python3起步比較好,後期如果想用樹莓派做點智能家居相關的項目的話Python也是非常合適的。


對於Python的學習,目前有很多非常成熟的課程,可以覆蓋各個不同的能力范圍,這里著重推薦Coursera的視頻課程,配合本地IPython或者LeetCodePlayground一起調試和練習,可以獲得很好的效果。


㈣ GBDT —— 梯度提升決策樹

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹演算法,該演算法由多棵決策樹組成,所有樹的結論累加起來做最終答案。它在被提出之初就和SVM一起被認為是泛化能力較強的演算法。
GBDT中的樹是回歸樹(不是分類樹),GBDT用來做回歸預測,調整後也可以用於分類。
GBDT主要由三個概念組成:Regression Decistion Tree(即DT),Gradient Boosting(即GB),Shrinkage (演算法的一個重要演進分枝,目前大部分源碼都按該版本實現)。搞定這三個概念後就能明白GBDT是如何工作的。

提起決策樹(DT, Decision Tree) 絕大部分人首先想到的就是C4.5分類決策樹。但如果一開始就把GBDT中的樹想成分類樹,那就錯了。千萬不要以為GBDT是很多棵分類樹。決策樹分為兩大類,回歸樹和分類樹。前者用於預測實數值,如明天的溫度、用戶的年齡、網頁的相關程度;後者用於分類標簽值,如晴天/陰天/霧/雨、用戶性別、網頁是否是垃圾頁面。這里要強調的是,前者的結果加減是有意義的,如10歲+5歲-3歲=12歲,後者則無意義,如男+男+女=到底是男是女?GBDT的核心在於累加所有樹的結果作為最終結果,就像前面對年齡的累加(-3是加負3),而分類樹的結果顯然是沒辦法累加的,所以 GBDT中的樹都是回歸樹,不是分類樹 ,這點對理解GBDT相當重要(盡管GBDT調整後也可用於分類但不代表GBDT的樹是分類樹)。

回歸樹總體流程類似於分類樹,區別在於,回歸樹的每一個節點都會得一個預測值,以年齡為例,該預測值等於屬於這個節點的所有人年齡的平均值。分枝時窮舉每一個feature的每個閾值找最好的分割點,但衡量最好的標准不再是最大熵,而是最小化平方誤差。也就是被預測出錯的人數越多,錯的越離譜,平方誤差就越大,通過最小化平方誤差能夠找到最可靠的分枝依據。分枝直到每個葉子節點上人的年齡都唯一或者達到預設的終止條件(如葉子個數上限), 若最終葉子節點上人的年齡不唯一,則以該節點上所有人的平均年齡做為該葉子節點的預測年齡。

回歸樹演算法如下圖(截圖來自《統計學習方法》5.5.1 CART生成):

梯度提升(Gradient boosting)是一種用於回歸、分類和排序任務的機器學習技術 [1] ,屬於Boosting演算法族的一部分。Boosting是一族可將弱學習器提升為強學習器的演算法,屬於集成學習(ensemble learning)的范疇。Boosting方法基於這樣一種思想:對於一個復雜任務來說,將多個專家的判斷進行適當的綜合所得出的判斷,要比其中任何一個專家單獨的判斷要好。通俗地說,就是「三個臭皮匠頂個諸葛亮」的道理。梯度提升同其他boosting方法一樣,通過集成(ensemble)多個弱學習器,通常是決策樹,來構建最終的預測模型。

Boosting、bagging和stacking是集成學習的三種主要方法。不同於bagging方法,boosting方法通過分步迭代(stage-wise)的方式來構建模型,在迭代的每一步構建的弱學習器都是為了彌補已有模型的不足。Boosting族演算法的著名代表是AdaBoost,AdaBoost演算法通過給已有模型預測錯誤的樣本更高的權重,使得先前的學習器做錯的訓練樣本在後續受到更多的關注的方式來彌補已有模型的不足。與AdaBoost演算法不同,梯度提升方法在迭代的每一步構建一個能夠沿著梯度最陡的方向降低損失(steepest-descent)的學習器來彌補已有模型的不足。經典的AdaBoost演算法只能處理採用指數損失函數的二分類學習任務 [2] ,而梯度提升方法通過設置不同的可微損失函數可以處理各類學習任務(多分類、回歸、Ranking等),應用范圍大大擴展。另一方面,AdaBoost演算法對異常點(outlier)比較敏感,而梯度提升演算法通過引入bagging思想、加入正則項等方法能夠有效地抵禦訓練數據中的噪音,具有更好的健壯性。這也是為什麼梯度提升演算法(尤其是採用決策樹作為弱學習器的GBDT演算法)如此流行的原因,

提升樹是迭代多棵回歸樹來共同決策。當採用平方誤差損失函數時,每一棵回歸樹學習的是之前所有樹的結論和殘差,擬合得到一個當前的殘差回歸樹,殘差的意義如公式:殘差 = 真實值 - 預測值 。提升樹即是整個迭代過程生成的回歸樹的累加。 GBDT的核心就在於,每一棵樹學的是之前所有樹結論和的殘差,這個殘差就是一個加預測值後能得真實值的累加量。

提升樹利用 加法模型和前向分步演算法 實現學習的優化過程。當損失函數時平方損失和指數損失函數時,每一步的優化很簡單,如平方損失函數學習殘差回歸樹。

提升方法其實是一個比adaboost概念更大的演算法,因為adaboost可以表示為boosting的前向分布演算法(Forward stagewise additive modeling)的一個特例,boosting最終可以表示為:

其中的w是權重,Φ是弱分類器(回歸器)的集合,其實就是一個加法模型(即基函數的線性組合)

前向分布演算法 實際上是一個貪心的演算法,也就是在每一步求解弱分類器Φ(m)和其參數w(m)的時候不去修改之前已經求好的分類器和參數:

OK,這也就是提升方法(之前向分布演算法)的大致結構了,可以看到其中存在變數的部分其實就是極小化損失函數 這關鍵的一步了,如何選擇損失函數決定了演算法的最終效果(名字)……這一步你可以看出演算法的「趨勢」,以後再單獨把「趨勢」拿出來說吧,因為我感覺理解演算法的關鍵之一就是理解演算法公式的「趨勢」

不同的損失函數和極小化損失函數方法決定了boosting的最終效果,我們現在來說幾個常見的boosting:

廣義上來講,所謂的Gradient Boosting 其實就是在更新的時候選擇梯度下降的方向來保證最後的結果最好,一些書上講的「殘差」 方法其實就是L2Boosting吧,因為它所定義的殘差其實就是L2Boosting的Derivative,接下來我們著重講一下弱回歸器(不知道叫啥了,自己編的)是決策樹的情況,也就是GBDT。

GBDT演算法可以看成是由K棵樹組成的加法模型:

解這一優化問題,可以用前向分布演算法(forward stagewise algorithm)。因為學習的是加法模型,如果能夠從前往後,每一步只學習一個基函數及其系數(結構),逐步逼近優化目標函數,那麼就可以簡化復雜度。這一學習過程稱之為Boosting。具體地,我們從一個常量預測開始,每次學習一個新的函數,過程如下:

舉個例子,參考自一篇博客, 該博客舉出的例子較直觀地展現出多棵決策樹線性求和過程以及殘差的意義。
還是年齡預測,簡單起見訓練集只有4個人,A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業生和工作兩年的員工。如果是用一棵傳統的回歸決策樹來訓練,會得到如下圖1所示結果:

現在我們使用GBDT來做這件事,由於數據太少,我們限定葉子節點做多有兩個,即每棵樹都只有一個分枝,並且限定只學兩棵樹。我們會得到如下圖2所示結果:

在第一棵樹分枝和圖1一樣,由於A,B年齡較為相近,C,D年齡較為相近,他們被分為兩撥,每撥用平均年齡作為預測值。此時計算殘差 (殘差的意思就是: A的預測值 + A的殘差 = A的實際值) ,所以A的殘差就是16-15=1(注意,A的預測值是指前面所有樹累加的和,這里前面只有一棵樹所以直接是15,如果還有樹則需要都累加起來作為A的預測值)。進而得到A,B,C,D的殘差分別為-1,1,-1,1。然後我們拿殘差替代A,B,C,D的原值,到第二棵樹去學習,如果我們的預測值和它們的殘差相等,則只需把第二棵樹的結論累加到第一棵樹上就能得到真實年齡了。這里的數據顯然是我可以做的,第二棵樹只有兩個值1和-1,直接分成兩個節點。此時所有人的殘差都是0,即每個人都得到了真實的預測值。

換句話說,現在A,B,C,D的預測值都和真實年齡一致了。Perfect!:
A: 14歲高一學生,購物較少,經常問學長問題;預測年齡A = 15 – 1 = 14
B: 16歲高三學生;購物較少,經常被學弟問問題;預測年齡B = 15 + 1 = 16
C: 24歲應屆畢業生;購物較多,經常問師兄問題;預測年齡C = 25 – 1 = 24
D: 26歲工作兩年員工;購物較多,經常被師弟問問題;預測年齡D = 25 + 1 = 26

那麼哪裡體現了Gradient呢?其實回到第一棵樹結束時想一想,無論此時的cost function是什麼,是均方差還是均差,只要它以誤差作為衡量標准,殘差向量(-1, 1, -1, 1)都是它的全局最優方向,這就是Gradient。

講到這里我們已經把GBDT最核心的概念、運算過程講完了!沒錯就是這么簡單。

該例子很直觀的能看到,預測值等於所有樹值得累加,如A的預測值 = 樹1左節點 值 15 + 樹2左節點 -1 = 14。
因此,給定當前模型 fm-1(x),只需要簡單的擬合當前模型的殘差。現將回歸問題的提升樹演算法敘述如下:

答案是過擬合。過擬合是指為了讓訓練集精度更高,學到了很多」僅在訓練集上成立的規律「,導致換一個數據集當前規律就不適用了。其實只要允許一棵樹的葉子節點足夠多,訓練集總是能訓練到100%准確率的(大不了最後一個葉子上只有一個instance)。在訓練精度和實際精度(或測試精度)之間,後者才是我們想要真正得到的。
我們發現圖1為了達到100%精度使用了3個feature(上網時長、時段、網購金額),其中分枝「上網時長>1.1h」 很顯然已經過擬合了,這個數據集上A,B也許恰好A每天上網1.09h, B上網1.05小時,但用上網時間是不是>1.1小時來判斷所有人的年齡很顯然是有悖常識的;
相對來說圖2的boosting雖然用了兩棵樹 ,但其實只用了2個feature就搞定了,後一個feature是問答比例,顯然圖2的依據更靠譜。(當然,這里是LZ故意做的數據,所以才能靠譜得如此狗血。實際中靠譜不靠譜總是相對的) Boosting的最大好處在於,每一步的殘差計算其實變相地增大了分錯instance的權重,而已經分對的instance則都趨向於0。這樣後面的樹就能越來越專注那些前面被分錯的instance。就像我們做互聯網,總是先解決60%用戶的需求湊合著,再解決35%用戶的需求,最後才關注那5%人的需求,這樣就能逐漸把產品做好,因為不同類型用戶需求可能完全不同,需要分別獨立分析。如果反過來做,或者剛上來就一定要做到盡善盡美,往往最終會竹籃打水一場空。

Shrinkage(縮減)的思想認為,每次走一小步逐漸逼近結果的效果,要比每次邁一大步很快逼近結果的方式更容易避免過擬合。即它不完全信任每一個棵殘差樹,它認為每棵樹只學到了真理的一小部分,累加的時候只累加一小部分,通過多學幾棵樹彌補不足。用方程來看更清晰,即
沒用Shrinkage時:(yi表示第i棵樹上y的預測值, y(1~i)表示前i棵樹y的綜合預測值)
y(i+1) = 殘差(y1~yi), 其中: 殘差(y1~yi) = y真實值 - y(1 ~ i)
y(1 ~ i) = SUM(y1, ..., yi)
Shrinkage不改變第一個方程,只把第二個方程改為:
y(1 ~ i) = y(1 ~ i-1) + step * yi

即Shrinkage仍然以殘差作為學習目標,但對於殘差學習出來的結果,只累加一小部分(step 殘差)逐步逼近目標,step一般都比較小,如0.01~0.001(注意該step非gradient的step),導致各個樹的殘差是漸變的而不是陡變的。直覺上這也很好理解,不像直接用殘差一步修復誤差,而是只修復一點點,其實就是把大步切成了很多小步。 本質上,Shrinkage為每棵樹設置了一個weight,累加時要乘以這個weight,但和Gradient並沒有關系 *。 這個weight就是step。就像Adaboost一樣,Shrinkage能減少過擬合發生也是經驗證明的,目前還沒有看到從理論的證明。

該版本GBDT幾乎可用於所有回歸問題(線性/非線性),相對logistic regression僅能用於線性回歸,GBDT的適用面非常廣。亦可用於二分類問題(設定閾值,大於閾值為正例,反之為負例)。

參考資料:
http://blog.csdn.net/w28971023/article/details/8240756
http://blog.csdn.net/dark_scope/article/details/24863289
https://www.jianshu.com/p/005a4e6ac775
https://www.zybuluo.com/yxd/note/611571

㈤ 常見的提高消隱演算法效率的方法有哪些

提高消隱演算法效率的常見方法(利用連貫性,將透視投影轉換成平行投影,包圍盒技術,背面剔除,空間分割技術,物體分層表示)
選擇好的演算法, 小心地實現, 同時確定程序不做額外的事。例如, 即使世界上最優化的字元復制循環也比不上不用復制。
當擔心效率時, 要保持幾樣事情在視野中, 這很重要。首先, 雖然效率是個非常流行的話題, 它並不總是象人們想的那樣重要。大多數程序的大多數代碼並不是時間緊要的。當代碼不是時間緊要時, 通常把代碼寫得清楚和可移植比達到最大效率更重要。記住, 電腦運行得非常非常快, 那些看起來 「低效率」 的代碼, 也許可以編譯得比較有效率, 而運行起來也沒有明顯的延時。
試圖預知程序的 「熱點」 是個非常困難的事。當要關心效率時, 使用 profiling軟體來確定程序中需要得到關注的地方。通常, 實際計算時間都被外圍任務佔用了 (例如 I/O 或內存的分配), 可以通過使用緩沖和超高速緩存來提高速度。
即使對於時間緊要的代碼, 最無效的優化技巧是忙亂於代碼細節。許多常被建議的 「有效的代碼技巧」, 即使是很簡單的編譯器也會自動完成 (例如, 用移位運算符代替二的冪次方乘)。非常多的手動優化有可能是代碼變得笨重而使效率反而低下了, 同時幾乎不可移植。例如, 也許可以在某台機器上提了速, 但在另一台機器上去變慢了。任何情況下, 修整代碼通常最多得到線性信能提高; 更好的演算法可以得到更好的回報。

㈥ 搞編程的我是個演算法渣,怎麼樣能很快的提升演算法水平有什麼必要的或者非常基礎的演算法需要掌握

演算法的實現需要你對數據結構有充分的理解,我個人覺得數據結構是演算法的基礎,至少我是先熟悉數據結構再弄演算法的,這樣接受起來比較快。所以建議你
1:先花些時間掌握數據結構知識,比如數據結構基本類型;線性表、樹、圖、集合的存儲表示以及他們的應用,而要想熟練運用這些線性表、樹、圖、集合,那麼又必須要非常熟練棧和隊列,因為棧和隊列是必不可少的,如果你非常熟練運用棧和隊列,那麼你肯定能輕松搞定牽涉到線性表、樹等這些應用的。
2:掌握基本的查找演算法和排序演算法;因為有了上述數據結構的鋪墊,也較容易接受查找和排序演算法在計算機內部的組織形式,對於運用計算機思想思考問題有很大的幫助。
3:學習常用的演算法思想,如分治、貪心、動態規劃、回溯等等。學習之後自己動手找一些題目敲敲代碼,剛開始可以按照答案敲,慢慢要丟開答案自己來組織思路了。
4:要熟悉分析演算法的復雜度,因為接著要開始思考代價問題了,包括時間和空間的開銷。
其實用誰的書都無所謂,只要內容齊全了,而你自己閱讀起來接受得更好就用誰的。如果還有時間,推薦你看看朱東生趙建利等的《新編數據結構演算法 考研指導》(當時我考研用來輔助看的,裡面講解的遞歸與非遞歸之間的轉換非常好)。
5:如果有興趣可以看看《編程珠璣》和《編程之美》,有些企業招聘時會從中挑個別題目出題。
總之,我覺得數據結構是基礎,演算法是靈魂。多思考,多運用就能熟能生巧了。工科類的不多動動手那些知識是很容易生疏的。
以上觀點僅供參考,純屬個人觀點。

閱讀全文

與有哪些提升演算法相關的資料

熱點內容
怎麼買賣副圖源碼 瀏覽:660
廣東農信app怎麼更改預留手機號碼 瀏覽:775
嵌套頁面php 瀏覽:566
安卓手機怎麼調到微信聊天模式 瀏覽:857
java博客開源系統 瀏覽:719
男人之間的加密對話日語 瀏覽:359
怎麼連遠程連接伺服器 瀏覽:11
安卓二手手機該如何檢測 瀏覽:213
微信可以共享圖片文件夾嗎 瀏覽:80
聯通wifi加密碼 瀏覽:643
錄屏文件夾小米 瀏覽:548
車上的app怎麼重設 瀏覽:24
指定文件夾屬性 瀏覽:131
linuxphp編程 瀏覽:337
以下不正確的是雲伺服器 瀏覽:909
琉璃神社壓縮密碼 瀏覽:715
大一學生解壓視頻 瀏覽:376
單位電腦e盤加密輸入正確密碼 瀏覽:873
phpfileupload 瀏覽:634
刑拘程序員 瀏覽:617