廢話時間:python
算法其實是高於語言的。 因此我是第一!!! 好比說你的列表.sort 它裏面其實就是實現了一種算法。 算法:一個計算過程,解決問題的方法。 程序 = 數據結構 + 算法。
光年是距離。
通常來講:時間複雜度高的算法比複雜度低的算法慢。算法
問題規模基本上差很少同樣的時候。即n緩存
與機器有關。數據結構
時間複雜度是獨立於機器的。函數
o(1) < o(logn) < o(n) < o(nlogn) < o(n的平方) < o(n平方logn) < o(n的三次方)
如何簡單判斷時間複雜度?code
最好是根據運行過程來估計 找到表明問題規模的n 魑魅魍魎chi‘mei’wang‘liang
是否有循環減半的過程 -> o(logn) 幾層循環就是n的幾回方的複雜度
用來評估算法內存佔用大小的一個式子
空間換時間排序
例如:若是你想讓你的算法快點,就須要更多的緩存。
遞歸的兩個特色: - 調用自身 - 結束條件 def qq(n): if n == 0 : print('個人小可愛',end='') else: print('抱着',end='') qq(n-1) print('的我',end='') qq(5) # 抱着抱着抱着抱着抱着個人小可愛的個人個人個人個人我 def fun(x): if x > 0: print(x) fun(x-1) def func(x): if x > 0: func(x-1)
當n個盤子時,把n-1看作一部分。 1. 把n-1個圓盤從a通過c移動到b 2. 把第n個圓盤從a移動到c 3. 把n-1個圓盤從b通過a移動到c
t = 0 def hanoi(n,a,b,c): global t if n > 0: hanoi(n-1,a,c,b) t +=1 print(':moving from %s --> %s.'%(a,c)) hanoi(n-1,b,a,c) hanoi(5,'a','b','c') print('本次總共運行 %s 次'%t)
漢諾塔移動次數的遞推式:h(x) = 2h(x-1)+1
3.1 列表查找:從列表中查找指定元素 - 輸入:列表、待查找元素 - 輸出:元素下標或未查找到元素 3.2 順序查找 - 從列表第一個元素開始,順序進行搜索,直到找到爲止。 3.3 二分查找 - 從有序列表的候選區data[0:n]開始,經過對待查找的值和候選區中間值的比較,可使候選區減小一半。
def erfen_search(li,val): low = 0 high= len(li) - 1 while low<=high: mid = (low+high) // 2 if li[mid] == val: return mid elif li[mid] < val: low = mid + 1 else: high = mid - 1 a = erfen_search([1,2,3,4.123,123,12,3,12,3,12,3,21,3,213,21,321,3,213,21,321,3,21,4,3,543,53,45,435,342,5],435) # 上面這個方法有問題,不信你試。 # 遞歸版本二分查找 def bin_search_rec(data_set,value,low,high): if low <= high: mid = (low + high) // 2 if data_set[mid] == value: return mid elif data_set[mid] < value: low = mid + 1 return bin_search_rec(data_set,value,low,high) else: high = mid - 1 return bin_search_rec(data_set,value,low,high) else: return
- 列表排序 - 將無序列表變爲有序列表。 .sort - 應用場景 - 各類榜單 - 各類表格 - 給二分查找用 - 給其餘算法用 輸入:無序列表 輸出:有序列表 排序Low B三人組 - 冒泡排序 - 插入排序 - 選擇排序 算法關鍵點: - 有序區 - 無序區 升序與降序 排序兇兇組: - 快排 - 思路: - 取一個元素p(第一個元素),使元素p歸位; - 列表被p分紅兩部分,左邊逗比p小,右邊逗比p大‘ - 遞歸完成排序。 遞歸終止條件:列表剩一個元素。 - 算法關鍵點:1. 歸位 2. 遞歸 - 堆排 - 歸併排序 沒什麼人用的排序: - 基數排序 - 希爾排序 - 桶排序
執行次數函數 | 階 | 非正式術語 |
---|---|---|
12 | O(1) | 常數階 |
2n+3 | O(n) | 線性階 |
3n²+2n+1 | O(n²) | 平方階 |
5log2n + 20 | O(logn) | 對數階 |
2n + 3nlog2n + 19 | O(nlogn) | nlogn階 |
6n³ + 2n² + 3n +4 | O(n³) | 立方階 |
2" | O(2") | 指數階 |