(Array)
(Linked List)
(Queue)
(Stack)
(Tree)
(Binary Tree)
(Heap Tree)
(Sort)
(Bubble Sort)
(Selection Sort)
(Insertion Sort)
(Heap Sort)
(Merge Sort)
(Quick Sort)
(Search)
(Linear Search)
(Sequential Search)
(Binary Search)
(Graph)
(BFS)
(DFS)
(Greedy Algorithm)
(Traveling Salesman Problem)
(Dynamic Algorithm)
(Knapsack Problem)
Big O
來衡量時間、空間複雜度.def Compare(n):
for i in range(n):
for j in range(n):
print(i*j)
n
的增大而執行的時間變長. 因此時間複雜度是指數成長. 我們會寫為O(n^2)
Big O
¶Big O
的概念並不難, 僅需查看在完成指定結果前共執行了幾個步驟即可.1
」個步驟即可完成指定結果. 如: print
輸出, 索引值取值...等等n
」個步驟才完成指定結果. 如: 迴圈跑n
次...等等Big O
, 哪個執行結果最快? 也是我們在設計演算法時最希望得到的結果?Big O
¶Big O
的執行結果## 視覺化範例
import matplotlib.pyplot as plt
import numpy as np
point = np.array(range(1, 11))
O_1 = point/point
O_n = point
O_n2 = point*point
O_logn = np.log2(point)
O_nlogn = point * np.log2(point)
O_2_n = 2 ** point
plt.plot(point, O_1, label="O(1)")
plt.plot(point, O_n, label="O(n)")
plt.plot(point, O_n2, label="O(n^2)")
plt.plot(point, O_logn, label="O(log n)")
plt.plot(point, O_nlogn, label="O(nlog n)")
plt.plot(point, O_2_n, label="O(2^n)")
plt.xlabel('執行次數')
plt.ylabel('耗費時間')
plt.axis([1, 10, 0, 100])
plt.legend()
plt.show()
1, 5, 4, 3, 5, 2
」num = [1, 5, 4, 3, 5, 2]
for i in range(1, len(num)):
for j in range(i):
if(num[i] == num[j]):
print(num[i], '重複了')
num = [1, 5, 4, 3, 5, 2]
for i in range(1, len(num)):
for j in range(i):
if(num[i] == num[j]):
print(num[i], '重複了')
O(n^2)
. 因為沒有用到任何儲存空間. 因此空間複雜度為O(1)
num = [1, 5, 4, 3, 5, 2]
check_dict = {}
for i in num:
if(i not in check_dict):
check_dict[i] = 1
else:
print(i, '重複了')
num = [1, 5, 4, 3, 5, 2]
check_dict = {}
for i in num:
if(i not in check_dict):
check_dict[i] = 1
else:
print(i, '重複了')
pyhon
內建資料結構字典將所有走訪num
, 將所有走訪過的元素都儲存起來.因此時間複雜度為O(n)
, 空間複雜度為O(n)
vs
空間¶