大O

表示時間的大O符號,是用來描述算法效率的語言和度量單位。不完全理解這個概念,不只會影響你作出清晰的判斷,還會讓你沒法評價算法的優劣。算法

  • 常量不算在運算時間裏。

例如某個O(2N)的算法其實是O(N)。特定輸入中,O(N)頗有可能會比O(1)代碼還要快。大O僅僅描述了增加的趨勢。數組

  • 丟棄不重要的項

應該捨棄可有可無的項。好比 O(N2+N)變成O(N2)、O(N+logN)變成O(N)、O(5*2^N+1000N^100)變成O(2^N)等。函數

  •  logN運行時間

元素的個數每次減半,它的運行時間極可能是O(logN)。spa

以二分查找爲例。假設一個排序數組長度爲N,目標值爲x。首先比較x與中值,若是x等於中值直接返回,若是小於中值,搜索數組的左邊,若是大於中值,搜索數組的右邊。code

開始時有N個元素的排序數組要搜索,通過一次搜索以後,還剩下N/2個元素,再一次,剩下N/4個元素,直到找到目標值或者待搜索元素個數爲1時才中止搜索。blog

同理,在平衡二叉搜索樹中查找一個元素也是O(logN),每次比較,非左即右。排序

  • 遞歸的運行時間

當一個屢次調用本身的遞歸函數出現時,它的運行時間每每是O(分支數^數的深度),分支數即每次調用本身的次數。遞歸

例如:class

int f(int n) {
  if (n <= 1) {
    return 1;
  }
  return f(n-1) + f(n-1);
}

運行時間是O(2^N)。效率

這個例子的空間複雜度爲O(N),儘管樹節點總數爲O(2^N),但同一時刻只有O(N)個節點存在。

再例如:

把平衡二叉搜索樹上全部節點的值相加,運行時間是多少?

分支樹是2,深度大概是logN,因此爲O(2^logN) = O(N) , 運行時間是O(N)。

相關文章
相關標籤/搜索