《Python 每日一學》之短路法優化時間複雜度
阿新 • • 發佈:2018-12-12
昨天在 Python 實戰交流群裡發起一個討論:
在如下這個常見的遍歷場景中,如何優化程式碼降低時間複雜度?
def tips_everyday_example():
vector = ['apples', 'apple', 'banana', 'bananas',
'carrot', 'carrots', 'pear', 'pears']
for _ in range(10000):
for item in ['apples', 'pears', 'bananas']:
if item in vector:
print (item)
今天提供一下我的思路供大家參考:
上面的 example 中雖然表面上看是 2 層遍歷,但其實是三層遍歷, for _ in range(1000) 第一層,for item in [‘apples’, ‘pears’, ‘bananas’] 第二層,item in vector 第三層,每一層的時間複雜度都為:O(n)
常規優化思路:
- 降低遍歷層級——經過分析覺得無法優化
- 降低遍歷次數——引入短路法
- 快速查詢到元素——引入二分法查詢
經過分析,第一層遍歷與第二層遍歷次數無法進行減少,第三層通引入短路法來減少遍歷次數,具體實施:觀察需要列印的元素都以 s 結尾(總之要找到共同的特徵),採用 and (其他語言為:&&) 判斷表示式短路的方式減少遍歷的次數,例如:
def tips_everyday():
vector = ['apples', 'apple', 'banana', 'bananas',
'carrot', 'carrots', 'pear', 'pears']
for _ in range(10000):
for item in vector:
# 此處如果 item 不以 s 結尾 and 後面的二分法查詢將進行短路不執行,以此達到了減少遍歷次數的目的
if item.endswith('s') and binary_search(item. lower(), sorted(['apples', 'pears', 'bananas'], key=str.lower)):
print(item)
def binary_search(needle, haystack):
min, max = 0, len(haystack) - 1
while min <= max:
midpoint = (min + max) // 2
guess = haystack[midpoint]
if guess == needle:
return midpoint
elif guess > needle:
max = midpoint - 1
else:
min = midpoint + 1
return None
希望參加《每日一學》的同學可以加 QQ 群:
- 群號:397234385
- QQ 掃碼一起學習: