【实习记】2014-08-28知值求范围问题

接到一个优化算法任务
数据库储存着银行卡号用上下限表示的区间,互不交叉重叠,现有9万多记录。
给一个卡号,如何找到该条记录。
现有方法是使用前三位数做索引字段,起到一定效果,但是数据一大了还是效率低。

我推测了一下其应用情景是银行每个网点所具有的发卡权不一样,某个区间属于某个网点所发。

阶段一、IP反查城市

既然不是一下子能想到答案的,我首先想到的是,是否已有解决方案。
我想到了一个类似但普遍的应用情景:ip反查城市

于是谷歌关键字搜索。

五种算法实现IP到地址的转换
http://www.haogongju.net/art/2459667
IP归属地算法原理是怎样的
http://bbs.csdn.net/topics/80467465
挑战无处不在--酷壳
http://coolshell.cn/articles/7048.html

自己知乎提问
ip反查城市算法 (给一个数字,返回一个区间)?
http://www.zhihu.com/question/25024287

阶段二、区间hash 区间搜索

仔细查hash,认识了gperf这个生成完美hash函数的gnu工具。

二维数组的现有hash成果,geohash地图算法
GeoHash核心原理解析
http://www.cnblogs.com/LBSer/p/3310455.html
相较于Peano曲线而言,Hilbert曲线没有较大的突变

6天通吃树结构—— 第五天 Trie树
http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html

针对一群范围对的最快查找算法设计(不要用数组)?
http://www.zhihu.com/question/24236515
http://segmentfault.com/q/1010000000586274
http://bbs.csdn.net/topics/390818776
其实我一直在考虑能不能用哈希来做,也就是每个区间一个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秒

6天通吃树结构—— 第一天 二叉查找树
http://www.cnblogs.com/huangxincheng/archive/2012/07/21/2602375.html
哈希适合等于性的查找,树结构适合”范围查找“,lucene适合字符串的查找

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

时间: 2024-07-31 06:44:32

【实习记】2014-08-28知值求范围问题的相关文章

【实习记】2014-09-03项目如何做求思路

今天主要和组里的前辈们讨论了如何做我的这个优化性质的项目. 还是那个知值求区间问题. 讨论是热烈的. 讨论出的意见有分歧,主要关键字是共享内存. 多线程还是多进程,一个容易相互影响,一个相互独立. 共享内存是要一块还是两块.一块的话加锁同步,两块的话不影响业务. 共享内存的大小是确定还是不确定,可是数据会增长变化啊. 但是有一个已经是统一的,就是做成服务,类似middle. 可是执行方案有两套,一个是tomson的错误码系统,一个是按最长匹配出来的类似项目代码. 组里让我参考代码,于是我就把代码

&lt;2014 08 28&gt; 大学学习小结

大一:哲学.物理(科普).瞎玩 大二:机械.力学.继续哲学 大三:电子电路.计算机.编程 大四:毕业项目(机器人等) 研一:物理.数学(常熟) 研二:AGV.TUM实习 研三:写论文.实习程序员.申请出国 博一:物理.数学.论文阅读 ... (第一个月开始) ... 待续 ...

PC2日记——坑爹的第一天2014/08/28

我不想安慰自己说今天是由于第一次将pc2用于实际的比赛经验不足而导致的今天出现种种问题,我想说的是自从我开始干后台我所做的每一件事都是第一次,所以这绝对不是让自己免去责备的理由:我想说的是如果我今天是为某个公司办事的话,明天我就可以滚蛋了! 今天真是对不住沛爷了:给全哥又丢人了:马前辈我也不好意思去问了. 由于今天要用pc2进行训练赛,所以从昨天晚上开始就一直在作准备.根据我以前自己在实验室pc2的经验和不足,昨晚的准备工作有以下几个重点: 1.如何实现将省赛的排名机制用于今天的比赛(很明显今天

2014/08/28

本周过去一半了,基本上什么都没有做成,脚本编的很失败,找不到逻辑,不知道AW,打仗的时候发现武器库是空的,就是这种感觉,手舞足蹈了半天,什么都没做成,难道这就是成长的阵痛么?更有可能是没有找到方法吧. 这个月也马上就要结束了,下个月传说中的金九银十开始了,大意是这段时间天气较好,人们开始下半年的忙碌,一切都欣欣向荣充满干劲,那么我也得好好总结一下这一个半月的收获和不足,在九月做好转变,走上正轨,总的来说,这段时间经历了不少,来到新的岗位,从无知的充满希望,到发现所处环境其实没有那么美好,在到认清

2014.08.04,读书,《Matlab概率与数理统计分析》-第1章 MATLAB的数据基础

第1章 MATLAB数据基础 虽然一直间或使用MATLAB,但从来没有系统的学习过,现在开始也不晚.先对几个重点或者平时忽略的要点做下笔记. %后的所有文字为注释,多条命令可以放在一行,但要用逗号或分号隔开,命令后的逗号表示显示结果,分号表示禁止显示结果. 符号…表示语句的余下部分将出现在下一行,但不能出现在变量名或运算符之间. M文件又称Script文件,具有全局性,文件中的所有变量在整个工作环境中有效. 命令: cumsum(x,dim),求累积和,matlab中cumsum函数通常用于计算

记2014“蓝桥杯全国软件大赛&quot;决赛北京之行

5月29,30日 终于到了这一天.晚上有数据结构课,10点多的火车,我们就没有去上课,下午在宿舍里收拾东西,晚上8点左右从南校出发,9点半多到达火车站和老师学长学姐们会和. 第一次去北京,第一次买的卧铺,真的很兴奋.对这次北京之行满满的都是期待.卧铺,躺在上面很舒服,因为第一次,不知道还需要换票,就把票放在包里了,找了一会才找到,看来还是得把票随身带着.卧铺晚上熄灯,我看了一部电影,然后就睡着了,一觉睡到五点多.上午看了看模板,这次蓝桥杯决赛说实话没有怎么认真的准备,做的题也比较少.把一些小的知

2014/08/06 – Backbonejs

[来自:Backbone.js 开发秘笈 第3章] Collection API (function ($) { //define ----------------------------- var ModelD = Backbone.Model.extend({ defaults: { ID: 0, Name: '' }, idAttribute: 'ID' }); //定义集合对象 /* 在其内部,模型被存储在一个名为 models 的数组当中 */ var CollectionD = Ba

2014/08/22 – SVG

一.项目功能需求:将 HTML 中 span 元素集合映射成 SVG 格式文件. 参数: span 的绝对定位坐标和 transform 的集合,贝塞尔曲线的锚点绝对定位坐标和控制点绝对定位坐标(根据曲线路径绘制 span ),span 集合父容器的宽度和高度. 输出: svg 的字符串形式. 二.知识点:由于涉及到 css 的 transform 样式,所以会用 Matrix 的相关理论知识. 1. 沿着路径变化的文字: svg 中提供了 <textPath> 元素来产生文字沿着某条事先定义

Bootstrap 3.2.0 源码试读 2014/08/09

第一部分 normalize.css 104至110行 code,    /* 编辑代码 */ kbd,    /* 键盘输入的文本 */ pre, samp {    /* 范例,sample的简写 */   font-family: monospace, monospace;    /* 这个地方应该是写错了,第二字体应该是serif */   font-size: 1em; } 设置字体的大小为1em,字体为monospace. 111至119行 button, input, optgro