python数据结构算法优势_Python数据结构与算法(一)----- 算法效率
一.引入
先來看一道題:
如果a+b+c=1000, 且a2+b2=c^2(a,b,c為自然數),如何求出所有a,b,c可能的組合?
(1) 枚舉法
import time
start_time = time.time()
for a in range(0,1001):
for b in range(0,1001):
for c in range(1,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')
##基本步驟數量T = 1000*1000*1000*2
改進代碼
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('time:%d'%(end_time-start_time))
print('finished')
##基本步驟數量T(n)=n*n*(1+max(1,0))=n^2
算法的概念:是獨立存在的一種解決問題的方法和思想
算法的五大特征:
(1)輸入:算法具有0個或多個輸入
(2)輸出:至少有一個或多個輸出
(3)有窮性:在有限的步驟之后會自動結束而不會無限循環,并且每一個步驟可以在可接受的時間內執行
(4)確切性:每一步有確切的含義
(5)可行性:每一步是可行的
二 . 算法效率
時間復雜度和“大O計法”
時間復雜度:T(n) = n^3 * 2
大O計法:不用分析很精確 T(n) = n^3
最壞時間復雜度:
[1,2,4,8,6,5,3,1]排序 n^2
[1,2,3,4,5] for i in ls: n
(1) 最優時間復雜度:價值不大,沒有提供什么有用信息
(2)最壞時間復雜度:提供了一種保證
(3)平均時間復雜度:是對算法的一個全面評價,沒有提供保證
因此,主要關注最壞時間復雜度,然后最優時間敷在讀
2. 時間復雜度的幾條基本計算規則:
(1) 基本操作,即只有常數項
(2)順序結構,按照加法進行計算
(3)循環結構,按照乘法進行計算
(4)分支結構,時間復雜度取最大值
(5)判斷一個算法的效率時,往往只需要關注操作量的最高項次,其他次要項和常數項可以忽略
(6)在沒有特殊說明時,我們通常分析最壞時間復雜度
3. 常見時間復雜度:
(1)12 O(1) 常數階
(2) 2n+1 O(n) 線性階
(3)3n^2 O(n2) 平方階
(4)5logn. O(long) 對數階
(5)2n+3nlogn+19 O(n*logn) nlogn階
(6) 6n3+2n2+3n+4 O(n3) 立方階
(7)2n O(2n) 指數階
關系:
O(1)
三. Python內置類型性能分析
1. timeit模塊
可以用來測試一小段代碼的運行速度
class time.Timer(stmt=‘pass’,setup=‘pass’,time=)
time.Timer.timeit(n=1000000)
number參數時測試代碼時的測試次數
測算list
from timeit import Timer
#li1 = [1,2]
#li2 = [23,5]
#li = li1 +li2
#li = [i for i in range(10000)]
#li = list[range(10000)]
def test1():
li = []
for i in range(10000):
li.append(i)
def test2():
li = []
for i in range(10000):
li += [i]
def test3():
li = [i for i in range(10000)]
def test4():
li = list(range(10000))
def test5():
li = []
for i in range(10000):
li.extend([i])
timer1 = Timer('test1()','from __main__ import test1')
print('append:',timer1.timeit(1000))
timer2 = Timer('test2()','from __main__ import test2')
print('+:',timer2.timeit(1000))
timer3 = Timer('test3()','from __main__ import test3')
print('[i from i in range]:',timer3.timeit(1000))
timer4 = Timer('test4()','from __main__ import test4')
print('list(range()):',timer4.timeit(1000))
timer5 = Timer('test5()','from __main__ import test5')
print('list(range()):',timer5.timeit(1000))
##最快的是timer5
def test6():
li = []
for i in range(10000):
li.append(i) ##從列表尾添加
def test7():
li = []
for i in range(10000):
li.insert(0,i) ##從列表頭添加
timer6 = Timer('test6()','from __main__ import test6')
print('append:',timer6.timeit(1000))
timer7 = Timer('test7()','from __main__ import test5')
print('list(extend:',timer7.timeit(1000))
##對頭添加比對尾添加慢
list 內置時間復雜度
dict內置時間復雜度
四. 數據結構
數據是一個抽象的概念,將其分類后得到程序設計語言中的基本類型。
數據元素之間不是獨立的,存在特點的關系,這些關系便是數據結構。
程序=算法+數據結構
算法是為了解決實際問題而設計的,數據結構是算法需要處理的問題載體。
抽象數據類型:指一個數學模型以及定義在此數學模型上的一組操作。即把數據類型和數據類型上的運算捆在一起,進行封裝。
常用的數據運算有五種:插入,刪除,修改,查找和排序
原文鏈接:https://blog.csdn.net/mangogogo321/article/details/106678151
總結
以上是生活随笔為你收集整理的python数据结构算法优势_Python数据结构与算法(一)----- 算法效率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq邮箱怎么发送文件夹给别人(登录QQ邮
- 下一篇: md5与des算法有何不同_Python