一、列舉法解決問題:
q:a+b+c=1000,且a^2+b^2=c^2(a,b,c為自然數),如何求出所有abc可能的組合?
a:a=0,b=0,c=0~1000,利用三層巢狀。具體程式如下:
import time
start_time = time.time()
for a in range(1000):
for b in range(1000):
for c in range(1000):
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('finish')
顯示:time:126
finish
上述程式所消耗時間過於長,t(n)=n^3,我們將演算法進行改進:
import time
start_time = time.time()
for a in range(1000):
for b in range(1000):
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('finish')
顯示:time:1
finish
t(n)=n^2*(1+1)=n^2*2 =o(n^2)
二、演算法效率衡量
1、時間複雜度:如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t(n),它是n的某一函式t(n)稱為這一演算法的「時間複雜性」。當輸入量n逐漸加大時,時間複雜性的極限情形稱為演算法的「漸近時間複雜性」。
2、大o記法:對於單調的整數函式f,如果存在乙個函式g和實常數c>0,使得對於充分大的n總有f(n)<=c*g(n),就說函式g是f的乙個漸進函式,記為f(n)<=o(g(n))。也就是說,在趨向無窮的極限意義下,函式f的增長受到g的約束,亦即函式g的特徵相似。t(n)=c*g(n),g(n)是t(n)的大o表示法。
3、最壞時間複雜度:演算法完成工作最多需要多少基本操作。最壞時間複雜提供了一種保證,表明演算法在此種成都的基本操作中一定能完成工作。一般最壞時間複雜度使我們所關注的。
4、時間複雜度的幾條基本計算規則:
基本操作:即只有常數項,認為其時間複雜度為o(1)。
順序結構:時間複雜度按加法進行計算。
迴圈結構:時間複雜度按乘法進行計算。
分支結構:時間複雜度取最大值。
在沒有特殊情況說明時,我們所分析的演算法的時間複雜度都是指最壞時間複雜度。
5、常見的時間複雜度
三、python中資料結構的複雜度(未完待續。。。)
基本概念之資料結構
什麼是資料結構 目前沒有官方的定義。思考 解決問題方法的效率,跟什麼有關呢?解決問題方法的效率,跟資料的組織方式有關 例1 如何在書架上擺放書籍?首先這個問題是不科學的,沒有告訴書架的是什麼樣子的。解決方法 操作2 怎麼找到某本指定的書?方法2 按照書名的拼音字母順序排放 方法3 把書架劃分成幾塊區...
資料結構之排序 一 基本概念
排序方法的分類 下面逐個介紹。按比較器分為 按主要操作分為 插入排序 交換排序 選擇排序 歸併排序 按輔助空間分為 按穩定性分為 按自然性分為 後面主要介紹以下幾種排序 排序的工作量 以上這些排序都是基於順序表的儲存結構進行的。define maxsize 20 設記錄不超過20個 typedef ...
資料結構總結 之 基本概念
資料 data 資料元素 data element 資料項 data item 資料物件 data object 資料結構 data structure 資料的邏輯結構 logical structure 分類 線性結構 線性表 非線性結構 樹 圖 或網路 資料的儲存結構 物理結構 physical...