常見的數據結構
鏈表
LinkedHashSet LinkedList 底層數據結構由鏈表和哈希表組成。
數據的添加和刪除都較爲方便,就是訪問比較耗費時間。程序員
數組
ArrayList 訪問數據十分簡單,而添加和刪除數據比較耗工夫web
堆
- 堆是一種圖的樹形結構,被用於實現「優先隊列",優先隊列是一種數據結構,能夠自由添加數據,但取出數據時要從最小值開始按順序取出
- 堆的特色:
①堆中的每一個結點最多有兩個子結點
②子結點一定大於父結點
③把新數據放在最下面一行靠左的位置。當最下面一行裏沒有多餘空間時,就再往下另起一行,把數據加在這一行的最左端
④若是子結點的數字小於父結點的,就將父結點與其左右兩個子結點中較小的一個進行交換
堆中最頂端的數據始終最小,因此不管數據量有多少,取出最小值的時間複雜度都爲O(1)
可知樹的高度爲log2n,那麼重構樹的時間複雜度便爲O(logn)
棧 (LIFO)
略正則表達式
隊列 (FIFO)
略算法
哈希表 HashSet
- TreeSet底層數據結構是紅黑樹
- 哈希函數(Hash)計算key,哈希值除以數組的長度5,求得其他數。這個餘數就是key的編號即位置
- 若是發生哈希衝突,就使用鏈表進行存儲(鏈地址法)給數組設定合適的空間很是重要
除了鏈地址法之外,還有幾種解決衝突的方法。其中,應用較爲普遍的是「開放地址法」。這種方法是指當衝突發生時,馬上計算出一個候補地址(數組上的位置)並將數據存進去。若是仍然有衝突,便繼續計算下一個候補地址,直到有空地址爲止。能夠經過屢次使用哈希函數或「線性探測法」等方法計算候補地址。
二叉樹
- 特色:
①第一個是每一個結點的值均大於其左子樹上任意一個結點的值
②是每一個結點的值均小於其右子樹上任意一個結點的值
③二叉查找樹的最小結點要從頂端開始,往其左下的末端尋找。此處最小值爲3。
④二叉查找樹的最大結點要從頂端開始,往其右下的末端尋找
添加數據的時候 與頂端數據比較 若是比他小就往左移,左邊沒有節點了就把插入的數據做爲新節點添加到左下方,大於他則往右移(左小右大)
刪除數據的時候 若是節點沒有子節點 直接刪 若是有一個 刪了後子節點補上,若是有兩個,刪掉後從左子樹中中找最大的補上數組
比較的次數取決於樹的高度。因此若是結點數爲n,並且樹的形狀又較爲均衡的話,比較大小和移動的次數最多就是log2n。所以,時間複雜度爲O(logn)。可是,若是樹的形狀朝單側縱向延伸,樹就會變得很高,此時時間複雜度也就變成了O(n)。安全
常見的算法整理
排序
- 冒泡排序
冒泡排序就是重複「從序列右邊開始比較相鄰兩個數字的大小,再根據結果交換兩個數字的位置」這一操做的算法。在這個過程當中,數字會像泡泡同樣,慢慢從右往左「浮」到序列的頂端,因此這個算法才被稱爲「冒泡排序」
冒泡排序的時間複雜度爲O(n2) - 選擇排序
選擇排序就是重複「從待排序的數據中尋找最小值,將其與序列最左邊的數字進行交換」這一操做的算法。在序列中尋找最小值時使用的是線性查找
每輪中交換數字的次數最多爲1次。若是輸入數據就是按從小到大的順序排列的,便不須要進行任何交換。選擇排序的時間複雜度也和冒泡排序的同樣,都爲O(n2)。 - 插入排序
插入排序的思路就是從右側的未排序區域內取出一個數據,而後將它插入到已排序區域內合適的位置上
時間複雜度和冒泡排序的同樣,都爲O(n2)。 - 堆排序
首先堆中存儲全部的數據,並按降序來構建堆,而後從降序排列的堆中取出數據時會從最大的數據開始取,因此將取出的數據反序輸出,排序就完成了。
堆排序的時間複雜度爲O(nlogn)。 - 歸併排序
歸併排序算法會把序列分紅長度相同的兩個子序列,當沒法繼續往下分時(也就是每一個子序列中只有一個數據時),就對子序列進行歸併。歸併指的是把兩個排好序的子序列合併成一個有序序列。該操做會一直重複執行,直到全部子序列都歸併爲一個總體爲止。
運行時間複雜度爲O(nlogn) - 快速排序
快速排序算法首先會在序列中隨機選擇一個基準值(pivot),而後將除了基準值之外的數分爲「比基準值小的數」和「比基準值大的數」這兩個類別。解決子問題的時候會再次使用快速排序,甚至在這個快速排序裏仍然要使用快速排序。只有在子問題裏只剩一個數字的時候,排序纔算完成。
總體的時間複雜度爲O(nlogn)。
數組查找
- 線性查找
線性查找須要從頭開始不斷地按順序檢查數據,所以在數據量大且目標數據靠後,或者目標數據不存在時,比較的次數就會更多,也更爲耗時。若數據量爲n,線性查找的時間複雜度便爲O(n)。 - 二分查找(略)
圖的搜索
- 廣度優先搜索
廣度優先搜索是一種對圖進行搜索的算法。假設咱們一開始位於某個頂點(即起點),此時並不知道圖的總體結構,而咱們的目的是從起點開始順着邊搜索,直到到達指定頂點(即終點)。在此過程當中每走到一個頂點,就會判斷一次它是否爲終點。廣度優先搜索會優先從離起點近的頂點開始搜索 - 深度優先搜索
深度優先搜索和廣度優先搜索同樣,都是對圖進行搜索的算法,目的也都是從起點開始搜索直到到達指定頂點(終點)。深度優先搜索會沿着一條路徑不斷往下搜索直到不能再繼續爲止,而後再折返,開始搜索下一條候補路徑。 - 貝爾曼-福特算法(略)
貝爾曼-福特(Bellman-Ford)算法是一種在圖中求解最短路徑問題的算法 - 狄克斯特拉算法(略)
- A*算法(略)
安全算法
- 共享密鑰加密
- 公開密鑰加密
- 混合加密
- 迪菲-赫爾曼交換
其餘算法
- k-means 算法
- 歐幾里得算法
- 素性測試
- 網頁排名
- 漢諾塔
【拓展】數據結構
- 圖的表示:鄰接矩陣和鄰接表
遍歷算法:深度搜索和廣度搜索(必學)
最短路徑算法:Floyd,Dijkstra(必學)
最小生成樹算法:Prim,Kruskal(必學)
實際經常使用算法:關鍵路徑、拓撲排序(原理與應用)
二分圖匹配:配對、匈牙利算法(原理與應用)
拓展:中心性算法、社區發現算法(原理與應用)
2.圖仍是比較難的,不過我以爲圖涉及到的挺多算法都是挺實用的,例如最短路徑的計算等,圖相關的,我這裏仍是建議看書的,能夠看《算法第四版》。svg
三、搜索與回溯算法函數
貪心算法(必學) 啓發式搜索算法:A*尋路算法(瞭解) 地圖着色算法、N 皇后問題、最優加工順序 旅行商問題
這方便的只是都是一些算法相關的,我以爲若是能夠,都學一下。像貪心算法的思想,就必須學的了。建議經過刷題來學習,leetcode 直接專題刷。學習
四、動態規劃
樹形DP:01揹包問題 線性DP:最長公共子序列、最長公共子串 區間DP:矩陣最大值(和以及積) 數位DP:數字遊戲 狀態壓縮DP:旅行商
我以爲動態規劃是最難的一個算法思想了,記得當初第一次接觸動態規劃的時候,是看01揹包問題的,看了很久都不大懂,懵懵懂懂,後面懂了基本思想,但是作題下不了手,可是看的懂答案。一氣之下,再leetcdoe專題連續刷了幾十道,才掌握了動態規劃的套路,也有了本身的一套模板。不過說實話,動態規劃,是考的真他媽多,學習算法、刷題,必定要掌握。這裏建議先了解動態規劃是什麼,以後 leetcode 專題刷,反正就通常上面這幾種題型。
五、字符匹配算法
正則表達式 模式匹配:KMP、Boyer-Moore
六、流相關算法
最大流:最短增廣路、Dinic 算法 最大流最小割:最大收益問題、方格取數問題 最小費用最大流:最小費用路、消遣
本文分享 CSDN - 愛吃早餐的程序員。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。