博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【实习记】2014-08-28知值求范围问题
阅读量:6317 次
发布时间:2019-06-22

本文共 1370 字,大约阅读时间需要 4 分钟。

 
 
 
 

接到一个优化算法任务

数据库储存着银行卡号用上下限表示的区间,互不交叉重叠,现有9万多记录。
给一个卡号,如何找到该条记录。
现有方法是使用前三位数做索引字段,起到一定效果,但是数据一大了还是效率低。
我推测了一下其应用情景是银行每个网点所具有的发卡权不一样,某个区间属于某个网点所发。

 

阶段一、IP反查城市
既然不是一下子能想到答案的,我首先想到的是,是否已有解决方案。
我想到了一个类似但普遍的应用情景:ip反查城市
于是谷歌关键字搜索。
http://www.haogongju.net/art/2459667
http://bbs.csdn.net/topics/80467465
http://coolshell.cn/articles/7048.html
自己知乎提问
http://www.zhihu.com/question/25024287

 

 

 

 

阶段二、区间hash 区间搜索
仔细查hash,认识了gperf这个生成完美hash函数的gnu工具。
二维数组的现有hash成果,geohash地图算法
http://www.cnblogs.com/LBSer/p/3310455.html
相较于Peano曲线而言,Hilbert曲线没有较大的突变
http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html
针对一群范围对的最快查找算法设计(不要用数组)?
其实我一直在考虑能不能用哈希来做,也就是每个区间一个hash值,每个数一个hash值,两者对应起来进行查找,这样就是O(1)的速度了,但想了想作罢了,因为:
1. 这样的哈希算法能找到吗?比如两个区间:<1, 3>, <9, 11>,能让1,2,3都对应一个哈希值,然后9, 10, 11都对应一个哈希值,还要与对应的区间对应一个哈希值,这样的哈希算法目前没想到。
2. 因为我的算法必须是没有误报率的,因此怕hash的做法会引来冲突和误报率
二分查找直接就搞定了,并且复杂度是下界。。。因为区间是静态的,并且不相交(条件太强了),也没有什么动态更新的操作,线段树、树状数组RMQ神马的根本没有发挥的空间。。。
即使可以动态加减区间,只要满足不相交,用个二叉查找树就好了,也不需要线段树。

大型路由器为了速度,貌似对这种查找的速度做过大量优化,用的比较多的

lz不一定非的信赖stl。
这是我以前自己实现的一个map
测试10个区间,Release,优化全开MaxSpeed,10W次查找,耗时2.7秒
http://www.cnblogs.com/huangxincheng/archive/2012/07/21/2602375.html
哈希适合等于性的查找,树结构适合”范围查找“,lucene适合字符串的查找

 

 

 

今天成果
1、logN是查找的下限了。最好方法是读到内存,用二叉查找数,或者二分查找下限数组。
2、除非真找到那个hash函数,使得区间与区间内的任意值都具有相同hash值。用反证法应该容易证明不可能吧!

 
 

转载于:https://www.cnblogs.com/weishun/p/tencent-shixi-2014-08-28-value-to-range.html

你可能感兴趣的文章
iOS8 Push Notifications
查看>>
各大名企笔试及面经大全(程序猿必读)
查看>>
Oracle 连接、会话数的查看,修改
查看>>
Oracle 11g password过期被锁定报道 ORA-28000 the account is locked
查看>>
轨磁条简介
查看>>
NSQ部署
查看>>
大厂前端高频面试问题与答案精选
查看>>
如何设计高扩展的在线网页制作平台
查看>>
Git 2.5增加了工作树、改进了三角工作流、性能等诸多方面
查看>>
Swift 5将强制执行内存独占访问
查看>>
中台之上(二):为什么业务架构存在20多年,技术人员还觉得它有点虚?
查看>>
深度揭秘腾讯云低功耗广域物联网LPWAN 技术及应用
查看>>
与Jeff Sutherland谈敏捷领导力
查看>>
More than React(四)HTML也可以静态编译?
查看>>
React Native最佳学习模版- F8 App开源了
查看>>
云服务正在吞噬世界!
查看>>
Web语义化标准解读
查看>>
一份代码构建移动、桌面、Web全平台应用
查看>>
高性能 Lua 技巧(译)
查看>>
区分指针、变量名、指针所指向的内存
查看>>