算法是一組完成任務的指令。當數據量比較大的時候,算法的優劣對程序的性能好壞極爲重要python
算法的速度指的並不是時間,而是操做數的增速算法
談論算法的速度時,咱們說的是隨着輸入的增長,其運行時間將以什麼樣的速度增長數組
算法的運行時間用大 O 表示法表示數據結構
大 O 表示法指出了最糟狀況下的運行時間app
O(logn) 比 O(n) 快,當須要搜索的元素越多時,前者比後者快得越多函數
數組:元素在內存中都是相連的性能
鏈表:元素可存儲在內存中任何地方,並不必定是相連的spa
數組擅長讀取,鏈表擅長插入與刪除(數組支持隨機訪問,而鏈表只能順序訪問)3d
數組 | 鏈表 | |
---|---|---|
讀取 | O(1) | O(n) |
插入 | O(n) | O(1) |
刪除 | O(n) | O(1) |
定義:函數本身調用本身code
遞歸條件:函數調用本身
基線條件:函數再也不調用本身,從而避免造成無限循環
元素 後進先出(LIFO) 的一種數據結構
def greet2(name):
print("how are you, " + name + "?")
def bye():
print("ok, bye!")
def greet(name):
print("hello, " + name + "!")
greet2(name)
print("getting ready to say bye...")
bye()
複製代碼
調用 greet("maggie"),內存分配狀況:
接下來,打印 hello, maggie! 再調用 greet2("maggie")
打印 hello are you, maggie? 而後從函數返回。棧頂內存塊被彈出。
調用另外一個函數時,當前函數暫停並處於未完成狀態。接下來,打印 getting ready to say bye...,調用函數 bye()
打印 ok bye! 從函數返回
用於存儲多個變量的棧就是調用棧
遞歸函數使用調用棧,例如:
def fact(x):
if x == 1:
return 1
else:
return x * fact(x-1)
複製代碼
只適用於有序元素列表
目的: 查找某個數是否存在於數組中
算法: 前提條件:a 爲數組,first 和 last 分別指向數組的頭尾,mid 指向數組的中間項,value 爲要查找的數
若是 first > last, 返回 None(沒有找到元素),不然循環執行如下程序: mid = (first + last) // 2
代碼:
def BinarySearch(a, value):
first = 0
last = len(a) - 1
while first <= last:
mid = (first + last) // 2
guess = a[mid]
if guess < value:
first = mid + 1
elif guess > value:
last = mid - 1
else:
return mid
return None
複製代碼
二分查找的時間複雜度:O(logn)
每次都找出數組中最小的元素,並添加到新數組中
代碼(找出最小值):
def findSmallest(arr):
smallest = arr[0]
smallest_index = 0
for i in range(1, len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
複製代碼
代碼(添加到新數組):
def selectionSort(arr):
newArr = []
for i in range(len(arr)):
smallest = findSmallest(arr)
newArr.append(arr.pop(smallest))
return newArr
複製代碼
選擇排序時間複雜度: