演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作
求:乙個1+2+3+…+100
# o(n)
n =1
sum=
0while n <=
100:
sum=
sum+ n
n +=
1print
(sum
)
5050
# 高斯的方法o(1)
n =100
sum=
0sum=(
1+ n)
* n /
2print
(sum
)
5050.0
再來感受一下演算法的力量
求:所有在1000內滿足 a^2 + b^2 = c^2的所有組合?
import time
defmain_1()
:"""
# 列舉法
三重迴圈:t = 1000 * 1000 * 1000 * 2
t(n) = o(n^3)l
:return:
"""start_time = time.time(
)for a in
range(0
,1001):
for b in
range(0
,1001):
for c in
range(0
,1001):
if a + b + c ==
1000
and a **
2+ b **
2== c **2:
print
("a, b, c:%d, %d, %d"
%(a, b, c)
) end_time = time.time(
)print
("time:%d"
%(end_time - start_time)
)print
("finished"
)return
none
main_1(
)
a, b, c:0, 500, 500
a, b, c:200, 375, 425
a, b, c:375, 200, 425
a, b, c:500, 0, 500
time:80
finished
def
main_2()
:"""
#兩重迴圈
t = 1000 * 1000 * 3
t(n) = o(n^2)
"""start_time = time.time(
)for a in
range(0
,1001):
for b in
range(0
,1001):
c =1000
- a - b
if a **
2+ b **
2== c **2:
print
("a, b, c:%d, %d, %d"
%(a, b, c)
) end_time = time.time(
)print
("time:%d"
%(end_time - start_time)
)print
("finished"
)
main_2(
)
a, b, c:0, 500, 500
a, b, c:200, 375, 425
a, b, c:375, 200, 425
a, b, c:500, 0, 500
time:0
finished
輸入(大於等於0個)、輸出(至少有乙個,演算法至少有乙個或多個輸出)
有窮性(不會無限迴圈,且每乙個步驟都在可接受時間內完成)
確定性(每一步都有確定含義,無歧義)
可行性(每一步都在執行有限次數完成)
正確性
可讀性健壯性(輸入資料不合法時,也能做出相關處理,而不是產生異常)
時間效率高和儲存量低
乙個用高階語言編寫的程式在計算機上執行時所消耗的時間取決於下列因素:
演算法採用的策略、方法編譯產生的**質量(軟體支援的優劣)
問題的輸入規模機器執行指令的速度(硬體效能)
拋開計算軟硬體的影響,乙個程式的執行時間,依賴於演算法的好壞和問題的輸入規模(輸入量的多少)。
分析乙個演算法的執行時間時,將基本操作的數量表示為輸入規模的函式
o(1)2)3)n)n)
# 執行1次
sum=(1
+ n)
* n /
2
# 執行12次
sum=(1
+ n)
* n /
2sum=(
1+ n)
* n /
2sum=(
1+ n)
* n /
2sum=(
1+ n)
* n /
2sum=(
1+ n)
* n /
2sum=(
1+ n)
* n /
2sum=(
1+ n)
* n /
2sum=(
1+ n)
* n /
2sum=(
1+ n)
* n /
2sum=(
1+ n)
* n /
2sum=(
1+ n)
* n /
2sum=(
1+ n)
* n /
2
分析演算法的複雜度,關鍵就是分析迴圈結構的運**況
# 迴圈體中的**必須執行n次
i =0
while i < n:
i +=
1# 時間複雜度為o(1)的程式步驟序列
count =
1while count < n:
count = count *
2# 時間複雜度為o(1)的程式步驟序列
由於每次count乘以2後,就距離n更近了一分。也就是說有多少個2相乘後大於n,則會退出迴圈。由2^x = n,得x=logn,所以這個迴圈的時間複雜度為o(logn)
迴圈的時間複雜度 = 迴圈體的複雜度 * 該迴圈體執行的次數
# 時間複雜度為o(n*m)
i =0
while i < n:
i +=
1 j =
0while j < m:
j +=
1# 時間複雜度為o(1)的程式步驟序列
# 時間複雜度為o(n^2)
i =0
while i < n:
j = i
i +=
1while j < n:
j +=
1# 時間複雜度為o(1)的程式步驟序列
當i=1時,內迴圈執行了n次
當i=2時,內迴圈執行了n-1次
當i=n-1時,內迴圈執行了1次
內迴圈總的執行次數:n+(n-1)+(n-2)+…+1=o(n^2)
演算法複雜度 02
確定一種標準和確定的方法來確定演算法的效能 速度和記憶體來確定演算法的效能 1.大o表示法 乙個演算法的增長速率或者乙個演算法的增長規律非常重要,因為當輸入資料量變得無窮大時,它可以用來描述演算法的效率到底有多高。o表示法正是這樣一種表示演算法增長規律的方法。我們通常使用演算法的最壞情況複雜度,記為...
迴圈巢狀時間複雜度 簡單演算法 什麼是複雜度?
這裡的複雜度,就是用於衡量程式的執行效率的重要度量因素。雖然有句俗話 不管是白貓還是黑貓,抓到老鼠就是好貓 這句話是站在結果導向的,沒錯。但是如果 有個程式要去處理海量資料,乙個程式設計師寫的要執行2天,而另乙個程式設計師只要半小時,那麼第二種顯然更適合我們的實際需求。複雜度是乙個關於輸入資料量n的...
演算法的複雜度 演算法的時間複雜度和空間複雜度
在一次筆試題目中,發現了自己對於演算法的時間複雜度問題上並沒有完全清晰這個概念和計算方法,故上網尋找到比較好的詳細介紹來學習。演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也...