一道簡單的演算法題

2021-07-30 15:18:38 字數 1335 閱讀 1916

題目:統計給定數字中,值為1的二進位制位的數量。如果是陣列呢?

int getbitcount(unsigned int

num)

return count;

}

第一種想法比較簡單,從最後一位開始,比較是否為1,如果為1,就計數器加一。迴圈次數固定,32次。但是這種方法有乙個地方需要注意,那就形參必須為unsigned int。否則,如果num為負數時,此時右移為了保證移位後還是負數,最高位會一直置為1,那將陷入死迴圈。

int getbitcount2(unsigned int

num)

return count;

}

相比較第一種演算法,我們不必每次判斷一位,而是通過num & (num-1)來判斷。每次&之後,可以把num最低位的1置為0,那麼迴圈的次數,也就降低到了所含1的個數。

static const unsigned char bitsinbyte[256] = ;

int getbitcount3(unsigned int num)

通過定義乙個bitsinbyte[256]位元組陣列,裡面存放0000 0000 - 1111 1111不同數字的1的個數。然後把需要統計的數字劃分為四段,然後分部計算。

unsigned int getbitcount4(unsigned int

num)

這種演算法也常被稱為漢明重量(hamming weight),通過一系列的位移和位運算操作,可以在常數時間內計算多個位元組的漢明重量,而且不需要使用額外的記憶體。接下來分析以下這個演算法。

為了方便描述,我們假定乙個位元組0xd8 ->(二進位制) 0b11011000從後往前,依次為1到8位,第一位為0,第八位為1。

magic.png

演算法(ms)/資料級別

1010^2

10^3

10^4

10^5

10^6

10^7

10^8遍歷0

01226

2552700

29447

遍歷(改進)00

01774

7398046查表0

0002

21202

2166

swar00

00219

1901876

以上是模擬不同的資料級別,執行測試的結果。

解一道簡單的演算法題

原題是這樣的 乙個未排序整數陣列,有正負數,重新排列使負數排在正數前面,並且要求不改變原來的正負數之間相對順序。比如 input 1,7,5,9,12,15 ans 5,12,1,7,9,15 且要求時間複雜度o n 空間o 1 我實現的解法 解法1 不考慮時間和空間複雜度 則每次找到乙個正數,取出...

一道簡單的題

阿里巴巴的一道面試題 25.給定乙個整數陣列和乙個整數,返回兩個陣列的索引,這兩個索引指向的數字的加和等於指定的整數。需要最優的演算法,分析演算法的空間和時間複雜度。include include using namespace std struct stwoindex 初始化,同時等於0,說明不存...

一道演算法題

兩個燒杯,乙個放糖乙個放鹽,用勺子舀一勺糖到鹽,攪拌均勻,然後舀一勺混合 物會放糖的燒杯,問你兩個燒杯哪個雜質多?一樣多吧 對的 為啥?是不是因為 糖和鹽本來就是均勻的 因為,就算不攪拌均,你放一勺過去,那邊放一勺不含雜質的過來,那麼都是一勺雜之 如果攪拌均勻的話也是一樣 小依 21 45 32 也...