資料結構 時間複雜度概念

2021-10-03 08:29:50 字數 3600 閱讀 6611

演算法效率衡量:時間複雜度————程式總共要執行的基本運算步驟的總和。

對於本題的列舉法,a+b+c= 1000時,時間複雜度(基本運算步驟)為t = 1000 * 1000 * 1000 * 2 即為 t(n) = n**3 * 2

時間複雜度的幾條基本計算規則:

1.基本操作,即只有常數項,認為其時間複雜度為o(1)

2.順序結構,時間複雜度按加法進行計算

3.迴圈結構,時間複雜度按乘法進行計算

4.分支結構,時間複雜度取最大值

5.判斷乙個演算法的效率時,往往只需關注運算元量的最高次項,其他次要項和常數項可以忽略

6.在沒有特殊說明時,我們所分析的演算法的時間複雜度都是指最壞時間複雜度

常見的時間複雜度大小關係:

o(1) < o(logn) < o(n) < o(nlogn) < o(n² ) < o(n³) < o(2^n) < o(n!) < o(n ^n

例:列舉法

import time

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

('finish'

)print

('用時:%d'

%(end_time - start_time)

)

程式用時108s

對於本題的列舉法,a+b+c= 1000時,時間複雜度(基本運算步驟)為t = 1000 * 1000 * 1000 * 2 即為 t(n) = n**3 * 2

時間複雜度為t(n) = o(n^3)

對列舉法進行改進後(通過a,b,c的關係減少對c的列舉),運算元量減少,程式用時隨之減少:

import time

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

('finish'

)print

('用時:%d'

%(end_time - start_time)

)

程式用時1s

timeit模組

timeit模組可以用來測試一小段python**的執行速度。

#使用timeit模組測試幾種列表生成方法所需時間

import timeit

from timeit import timer

deft1()

: li =

for i in

range

(10000):

li +=

[i]deft2(

):li =

for i in

range

(10000):

#把元素新增到列表尾部

deft3()

: li =

[i for i in

range

(10000)]

deft4()

: li =

list

(range

(100000))

deft5()

: li =

for i in

range

(10000):

li.extend(

[i])

deft6()

: li =

for i in

range

(10000):

li.insert(

0,i)

#(0,)代表每個元素都新增到列表首部

timer1 = timer(

't1()'

,'from __main__ import t1'

)print

('t1:'

,timer1.timeit(

1000))

#測試1000次

timer2 = timer(

't2()'

,'from __main__ import t2'

)print

('t2:'

,timer2.timeit(

1000))

#測試1000次

timer3 = timer(

't3()'

,'from __main__ import t3'

)print

('t3:'

,timer3.timeit(

1000))

#測試1000次

timer4 = timer(

't4()'

,'from __main__ import t4'

)print

('t4:'

,timer4.timeit(

1000))

#測試1000次

timer5 = timer(

't5()'

,'from __main__ import t5'

)print

('t5:'

,timer5.timeit(

1000))

#測試1000次

timer6 = timer(

't6()'

,'from __main__ import t6'

)print

('t6:'

,timer6.timeit(

1000))

#測試1000次

結果如下圖,可以看出每種方法的效率不一樣,在具體任務中可考慮使用。

資料結構引入歧途——資料的組織方式。

資料結構只是靜態的描述了資料元素之間的關係。

高效的程式需要在資料結構的基礎上設計和選擇演算法。

程式 = 資料機構 + 演算法

總結:演算法是為了解決實際問題而設計的,資料結構是演算法需要處理的問題載體。

抽象資料型別概念:把原有的基本資料和這個資料所支援的基本操作放在一起,形成乙個整體。

最常用的5種資料運算:插入、刪除、修改、查詢、排序。

資料結構 時間複雜度 空間複雜度

1.演算法效率 演算法效率可以用來衡量乙個演算法的好壞 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率.時間效率被稱為時間複雜度,空間效率被稱為空間複雜度.時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小...

資料結構時間複雜度

如何衡量乙個演算法的複雜度?演算法的時間複雜度和空間複雜度統稱為演算法的複雜度 void test int n for int k 0 k 2 n k icount intcount 10 while count icount 這個函式執行次數為f n n n 2 n 10 時間複雜度實際就是乙個函...

資料結構 時間複雜度

一 演算法 是解決特定問題求解不走的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。1.正確性 演算法的正確性是指演算法至少應該具有輸入 輸出和加工處理無歧義性 能正確反映問題的需求 能夠得島問題的正確答案。2.可讀性 演算法設計的另一目的是為了方便閱讀 理解和交流。3.健壯性...