資料結構與演算法至關重要。
計算機是乙個記憶體有限,計算能力有限的機器,如果每段時間處理的資料增加量大於每段時間能處理的資料量,時間越長,電腦執行會越來越慢直至宕機。
複雜度是衡量程式執行的效率的量度因素。執行**消耗計算時間和計算空間,衡量的是時間複雜度和空間複雜度。
複雜度是乙個關於輸入量n的函式。假如**的複雜度f(n)。o(n)表示的是複雜度與計算例項的個數n線性相關;o(logn)表示的是複雜度與計算例項的個數n對數相關。
對同乙個問題,採用不同的編碼方式,對空間和時間的消耗可能是不一樣的。
例1:要把一串陣列倒裝
方法一:用兩個陣列,使用兩個for迴圈,先給另乙個陣列初始化(陣列2複製陣列1)再賦值(倒裝),**的時間複雜度是o(n)+o(n)也就是o(n)
方法二:定義乙個變數,通過乙個for迴圈,從0遍歷到陣列1的一半,交換首尾對應的元素,最後再輸出陣列1。執行次數是陣列長度的一般,時間複雜度是o(n/2),也就是o(n)。
雖然時間複雜度一樣,但明顯第二個方法更快點。
例2:找出陣列**現次數最多的數字
採用雙層迴圈,第一層迴圈對陣列中的每個元素遍歷,第二層迴圈,對於每個元素計算出現的次數,通過當前元素次數和全域性最大次數變數的大小關係,持續儲存出現次數最多的那個元素及出現的次數。時間複雜度為o(n²)。
public void s1_4() ;
int val_max = -1;
int time_max = 0;
int time_tmp = 0;
for (int i = 0; i < a.length; i++)
if (time_tmp > time_max) }}
system.out.println(val_max);
}
結論:
如果某個計算任務需要處理10w條資料
如果是o(n²)的時間複雜度,那麼計算次數為100億次左右
如果是o(n)的時間複雜度,那麼計算次數是10w次左右
如果是o(logn)的時間複雜度,那麼計算次數為17次( log10000 = 16.61 )
降低空間複雜度是能用低複雜度的資料結構解決的問題就不用搞複雜度的資料結構。
降低時間複雜度的做法有:排序、遞迴、二分法、動態規劃。
程式優化的思路:
降低複雜度例子:
1.有任意張2,3,7元,要用他們湊出100元,問有多少種可能。
不用3層迴圈o(n³),2層迴圈就行o(n²)。
public void s2_2() }}
system.out.println(count);
}
2.查詢乙個陣列**現次數最多的元素的數值。
通過一次for迴圈找到答案,同步記錄下每個元素出現的次數,最後,查詢次數最大的元素。
public void s2_4() ;
mapd = new hashmap<>();
for (int i = 0; i < a.length; i++) else
}int val_max = -1;
int time_max = 0;
for (integer key : d.keyset())
}system.out.println(val_max);
}
定義乙個k-v結構的字典(元素---出現次數)
時間複雜度為o(n),空間複雜度為o(n).
通過增加空間複雜度來降低時間複雜度。
資料結構與演算法簡介
演算法簡介 一 資料結構與演算法的關係 雖然本門課程叫 資料結構 但經常會講到演算法,以及它們之間的關係。在市面上也經常有諸如 資料結構與演算法分析 這樣名字的書。實際上,資料結構與演算法是依存關係。只談資料結構而拋棄演算法,則資料是 死 的,沒有活力的 只談演算法而拋棄資料結構,則演算法無法有所依...
(一)資料結構與演算法簡介
目標 掌握資料結構與演算法的理論知識 補齊演算法短板 梳理前端與演算法結合點,不再紙上談兵,將演算法用於實戰 三部曲 刷題 前端與資料結構 演算法的結合點 在工作中與資料結構 演算法大交道 資料結構與演算法是什麼 資料結構 計算機儲存 組織資料的方式,就像鍋碗瓢盆 演算法 一系列解決問題的清晰指令,...
《資料結構與演算法》之資料結構簡介
資料結構 資料 結構,資料結構是計算機儲存 組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。一 資料的邏輯結構 指反映資料元素之間的邏輯關係的資料結構,其中的邏輯關...