算法分析笔记
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
定義
定義:
法則:
若 T<sub>1</sub>(N) = O(f(N)) 且 T<sub>2</sub>(N)=O(g(N)),則:
a. T<sub>1</sub>(N) + T<sub>2</sub>(N) = max(O(f(N)), O(g(N)))b. T<sub>1</sub>(N) * T<sub>2</sub>(N) = O(f(N) * g(N))若 T(N) 是一個(gè) k 次多項(xiàng)式,則 T(N) = Θ(N<sup>k</sup>)
對(duì)任意常數(shù) k,log<sup>k</sup>N = O(N)
注意:
最大子序列問(wèn)題
可以分段讀入數(shù)據(jù)并處理問(wèn)題的算法稱為 online algrithm,與之相對(duì),在運(yùn)算開始時(shí)就需要讀入全部數(shù)據(jù)做運(yùn)算的算法稱為 offline algrithm。僅需要常量?jī)?nèi)存空間并以線性時(shí)間運(yùn)行的算法幾乎是完美的算法。如下例最大子序列問(wèn)題:
lang:python data = list(range(-10, 10)) random.shuffle(data)# 算法 def foo(data):this_sum = max_sum = 0for i in data:this_sum += iif this_sum < 0:this_sum = 0elif this_sum > max_sum:max_sum = this_sumreturn max_sum對(duì)數(shù)
如果一個(gè)算法用常數(shù)時(shí)間(O(1) )將問(wèn)題的大小削減為其一部分(通常是 1/2),那么該算法就是 O(logN)。
如果一個(gè)算法可以用常數(shù)時(shí)間把問(wèn)題減小一個(gè)常數(shù),那么他就是 O(N) 的。
對(duì)數(shù)復(fù)雜度的一個(gè)典型例子是:二分法查找 (binary search)
def bin_search(numbers, x):"""假設(shè) numbers 已排序"""start = 0end = len(numbers) - 1while start < end:middle = (start + end) / 2if numbers[middle] < x:start = middle + 1elif numbers[middle] > x:end = middle - 1else:return middlereturn -1歐幾里得算法
計(jì)算最大公因數(shù):
def gcd(a, b):while b > 0:a = a % ba, b = b, areturn a定理:
若 M > N, 則 M mod N < M/2推得:gcd 函數(shù)的時(shí)間復(fù)雜度是 O(log N) 的
冪運(yùn)算
優(yōu)化算法的一個(gè)原則是:不要做重復(fù)的運(yùn)算。
因此對(duì)于冪運(yùn)算 x<sup>n</sup>,相較于進(jìn)行 n-1 次乘法,下面的算法效率更高:
def pow(x, n):if n == 0:return 1if n == 1:return nif n % 2 == 0:return pow(x * x, n / 2)else:return x * pow(x * x, (n-1) / 2)檢驗(yàn)算法時(shí)間
python 中可以用 timeit.timeit 函數(shù)方便的檢驗(yàn)算法時(shí)間
timeit(stmt='pass', setup='pass', timer=<built-in function perf_counter>,number=1000000, globals=None)其中:
* stmt statement 是一個(gè)字符串表達(dá)式 * setup 是一個(gè)執(zhí)行前置語(yǔ)句,如 import * globals 是一個(gè)字典,存放你要使用的全局變量如,我們要測(cè)試 gcd 函數(shù),則
import timeit timeit.timeit('gcd(15, 234)', globals={'gcd': gcd})轉(zhuǎn)載于:https://my.oschina.net/lionets/blog/704924
總結(jié)
- 上一篇: 切图崽的自我修养-规范CSS元素命名
- 下一篇: 对大数据知识架构的梳理