不常見的時間複雜度(看看就好)
如何一眼判斷時間複雜度?
def hanoi(n, a, b, c):
if n > 0:
hanoi(n-1, a, c, b)
print('%s->%s' % (a, c))
hanoi(n-1, b, a, c)
hanoi(5, 'a', 'b', 'c')
#h(n) = 2h(n-1)+1
#h(1)=1
遞迴面試題 斐波那契# 斐波那契 數列
f(n) = f(n-1) + f(n-2)
from sys import setrecursionlimit
from cal_time import cal_time
setrecursionlimit(1000)
# o(2^n)
# f(n) = f(n-1) + f(n-2)
# 乙個問題的解決可以依賴於其子問題的解決的時候
def fib(n):
if n == 0 or n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
# o(n)
def fib2(n):
li = [1,1]
for i in range(2, n+1):
return li[-1]
def fib3(n):
li = [-1 for i in range(n+1)]
def fib(n):
if n == 0 or n == 1:
return 1
elif li[n] >= 0:
return li[n]
else:
v = fib(n-1) + fib(n-2)
li[n] = v
return li[n]
return fib(n)
# 1 2
# o(n)
def fib4(n):
a = 1
b = 1
c = 1
for i in range(2, n+1):
c = a + b
a = b
b = c
return c
@cal_time
def fibnacci(n):
return fib4(n)
print(fibnacci(400))
from cal_time import cal_time
# 時間複雜度 : log n
def binary_search(li, val):
low = 0
high = len(li)-1
while low <= high: # 只要候選區有值
mid = (low + high) // 2
if val == li[mid]:
return mid
elif val < li[mid]:
high = mid - 1
else: # val > li[mid]
low = mid + 1
return -1
# 遞迴與迭代
# 一般遞迴會慢
# 尾遞迴 : 編譯器會優化成迭代 但是python沒有針對尾遞迴進行優化
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:
return bin_search_rec(data_set, value, low, mid - 1)
else:
return bin_search_rec(data_set, value, mid + 1, high)
else:
return
二分查詢時間複雜度推導
二分查詢是乙個非常常用且簡潔的查詢演算法,相信很多人也知道它的時間複雜度是logn,但是我看網上的大多數部落格給出的所謂推導過程都十分不嚴謹,於是我花了些時間自己寫了推導過程。首先上二分查詢的 public int find int x,int data 查詢元素下標,沒找到返回 1 param x...
二分查詢時間複雜度的計算
時間複雜度無非就是while迴圈的次數!總共有n個元素,漸漸跟下去就是n,n 2,n 4,n 2 k,其中k就是迴圈的次數 由於你n 2 k取整後 1 即令n 2 k 1 可得k log2n,是以2為底,n的對數 所以時間複雜度可以表示o o logn 二分查詢的時間複雜度是o log n 最壞情況...
二分查詢時間複雜度的計算
時間複雜度無非就是while迴圈的次數!總共有n個元素,漸漸跟下去就是n,n 2,n 4,n 2 k,其中k就是迴圈的次數 由於你n 2 k取整後 1 即令n 2 k 1 可得k log2n,是以2為底,n的對數 所以時間複雜度可以表示o o logn 二分查詢的時間複雜度是o log n 最壞情況...