時間複雜度與空間複雜度
算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表着用系統的方法描述解決問題的策略機制。
時間複雜度
時間複雜度是指執行算法所需要的計算工作量
計算時間複雜度的方法:
1、用常數1代替運行時間中的所有加法常數
2、修改後的運行次數函數中,只保留最高階項
3、去除最高階項的係數
按數量級遞增排列,常見的時間複雜度有:
不常見的時間複雜度有:
常見時間複雜度實例:
第一種:
print("Hello")
第二種:
sum = (sum+2)/3
def a(n):
while n > 1:
n = n // 2
print(n)
return n
print(a(10))
for i in range(n):
print(i)
for i in range(n):
for j in range(n):
print(j)
for i in range(n):
for j in range(n):
for k in range(n):
print(j)
如何一眼就看出時間複雜度呢?
- 循環減半的過程一般包含: O(logn)
- 幾次循環就是n的幾次方複雜度
- 常見算法複雜度
算法名稱 | 最差時間複雜度 | 平均時間複雜度 | 是否穩定 | 空間複雜度 |
---|---|---|---|---|
冒泡排序 | 穩定 | |||
快速排序 | 不穩定 | |||
選擇排序 | 穩定 | |||
二叉樹排序 | 不穩定 | |||
插入排序 | 穩定 | |||
堆排序 | 穩定 |
空間複雜度
空間複雜度是指執行算法所需的內存空間
只有變量
有一個列表
N維列表
算法實例
- 二分查找
條件:必須是有序集合
import time
def org(func):
def te(*args, **kwargs):
t1 = time.time()
x = func(*args, **kwargs)
t2 = time.time()
print "The time: %s, %s "% (func.__name__, t2-t1)
return x
return te
@org
def datas(data_list, val):
low = 0
high = len(data_list) - 1
mid = high // 2
while low <= high:
mid = (high + low) // 2
if data_list[mid] == val:
return mid
elif data_list[mid] > val:
high = mid - 1
else:
low = mid + 1
return
a = list(range(10000))
print(datas(a, 1234))
- 冒泡排序
import random
import time
def org(func):
def te(*args, **kwargs):
t1 = time.time()
x = func(*args, **kwargs)
t2 = time.time()
print "The time: %s, %s "% (func.__name__, t2-t1)
return x
return te
@org
def bubble_sort(bubble_list):
n = len(bubble_list)
for i in range(n-1):
exchange = False
for j in range(n-1-i):
if bubble_list[j] < bubble_list[j+1]:
bubble_list[j],bubble_list[j+1] = bubble_list[j+1],bubble_list[j]
exchange = True
if not exchange:
break
a = list(range(10000))
random.shuffle(a)
bubble_sort(a)
- 選擇排序
import random
import time
def org(func):
def te(*args, **kwargs):
t1 = time.time()
x = func(*args, **kwargs)
t2 = time.time()
print "The time: %s, %s "% (func.__name__, t2-t1)
return x
return te
@org
def select_sort(bubble_list):
for i in range(len(bubble_list) - 1):
min_loc = i
for j in range(i, len(bubble_list)):
if bubble_list[j] < bubble_list[min_loc]:
min_loc = j
bubble_list[i],bubble_list[min_loc] = bubble_list[min_loc], bubble_list[i]
a = list(range(10000))
random.shuffle(a)
select_sort(a)
- 插入排序
import random
import time
def org(func):
def te(*args, **kwargs):
t1 = time.time()
x = func(*args, **kwargs)
t2 = time.time()
print "The time: %s, %s "% (func.__name__, t2-t1)
return x
return te
@org
def insert_sort(bubble_list):
for i in range(1, len(bubble_list)):
tmp = bubble_list[i]
j = i - 1
while j >= 0 and bubble_list[j] > tmp:
bubble_list[j+1] = bubble_list[i]
j = j - 1
bubble_list[j + 1] = tmp
a = list(range(1000))
random.shuffle(a)
insert_sort(a)