乙個簡單的位運算及其複雜度分析 Sample

2021-09-26 16:36:34 字數 1107 閱讀 7765

問題:

對於任意非負整數,統計其二進位制展開中數字1的總數。

方法:將n與1位與,若結果為1則將計數器+1,之後將n向右移一位,重複上述過程直至n縮減為0;

例如:

5轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0101

3轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0011

1轉換為二進位制:0000 0000 0000 0000 0000 0000 0000 0001

故 5 & 3 = 1

(位與:第乙個運算元的的第n位於第二個運算元的第n位如果都是1,那麼結果的第n為也為1,否則為0)

**實現:
#include

using

namespace std;

intcountones

(unsigned

int n)

return ones;

}int

main()

時間複雜度:

總的迴圈次數為n展開為二進位制後的位數,即1+l

og2n

1 + log_2n

1+log2

​n無論是該迴圈體之前、之內還是之後,均只涉及常數次(邏輯判斷、位與運算、加法、右移

等)基本操作。因此,countones()演算法的執行時間主要由迴圈的次數決定,亦即:o(1

+[lo

g2n]

)=o(

[log

2n])

=o(l

og2n

)o(1+[log_2n])=o([log_2n])=o(log_2n)

o(1+[l

og2​

n])=

o([l

og2​

n])=

o(lo

g2​n

)由大o記號定義,在用函式log r n界定漸進複雜度時,常底數r的具體取值無所謂,故通常不予專門標出而籠統地記作logn,比如,儘管此處底數為常數2,卻可直接記作o(logn)。此類演算法稱作具有「對數時間複雜度」(logarithmic-time algorithm)。

乙個時間複雜度問題

有乙個字串陣列,將陣列中的每乙個字串按照字母序排序 之後再將整個字串陣列按照字典序排序。整個操作的時間複雜度是多少?假設最長的字串長度為 s 為什麼要假設最長字串呢?因為通常求的時間複雜度是上界,所以我們假象這個字串陣列中所有字串的長度都是最長的 s 這樣計算得出來的時間複雜度就是上界,包含了最壞的...

深度學習模型 演算法的運算複雜度分析

分四大部份 ref 原文 翻譯 影響記憶體占用的主要因素 resnet 50為例network architecture圖 輸入image資料 256 256的彩色影象 256 256 3 1 byte 192kb 模型自身conv.等使用到的params引數 resnet 50有26 millio...

如何來求取乙個演算法的時間複雜度?

如何計算時間複雜度 定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 當輸入量n逐漸加大時,時間複雜性的極限情形稱為演算法的 漸近時間複雜性 我們常用大o表示法表示時間複雜性,注意它是某乙個演算法的時間複雜性。大o表示只...