算法(Algorithm):一個計算過程,解決問題的方法算法
DNiklaus Wirth:「程序=數據結構+算法」數據結構
時間複雜度:用來評估算法運行效率的一個式子ide
時間複雜度-小結函數
時間複雜度是用來估計算法運行時間的一個式子(單位)。
通常來講,時間複雜度高的算法比複雜度低的算法慢。
常見的時間複雜度(按效率排序)spa
O(1)< O(logn)< O(n)< O(nlogn)< O(n2)< O(n2logn)< O(n3)
複雜問題的時間複雜度
O(n!)O(2n)O(nn)..3d
如何簡單快速地判斷算法複雜度code
快速判斷算法複雜度(適用於絕大多數簡單狀況):
肯定問題規模n
循環減半過程→logn
k層關於n的循環→nk
複雜狀況:根據算法執行過程判斷blog
空間複雜度:用來評估算法內存佔用大小的式子
空間複雜度的表示方式與時間複雜度徹底同樣
算法使用了幾個變量:O(1)
算法使用了長度爲n的一維列表:O(n)
算法使用了m行n列的二維列表:O(mn)
「空間換時間」排序
遞歸的兩個特色:
調用自身
結束條件遞歸
大梵天創造世界的時候作了三根金剛石柱子,在一根柱子上從下往上按照大小順序擺着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序從新擺放在另外一根柱子上。
在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
64根柱子移動完畢之日,就是世界毀滅之時。
漢諾塔移動次數的遞推式:h(x)=2h(x-1)+1
h(64)=18446744073709551615
假設婆羅門每秒鐘搬一個盤子,則總共須要5800億年!
def hanoi(n, a, b, c): if n > 0: # 盤子大於0才執行 hanoi(n - 1, a, c, b) # 將n-1個盤 從a通過c移動到 b print("moving pan from %s to %s" % (a, c)) # 將第n個盤移動到c hanoi(n - 1, b, a, c) # 將n-1 個盤 從b 通過a 移動到c hanoi(3, 'A', 'B', 'C') # 將n-1個盤(除了底層的第n個盤)當作一個總體, """ move pan from A to C move pan from A to B move pan from C to B move pan from A to C move pan from B to A move pan from B to C move pan from A to C """
查找
查找:在一些數據元素中,經過必定的方法找出與給定關鍵字相同的數據元素的過程。
列表查找(線性表查找):從列表中查找指定元素
輸入:列表、待查找元素
輸出:元素下標(未找到元素時通常返回None或-1)
內置列表查找函數:index()
順序查找(Linear Search)
順序查找:也叫線性查找,從列表第一個元素開始,順序進行搜索,直到找到元素或搜索到列表最後一個元素爲止。
時間複雜度:O(n)
二分查找:又叫折半查找,從有序列表的初始候選區li[0:n]開始,經過對待查找的值與候選區中間值的比較,可使候選區減小一半。
def binary(data_list, value): low = 0 high = len(data_list) - 1 while low <= high: mid = (low + high) // 2 # 折半 if data_list[mid] == value: return mid elif data_list[mid] > value: high = mid - 1 else: low = mid + 1 data_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] value = 5 index = binary(data_list, value) print("index in data_list:%s ,search value test:%s "%(index,data_list[index])) """ index in data_list:4 ,search value test:5 """