一道面试题,快速查找ip地址所在的地区

gaoht 2010-08-21 04:56:09
一个地区ip段表,10万条记录,记录格式:
beginIP endIP 地区.

一个用户ip记录文件,300万表记录,记录格式:
用户 IP

希望查找出每个用户ip所在的地区。怎么做效率高?
...全文
510 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
air_snake 2010-10-16
  • 打赏
  • 举报
回复
ip地址的特点是分网段的,不同的网段按照Tree来build。

真要快,用硬件做。
  • 打赏
  • 举报
回复
排序、归并
showjim 2010-10-16
  • 打赏
  • 举报
回复
既然有10万个IP段,建立65536个桶用不了多少空间,把IP段扔到这些桶里(最多产生65535个分裂段)分别排序,这样每个桶中的IP段数量应该都不多。
时间一粒 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 superdullwolf 的回复:]
beginIP endIP 都是整数,可以在排好序的数组里二分查。
[/Quote]
数据大了,效率不高...哈希表不知道可以不
shexinwei 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 superdullwolf 的回复:]

shexinwei
数据是分段的,所以字典没办法做,我也想过哈希。
[/Quote]
数据是分段的,但是IP的特点就是分成一个个子网,不同的子网只要根据他的网络号就可以判断。
Dolphin_001 2010-08-23
  • 打赏
  • 举报
回复
A[i]是每个段的数据,每个用一个byte就可以保存,4个刚好一个整形。
[Quote=引用 7 楼 superdullwolf 的回复:]

xx.xx.xx.xx
实际是256进制的整数,2的8次是256,sum+=(A[i]*(1<<(8*i)))左移运算就可以实现转换整数,这样面试才显得咱是“练家”。
[/Quote]
blue_blue_yeah 2010-08-23
  • 打赏
  • 举报
回复
beginIP endIP 都是整数,可以在排好序的数组里二分查。
yaoweijq 2010-08-23
  • 打赏
  • 举报
回复
一看到xx段
第一感觉线段树。。。
二分法其实也挺快的
再想快的话
就要借助数据库或hash了
既然有ip段
ip记录也只是个范围
直接枚举所有的ip记录
用合适的hash函数映射
再查找就行了
主要还是看实际的应用场景
能满足你实际的需求就行了
不一定要效率最高的做法
boYwell 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 superdullwolf 的回复:]

xx.xx.xx.xx
实际是256进制的整数,2的8次是256,sum+=(A[i]*(1<<(8*i)))左移运算就可以实现转换整数,这样面试才显得咱是“练家”。
[/Quote]

将每一个IP都转换成256进制的整数?

(300百万+10万条记录)*2 这么多要进行乘法转换。
超级大笨狼 2010-08-22
  • 打赏
  • 举报
回复
xx.xx.xx.xx
实际是256进制的整数,2的8次是256,sum+=(A[i]*(1<<(8*i)))左移运算就可以实现转换整数,这样面试才显得咱是“练家”。
超级大笨狼 2010-08-22
  • 打赏
  • 举报
回复
shexinwei
数据是分段的,所以字典没办法做,我也想过哈希。
boYwell 2010-08-22
  • 打赏
  • 举报
回复
mark~~ 学习了
绿色夹克衫 2010-08-22
  • 打赏
  • 举报
回复
一般情况下二分就可以了,如果考虑段与段之间有重复,比如包含关系,用线段树比较合适。
lovezypj 2010-08-22
  • 打赏
  • 举报
回复
首先肯定要排序,然后用二次过滤就可以很快找到,这里的瓶颈不在如何找ip,而是在如何处理读取这300万的记录,建议300万记录不要都保存一个表,可以根据段保存若干个表,ip是xx.xx.xx.xx格式的,根据xx来把相同段的ip保存为一个表
purell 2010-08-22
  • 打赏
  • 举报
回复
请解释一下“sum+=(A[i]*(1<<(8*i)))左移运算就可以实现转换整数”的机理。 A[i], sum 都代表什么?谢谢。

[Quote=引用 7 楼 superdullwolf 的回复:]

xx.xx.xx.xx
实际是256进制的整数,2的8次是256,sum+=(A[i]*(1<<(8*i)))左移运算就可以实现转换整数,这样面试才显得咱是“练家”。
[/Quote]
shexinwei 2010-08-21
  • 打赏
  • 举报
回复
字典序,每一个地点分配的是一个网段。也就是不同地区的IP地址都是前面几位不同。利用字典序
超级大笨狼 2010-08-21
  • 打赏
  • 举报
回复
数组里记录上限下限和所在地区表记录行数。
超级大笨狼 2010-08-21
  • 打赏
  • 举报
回复
复杂度O(logn),300万的话log(300*1000*1000)最差是29次就可以查到。
应该是秒杀的。
超级大笨狼 2010-08-21
  • 打赏
  • 举报
回复
beginIP endIP 都是整数,可以在排好序的数组里二分查。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧