目錄
首先明確的一點就是電腦科學不僅僅是對計算機的研究,雖然計算機在科學發展的過程中發揮了重大的作用,
但是它只是乙個工具,乙個沒有靈魂的工具而已。所謂的電腦科學實際上是對問題、解決問題以及解決問題的
過程中產生產生的解決方案的研究。例如給定乙個問題,計算機科學家的目標是開發乙個演算法來處理該問題,
最終得到該問題的解、或者最優解。所以說電腦科學也可以被認為是對演算法的研究。因此我們也可以感受到,
所謂的演算法就是對問題進行處理且求解的一種實現思路或者思想。
# 理解
乙個常勝將軍在作戰之前都會進行戰略的制定,目的是為了能夠在最短的時間切成本消耗最低的情況下獲取最終的勝利。
如果將編碼作為戰場,則程式設計師就是這場戰役的指揮官,你如何可以將你的程式可以在最短且消耗資源最小的情況下獲取
最終的執行結果呢?演算法就是我們的策略!
# 意義
資料結構和演算法思想的通用性異常的強大,在任何語言中都被使用,它們將會是我們編碼生涯中伴隨我們最長久利器(左膀右臂)。
有一定經驗的程式設計師最終拼的就是演算法和資料結構。
資料結構和演算法思想也可以幫助我們拓展和歷練編碼的思維,可以讓我們更好的融入到程式設計世界的角角落落。
剛接觸程式設計的學生經常會將自己編寫的程式和別人的程式做比對,獲取在比對的過程中會發現雙方編寫的程式很相似但又各不相同。
那麼就會出現乙個有趣的現象:兩組程式都是用來解決同乙個問題的,但是兩組程式看起來又各不相同,那麼哪一組程式更好呢?
a+b+c = 1000 a**2 + b**2 = c**2 (a,b,c均為自然數),求出a,b,c可能的組合?
# 第一組**
import datetime
starttime = datetime.datetime.now()
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)
endtime = datetime.datetime.now()
print (endtime - starttime)
# 執行結果 這組**執行4分多種才求出結果
0 500 500
200 375 425
375 200 425
500 0 500
0:04:15.526003
# 第二組**
import datetime
starttime = datetime.datetime.now()
for a in range(0,1001):
for b in range(0,1001):
c = 1000-a-b
if a+b+c == 1000 and a**2+b**2 == c**2:
print(a,b,c)
endtime = datetime.datetime.now()
print (endtime - starttime)
# 執行結果 這組**執行2秒左右就求出結果,明顯優於上組**
0 500 500
200 375 425
375 200 425
500 0 500
0:00:02.117703
時間複雜度越低演算法越優
常見的時間複雜度:
# 時間複雜度
def sumofn(n):
thesum = 0 # 1
for i in range(1,n+1): # n+1
thesum = thesum + i
return thesum
print(sumofn(10))
# 1+n+1 ==> o(n)
a=5 # 1
b=6 # 1
c=10 # 1
for i in range(n):
for j in range(n): # 3n**2
x = i * i
y = j * j
z = i * j
for k in range(n): # 2n
w = a*k + 45
v = b*b
d = 33 # 1
# 3+3n**2+2n+1 ==>n**2==>o(n**2)
# 第一種 時間複雜度 o(n)
[,,]
# 第二種 時間複雜度 o(n)
[ ('name','score'),
('name','score'),
('name','score')
]# 第三種 時間複雜度 o(1)
, 'lisi':
}# 資料結構與演算法的關係?
- 使用不同的形式組織資料,在基於查詢時的時間複雜度是不一樣的。因此認為演算法是為了解決實際問題而設計的,
資料結構是演算法需要處理問題的載體。
在列表的操作有乙個非常常見的程式設計任務就是是增加乙個列表。我們馬上想到的有兩種方法可以建立更長的列表,
選擇合適的工具來提高你自己的程式的效率。
- timeit模組:該模組可以用來測試一段python**的執行速度/時長。
- timer類:該類是timeit模組中專門用於測量python**的執行速度/時長的。原型為:class timeit.timer(stmt='pass',setup='pass')。
- stmt引數:表示即將進行測試的**塊語句。
- setup:執行**塊語句時所需要的設定。
- timeit函式:timeit.timer.timeit(number=100000),該函式返回**塊語句執行number次的平均耗時。
- 例項化乙個空列表,然後將0-n範圍的資料新增到列表中。(四種方式)
from timeit import timer
def test01():
alist =
for i in range(1000):
alist += [i]
return alist
def test02():
alist =
for i in range(1000):
return alist
def test03():
return [i for i in range(1000)]
def test04():
alist = list(range(1000))
return alist
if __name__ == '__main__':
timer = timer('test01()','from __main__ import test01')
t1 = timer.timeit(100000)
print(t1)
timer2 = timer('test02()','from __main__ import test02')
t2 = timer.timeit(100000)
print(t2)
timer3 = timer('test03()','from __main__ import test03')
t3 = timer.timeit(100000)
print(t3)
timer4 = timer('test04()','from __main__ import test04')
t4 = timer.timeit(100000)
print(t4)
# 執行結果 第四種方式時間最短 list(range(1000))
11.752772499999992
10.816332999999986
11.822587399999975
9.485878500000013
作 者:郭楷豐
出 處:
一下。您的鼓勵是博主的最大動力!
自 勉:生活,需要追求;夢想,需要堅持;生命,需要珍惜;但人生的路上,更需要堅強。帶著感恩的心啟程,學會愛,愛父母,愛自己,愛朋友,愛他人。
初識演算法 資料結構
需求驅動 what why how 所有的學習從需求開始,學習任何知識要想事半功倍,一定要先搞清楚它存在的意義和價值 目錄 1 什麼是演算法?2 演算法好壞的評判標準 2.1 時間複雜度 流程決定 2.2 額外空間複雜度 流程決定 2.3 常數項時間 實現細節決定 what 總而言之 演算法就是解決...
初識演算法之資料結構與演算法的關係
資料結構與演算法有什麼關係?1.概念 資料結構 可以容納資料的結構被稱為資料結構 演算法 演算法是用來對資料結構進行處理的方法 簡單理解 資料結構就是把資料給把包起來,組裝起來,拼接起來,或者是放到乙個容器裡面,變成一種資料結構,等待被處理。演算法就是對這些資料結構進行處理 2.區別 資料結構是靜態...
資料結構與演算法 初識容器與迭代器
任務 使用vector容器實現基本的增刪減查功能 如下 include include using std cout using std vector using std endl int main cout endl endif 使用迭代器 it v.begin 迭代器指向容器v的第乙個元素 it...