Python程序员面试算法宝典---解题总结: 第9章 大数据 9.7 如何统计不同电话号码的个数


# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第9章 大数据 9.7 如何统计不同电话号码的个数

题目:
已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

分析:
记得似乎是编程珠玑中的题目。
最简单的方法,设置哈希(对应于python中的字典),建立:
<号码字符串, 该号码字符串出现的次数>。
又或者可以利用Trie树,即前缀树,实际就是一个多叉树,
每个节点设置10个孩子节点分别表示数字0~9,
最后一个数字节点后面的节点用于统计该号码的个数。

关键:
1 书上解法
求解数据重复的问题优先用位图方法。
8位电话号码范围在:
0000 0000 ~ 9999 9999
可以用每个bit表示一个电话号码,则需要1亿个bit,大约等于100MB。
例如
0000 0000 对应位图最后1位为         0x0000...000001
0000 0001 对应位图倒数第二位为      0x0000...000010
0000 0012 对应位图倒数第13位为      0x0000...0001 0000 0000 0000
总结:
也就是数字n对应位图倒数第n位为1。
位图的实现是整数数组
考虑到一个整数占据4字节,确定一个电话号码对应在位图中的下标用
P / 32 (因为每个整数是4字节,即32比特),计算在该位图下标对应元素中的位置则为 P % 32

2 注意
题目要求的是不同电话号码的个数,而不是每个电话号码出现的次数,
因此不能用哈希做,位图适合于求解:
存在重复的问题+数据量大的问题

3 没有想到
是因为忘记了位图的原理:
通过某1位bit是否为1来表示对应数字是否出现过。
位图适用:
大数据查找,数据判重
位图的实现是整数数组&
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值