數據結構和算法總覽

數據結構和算法總覽html

一。大部分問題抽象其數據類型,可分爲三種。程序員

抽象出3種數據模型,並研究這3種模型的存儲及經常使用操做,對於解決問題有很大幫助。並且有個重要一點就是讓程序員交流起來更順暢,代碼都是推薦的那個套路,減低bug和提升效率。算法

1.線性關係(可表示1對1關係模型, 自然存在於數據自己就是一個挨一個這種類型。如一個班學生按學號排位)
數組

2.樹型關係,常見二叉平衡二叉(表示1對多關係,自然存在於樹型層級的關係,或適合對半分的狀況,如學生會分級管理, 地區分級,公司分級,成績分級)
數據結構

3.圖關係(表示多對多關係,自然存在於相對獨立,分散的關係,如學生們之間的關係,城市間關係,)
數據結構和算法

邏輯上模型有3種,數據的存儲通常是3種,順序存儲和鏈表存儲,還有一個hash  .ide

在隊列邏輯數據結構中,通常隊列和環形緩衝這2中隊列,體現了對存儲天生的需求不一樣,很是經典,通常隊列,選用鏈表,方便刪除和添加,而環形隊列,由於固定大小選用順序存儲,方便讀起,優化

 

二。大部分問題概括其解決思路,大體分爲分治,貪心,動態,回溯等思路,即算法。spa

解決問題,也就是算法實現的過程,須要數據結構來實現。兩者是一塊兒產生的。htm

面對一個問題如何分析?本身總結最靈魂的一句話就是如何找出一樣形式和性質的小問題,分治,貪心,動態,無不包含此目標。

整體思路,先把問題極簡化,再慢慢擴大規模,試圖發現規律。大概知道規律後,先嚐試分治法,由於分治有遞歸好基友幫忙,好實現,又好理解。

還有一種就是每步都是最優解,指望最後是最優解,就是貪心。

 

若是一個問題很小,很簡單,那麼通常解決操做也會很簡單。也就沒有研究的價值,因此通常須要研究的是問題規模比較大,因此才須要研究。

那麼很天然,算法的目標就是發現規律,把大問題分解爲一樣形式和性質小問題,並組合起來。這種天然的思路就是分治

分治含有2個注意點:

1,divide和combine 分解和組合,   原問題分解爲同質的小問題的組合(X=X1+X2+a),X,沒法由具體的操做表示。 a,某個具體的操做

2.  comquer 解決  Xn=b+c   ,    最後問題減小規模到某個閥值,能夠表示爲某些具體操做。

因此最終問題都變成了具體操做的組合。 X=((b+c)+(b+c)+a)+........................

 

還有一種相對應的思路就是,每步都是最優解,並更新數據,讓問題性質不變,只是縮小問題規模,叫貪心這樣很大多是次優解,但某些問題也是最優解,需證實。

貪心有2種具體的操做

1.作完當前操做,刪除一個元素,並更新刪除這個元素所帶來的條件變化來減小規模,  如插入排序

2.作完當前操做,合併某些元素,並更新合併這個元素所帶來的條件變化來減小規模,  如和夫曼樹。

基本上就是分治和貪心這兩種思路,

 

動態:在這2個大思路下,針對某些特殊問題,如圖的最短路徑問題,須要考慮全部解,才能知道最優,可是每步都會從新計算,因此額外保存一些數據,避免重複計算。叫動態。很顯然,動態就是包含分治和貪心啊。

 

還有常見的算法處理的一類排列組合的問題。

還有一些必須窮舉的,在窮舉的基礎上進行優化,就是回溯思路

還有一寫問題和規模無關,好比隨機算法。

還有一種我把它叫作創造力算法,好比等差級數之和,按照常規遞歸思路或縮小問題規模,那麼就是通常的一個一個累加,可是若是有相應知識和創造力思惟,能吧一個大規模問題,忽然變成另一個規模很小的問題,如加法變成乘法。

那就牛了。想一想高斯,一年級就會乘法了,他不但牛在創造,也在於自學厲害,1年級自學了乘法,並會靈活運行。放到現實生活中,若是你發明了一個沒人知道的乘法,把它用在你們知道的加法上。你說牛不牛!!!!!!!!!牛到暴躁。

 

樹的最優二叉樹即哈夫曼樹(Huffman Tree)看起來很簡單,但沒想出來不要緊,霍夫曼本人是博士,並且是通過了一個學期才完成,並且還看了Shannon-Fano,及次優Shannon-Fano的樹

 

算法總結:

1.分治

2.貪心

3.動態規劃

4.排列組合

5,深度優先和回溯

數據結構:

1.線性

2.1對多

3.多對多

 

 

值得複習的:

快排和歸併排序(線性結構數組+分治+遞歸)

二叉樹,以及平衡二叉樹(樹結構+遞歸)

最短距離(圖+動態)

切鋼條(圖+動態)

值得複習,但複雜點的:

kmp

rbt

堆排

相關文章
相關標籤/搜索