1. 程式人生 > >《Python 每日一學》之短路法優化時間複雜度

《Python 每日一學》之短路法優化時間複雜度

昨天在 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)

常規優化思路:

  1. 降低遍歷層級——經過分析覺得無法優化
  2. 降低遍歷次數——引入短路法
  3. 快速查詢到元素——引入二分法查詢

經過分析,第一層遍歷與第二層遍歷次數無法進行減少,第三層通引入短路法來減少遍歷次數,具體實施:觀察需要列印的元素都以 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 掃碼一起學習:

qq群.jpg