Given an integer array of length N (an arbitrarily large number). How to count number of set bits in the array?
The simple approach would be, create an efficient method to count set bits in a word (most prominent size, usually equal to bit length of processor), and add bits from individual elements of array.
Various methods of counting set bits of an integer exists, see this for example. These methods run at best O(logN) where N is number of bits. Note that on a processor N is fixed, count can be done in O(1) time on 32 bit machine irrespective of total set bits. Overall, the bits in array can be computed in O(n) time, where ‘n’ is array size.
However, a table look up will be more efficient method when array size is large. Storing table look up that can handle 232 integers will be impractical.
The following code illustrates simple program to count set bits in a randomly generated 64 K integer array. The idea is to generate a look up for first 256 numbers (one byte), and break every element of array at byte boundary. A meta program using C/C++ preprocessor generates the look up table for counting set bits in a byte.
The mathematical derivation behind meta program is evident from the following table (Add the column and row indices to get the number, then look into the table to get set bits in that number. For example, to get set bits in 10, it can be extracted from row named as 8 and column named as 2),
0, 1, 2, 3 0 - 0, 1, 1, 2 -------- GROUP_A(0) 4 - 1, 2, 2, 3 -------- GROUP_A(1) 8 - 1, 2, 2, 3 -------- GROUP_A(1) 12 - 2, 3, 3, 4 -------- GROUP_A(2) 16 - 1, 2, 2, 3 -------- GROUP_A(1) 20 - 2, 3, 3, 4 -------- GROUP_A(2) 24 - 2, 3, 3, 4 -------- GROUP_A(2) 28 - 3, 4, 4, 5 -------- GROUP_A(3) ... so on
From the table, there is a pattern emerging in multiples of 4, both in the table as well as in the group parameter. The sequence can be generalized as shown in the code.
All the operations takes O(1) except iterating over the array. The time complexity is O(n) where ‘n’ is size of array. Space complexity depends on the meta program that generates look up.
Contributed by Venki. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
- Check if bits of a number has count of consecutive set bits in increasing order
- Print numbers having first and last bits as the only set bits
- Toggle bits of a number except first and last bits
- Sort an array according to count of set bits | Set 2
- Check if array can be sorted by swapping pairs with GCD of set bits count equal to that of the smallest array element
- Count of pairs in an Array with same number of set bits
- Check if all bits can be made same by flipping two consecutive bits
- Count total set bits in all numbers from 1 to n | Set 2
- Count total set bits in all numbers from 1 to N | Set 3
- Count pairs in an array such that both elements has equal set bits
- Count of elements in an Array whose set bits are in a multiple of K
- Count pairs (A, B) such that A has X and B has Y number of set bits and A+B = C
- Count number of set bits in a range using bitset
- Count pairs of elements such that number of set bits in their AND is B[i]
- Count Set-bits of number using Recursion
- Count number of bits to be flipped to convert A to B | Set-2
- Find a number X such that (X XOR A) is minimum and the count of set bits in X and B are equal
- Maximum number of set bits count in a K-size substring of a Binary String
- Program to find the Nth natural number with exactly two bits set
- Little and Big Endian Mystery