题目描述
已知某个文件内包含大量电话号码,每个号码为 8 位数字,如何统计不同号码的个数?内存限制 100M。
解决方案
8 位电话号码可以表示的范围为 00000000~99999999。如果用 bit 表示一个号码,那么总共需要 1 亿个 bit,总共需要大约 10MB 的内存。
申请一个位图并初始化为 0,然后遍历所有电话号码,把遍历到的电话号码对应的位图中的 bit 设置为 1。当遍历完成后,如果 bit 值为 1,则表示这个电话号码在文件中存在,否则这个 bit 对应的电话号码在文件中不存在。
最后这个位图中 bit 值为 1 的数量就是不同电话号码的个数了。
具体实现
# 初始化位图
bit_map = [0] * (10**8 // 8)
# 读取文件
with open('phone_numbers.txt', 'r') as file:
for line in file:
phone_number = int(line.strip())
# 计算对应的字节索引和比特位索引
byte_index = phone_number // 8
bit_index = phone_number % 8
# 将对应的比特位置为 1
bit_map[byte_index] |= (1 << bit_index)
# 统计不同号码个数
unique_count = 0
for byte in bit_map:
# 统计字节中值为 1 的比特位个数
unique_count += bin(byte).count('1')
print(f"不同号码的个数为: {unique_count}")