問題:
對於任意非負整數,統計其二進位制展開中數字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
g2n
)由大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表示只...