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