簡體   English   中英

C ++代碼片段的大O符號和時間復雜性

[英]Big O Notation and Time Complexity of C++ Code Snippet

所以我正在尋找c ++代碼片段的時間復雜性的確認:

for(int i = 0; i<N, i++){
    for(int k = 1; k<N; k*=2){
    //code with O(1)
    }
 }

我認為這將是O(NlgN) ,其中lg是log base 2.內部循環將是O(lgN)因為k在每次迭代后加倍。 外部循環顯然是O(N) ,使整個代碼:

 O(N)*O(lgN) = O(NlgN).

是的,它在O(n log n)中,但是基數與大O符號f=n \\cdot log_2(n) \\in \\mathcal{O}(log_2(n) * n ) \\subseteq \\mathcal{O}(\\frac{ln(n)}{ln(2)} * n ) \\subseteq \\mathcal{O}(log(n) * n ) \\ni f = n \\cdot ln (n)因為f=n \\cdot log_2(n) \\in \\mathcal{O}(log_2(n) * n ) \\subseteq \\mathcal{O}(\\frac{ln(n)}{ln(2)} * n ) \\subseteq \\mathcal{O}(log(n) * n ) \\ni f = n \\cdot ln (n) ie

在此輸入圖像描述

注意最后的日志應該仍然是ln,但是人們並不關心每當log是10或e的基數時的混亂,因為它在大O中無關緊要。

因此,即使for(int k = 2; k<N; k*= k) ,使用大O表示法時復雜度也相同。 然而,有時人們在比較非常小的優化時會記下常數因素,但除非你在談論在全球數十億實例上運行快速排序實現,否則這是不可行的。

對於我們如何確定你的內部循環是由log(n)約束的部分我有點也沒有找到一個很好的數學證明。 當然執行它是一種證明,但我的理論方法是,我們可以同意內循環執行的頻率與函數k *= 2需要更大的參數來達到n ,所以其中k(x) >= n我們知道我們需要哪個x來得到我們想要的k(x) ,是反函數k^(-1)2^x的反函數是log_2(x)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM