關於算法的代碼寫了一些在:https://gitee.com/yuan_yi_xiang/data_structure_algorithm歡迎指正java
數組、鏈表、棧、隊列git
冒泡排序o(n²)、插入排序o(n²)、選擇排序o(n²)redis
歸併排序和快速排序都是分治思想,時間複雜度都爲nlogn但快速排序的空間消耗較歸併排序少算法
若是是給大量數據進行排序,內存不夠用的時候能夠用數據結構
桶排序o(n):若是要排序的數據有 n 個,咱們把它們均勻地劃分到 m 個桶內,每一個桶裏就有 k=n/m 個元素。每一個桶內部使用快速排序,時間複雜度爲 O(k * logk)。m 個桶排序的時間複雜度就是 O(m * k * logk),由於 k=n/m,因此整個桶排序的時間複雜度就是 O(n*log(n/m))。當桶的個數 m 接近數據個數 n 時,log(n/m) 就是一個很是小的常量,這個時候桶排序的時間複雜度接近 O(n)。函數
可是要求劃分的桶也是有序的,若是劃分在一個桶內的數據較多沒法進入內存,能夠繼續劃分學習
計數排序:很像通排序,有大量的數據可是數據不少都是重複的,舉個例子咱們都經歷太高考,高考查分數系統你還記得嗎?咱們查分數的時候,系統會顯示咱們的成績以及所在省的排名。若是你所在的省有 50 萬考生,如何經過成績快速排序得出名次呢?考生的滿分是 900 分,最小是 0 分,這個數據的範圍很小,因此咱們能夠分紅 901 個桶,對應分數從 0 分到 900 分。根據考生的成績,咱們將這 50 萬考生劃分到這 901 個桶裏。桶內的數據都是分數相同的考生,因此並不須要再進行排序。咱們只須要依次掃描每一個桶,將桶內的考生依次輸出到一個數組中,就實現了 50 萬考生的排序。由於只涉及掃描遍歷操做,因此時間複雜度是 O(n)。優化
使用極客時間學習的引用。ui
將a數組中的找到最大的值,好比這裏是5,就創建大小爲6的數組保存0-5的個數,而後依次相加,就能獲得對應小於等於這個數總共有幾個數,就能得出數自己的下標。
基數排序:能夠分割出每一位來比較大小,位之間有遞進的關係,每一位的數據範圍不是太大,每一位能夠用線性排序算法來進行排序
歸併排序在最壞的狀況下時間複雜度是nlogn而快速排序最壞狀況下是n²,而快排使用較多,歸併排序的空間消耗大而且快速排序達到最糟糕狀況是由於分區點選的不合理,要使分區兩邊的數據數量差很少例如使用取中法根據數據數量,進行間隔取數比較取中間值。
在實現算法的時候咱們能夠進行結合,O(n²)在數據量較小的狀況下會比O(nlogn)的時間消耗更小,只是變化趨勢較大。能夠先判斷數量再判斷使用的算法
查找效率高,時間複雜度位o(logn),可是要求數據是有順序的,數據要使用順序表存儲,其餘的數據結構存儲會致使訪問的時間變慢,二分查找只能用在插入、刪除操做不頻繁,一次排序屢次查找的場景中。針對動態變化的數據集合,二分查找將再也不適用。數據量過小不適合,數據量太大會由於空間問題不適合
以空間換時間的思想,在單鏈表上構建多級索引提升了查找的效率,是一種動態的數據結構,支持快速的插入刪除和查找操做,時間複雜度都是logn,能夠經過改變索引的構建策略來平衡執行的效率和內存的消耗,redis中就是使用的跳錶來實現的
基礎:散列表用的就是數組支持按照下標隨機訪問的時候,時間複雜度是 O(1) 的特性。咱們經過散列函數把元素的鍵值映射爲下標,而後將數據存儲在數組中對應下標的位置。當咱們按照鍵值查詢元素時,咱們用一樣的散列函數,將鍵值轉化數組下標,從對應的數組下標的位置取數據。解決散列衝突的方法:一、開放尋址法二、連表法
後面會持續更新,能夠一塊兒學習。評論歡迎指正