Я просматривал эту страницу подсчета битов: https://www.geeksforgeeks.org/count-set-bits-in-an-integer/
Последний алгоритм Отображение чисел с битом говорит: Он просто поддерживает Map ( или массив) чисел в биты для полубайта. Полубайт содержит 4 бита. Итак, нам нужен массив до 15.
int num_to_bits[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
Теперь нам просто нужно рекурсивно получить полубайты заданного long / int / word et c.
num_to_bits =[0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4];
# Recursively get nibble of a given number
# and map them in the array
def countSetBitsRec(num):
nibble = 0;
if(0 == num):
return num_to_bits[0];
# Find last nibble
nibble = num & 0xf;
# Use pre-stored values to find count
# in last nibble plus recursively add
# remaining nibbles.
return num_to_bits[nibble] + countSetBitsRec(num >> 4);
num = 31
from timeit import default_timer as timer
t1 = timer()
print(countSetBitsRec(num))
t2 = timer()
print(t2-t1)
num = 421342356246244235625423523626342453143523624526434636546745745634523546346346346346344506546456909546540964596956306030963068359683578753068340634960340683463906835096835068309683486036830563596
t1 = timer()
print(countSetBitsRec(num))
t2 = timer()
print(t2-t1)
t1 = timer()
print(bin(num).count('1'))
t2 = timer()
print(t2-t1)
5
0.00013369599992074654
335
0.00015420899990203907
335
0.00011028399990209437
В разделе временной сложности говорится, что это O (1) как по времени, так и по памяти. Несмотря на то, что время для обоих целых чисел близко, я не могу понять, как это O (1), поскольку он выполняет рекурсивные вызовы?