python演算法與資料結構

2021-10-07 16:32:19 字數 2510 閱讀 7816

若n1+n2+n3=1000,且n1平方+n2平方=n3平方(n1,n2,n3為自然數),求出所有n1、n2、n3可能的組合?

n1 = 0

n2 = 0

n3 = 0

判斷n1+n2+n3是否等於1000,之後變n3=1,n3=2,n3=3,… 然後再變n2

那如果變為 n1+n2+n3=2000 了呢?

# 思路1**實現

import time

start_time = time.time()

for n1 in range(0,1001):

for n2 in range(0,1001):

for n3 in range(0,1001):

if n1 + n2 + n3 == 1000 and n1**2 + n2**2 == n3**2:

print('[%d,%d,%d]' % (n1,n2,n3))

end_time = time.time()

# 思路2**實現

for n1 in range(0,1001):

for n2 in range(0,1001):

n3 = 1000 - n1 - n2

if n1**2 + n2**2 == n3**2:

print('[%d,%d,%d]'%(n1,n2,n3))

演算法概念是指解題方****而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策

略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出

輸入 – 具有0個或多個輸入

輸出 – 至少由1個或者多個輸出

有窮性 – 演算法執行的步驟是有限的

確定性 – 每個計算步驟無二義性

可行性 – 每個計算步驟能夠在有限的時間內完成

思路一:

t = 1000 * 1000 * 1000 * 2

t = n * n * n * 2

t(n) = n ** 3 * 2 --> 則時間複雜度為t(n) 及 n**3 * 2

函式1: t(n) = k* g(n) + c —> k為係數,c為常數

函式2: g(n) = n ** 3

特點: 在趨向無窮的極限意義下,函式t(n)的增長速度收到函式g(n)的約束,也為函式t(n)與函式g(n)的特徵相似,則稱 g(n) 是 t(n) 的漸近函式,大o表示法則使用漸近函式來表示,即: o(g(n))即: o(n^3)。

思路二:

t(n) = n * n * (1+max(1,0))

t(n) = n2 * 2

t(n) = n2

t(n) = o(n**2)

用大o表示法表示為 o(n^2)

1)最優時間複雜度 - 最少需要多少個步驟

2)最壞時間複雜度 - 最多需要多少個步驟

3)平均時間複雜度 - 平均需要多少個步驟

我們平時所說的時間複雜度,指的是最壞時間複雜度

[3,1,4,1,5,9,2,6] --> 時間複雜度:o(n^2)

[1,2,3,4,5,6,7,8] --> 時間複雜度:o(n)

for i in l:

先掃瞄一遍,若有序直接退出

時間複雜度變為 n

題目1:

for i in range(n):   # 迴圈次數為 n

print("hello, world!") # 迴圈體時間複雜度為 o(1)

此時時間複雜度為 o(n × 1),即 o(n)。

題目2:

for i in range(n):         # 迴圈次數為 n

for j in range(n): # 迴圈次數為 n

print("hello, world!") # 迴圈體時間複雜度為 o(1)

此時時間複雜度為 o(n × n × 1),即 o(n^2)。

對於順序執行的語句或者演算法,總的時間複雜度等於其中最大的時間複雜度,對於條件判斷語句,總的時間複雜度等於其中 時間複雜度最大的路徑 的時間複雜度。

題目3:

for i in range(2, n):

i *= 2

print("%d" % i)

假設迴圈次數為 t,則迴圈條件滿足 2^t < n。

可以得出,執行次數t = log(2)(n),即 t(n) = log(2)(n),可見時間複雜度為 o(log(2)(n)),即 o(log n)。

題目4:

def f(n):

if n == 1:

return 1

elif n == 2:

return 2

else:

return f(n - 1) + f(n - 2)

t(n) = t(n - 1) + t(n - 2) 是乙個斐波那契數列,該方法的時間複雜度可以表示為 o(2^n)。

python資料結構與演算法

coding utf 8 import sys 使用以下語句將引數的str格式轉換為int格式 l list map int sys.argv 1 split target int sys.argv 2 def binarysearch print l print target left 0 rig...

資料結構與演算法 python

元類 基礎 冒泡 它重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端,故名氣泡排序。def bubble sort alist ...

python資料結構與演算法

又稱儲存結構 順序結構 邏輯結構相鄰,物理結構也相鄰 鏈式結構 邏輯相鄰,物理不一定相鄰 集合結構 同屬乙個整體,但是每個元素之間沒有關係 線性結構 隊尾元素沒有直接後繼,隊頭元素沒有直接前驅 其他元素有唯一的直接前驅和後繼 一對一 樹形結構 除了根元素,其他元素都有乙個前驅和多個後繼 一對多 圖形...