比普通二分查找快4倍的结构

标签: 天天日记 | 发表时间:2011-08-25 14:15 | 作者:lotusroots GLORY
出处:http://hi.baidu.com/algorithms

比普通二分查找快4倍的结构

1、朴素二分查找介绍
 二分查找是查询有序数组的有效结构,对于规模为N的有序数组来说,二分查找算法的时间复杂度为O(logN)。二分查找的步骤如下:

 即每次选择数组范围的中间数据和查询数据比较,如果不等于查询数据则选择一半的范围继续查询。

2、二分查询的缺点
 算法每次选择一段范围的中间节点,每次都相当于一个随机位置比较,对cache和磁盘等非随机结构很不友好。
 
3、改进
 为了提高二分法的速度,我们可以通过重新排列有序数组的位置,减少连续2次访问数据的位置距离。在上面查找11的过程中,最好的设计是把7、11、9连续放在一起,这样3次随机访问变成3次顺序访问(对于cache和磁盘来说,顺序访问和一次随机访问时间一样)。
 如果用树来表示二分查找过程,其图如下:
 


 这个图其实是一个二叉树,中序遍历有序,每个节点包含一个数据。我们知道,1个节点包含多个数据可以提高数据访问的有序性。我们根据这种思想设计了一种树结构,用图表示如下: 
 


 这是一棵后序遍历的有序多叉树(图中为2叉)。利用这棵树,我们最多需要访问3次节点,即可找到想要的数据。
 树虽然访问节点的次数少,但它结构复杂,占用额外空间多,不适合大规模数据(如几kw)。我们可以把树存储为一个数组,即从上到下,存储每层的数据。举例来说: 
  


  
 在查询的时候,我们仍然把数组看成一个逻辑树,所以仍然是查询树的策略。唯一比较复杂的地方是如何快速的把有序数组变成最下面的数组树结构。

4、计算公式
1)设层数N,每个节点包含S个数据,数据总量为ArrayLen个,则满足公式:(S^N-S)/(S-1) >= ArrayLen > (S^(N-1)-S)/(S-1);
2)查询
int bsearch(data,key){
    k1=k2=0;
    for(m=-1;m<N-1;m++){
        p=(S^(m+2)-S)/(S-1)+k1*S;
        if(find(key in data[p->p+S], &k2))
            return convert(m,k1*S+k2);
        k1=k2;
    }
    return -1;
}

3)find函数:遍历即可
4)convert(a,b)
  a、(b+1)(S^(N-1-a)+...+2)+b+([b/S]+[b/S^2]+...)
  b、即下层排前节点个数+本层排前节点个数+上层排前节点个数
  c、如不是完全树,则第一项(b+1)*(S^(N-1-a))的值最大等于最后一层节点数
5)效率:在int数组,64字节cache line,速度提高log(64/4)=4倍

阅读全文
类别:天天日记 查看评论

相关 [普通 二分查找 结构] 推荐:

比普通二分查找快4倍的结构

- GLORY - 构架师-搜索引擎-冲出宇宙(健健康康:http://www.zhaojk.com)
 二分查找是查询有序数组的有效结构,对于规模为N的有序数组来说,二分查找算法的时间复杂度为O(logN).  即每次选择数组范围的中间数据和查询数据比较,如果不等于查询数据则选择一半的范围继续查询.  算法每次选择一段范围的中间节点,每次都相当于一个随机位置比较,对cache和磁盘等非随机结构很不友好.

二分查找法的实现和应用汇总

- - 酷勤网-挖经验 [expanded by feedex.net]
在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度. 在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度. 时间复杂度按优劣排差不多集中在:. 到目前位置,似乎我学到的算法中,时间复杂度是O(log n),好像就数二分查找法,其他的诸如排序算法都是 O(n log n)或者O(n.

二分查找(Binary Search)需要注意的问题,以及在数据库内核中的实现

- - OurMySQL
今年的实习生招聘考试,我出了一道二分查找(Binary Search)的题目. 给定一个升序排列的自然数数组,数组中包含重复数字,例如:[1,2,2,3,4,4,4,5,6,7,7]. 问题:给定任意自然数,对数组进行二分查找,返回数组正确的位置,给出函数实现. 注:连续相同的数字,返回第一个匹配位置还是最后一个匹配位置,由函数传入参数决定.

普通货物

- apple - 【blog圖黨】™ 乖乖同學的個人漫畫空間
海关总署:缉私部门正侦查赖昌星案. 2011-10-13 10:48:18 来源: 国际在线(北京). 核心提示:10月13日,国务院新闻办公室举行新闻发布会. 海关总署副署长鲁培军回答记者提问时称赖昌星涉嫌走私普通货物罪,此案正由海关缉私部门侦查,目前侦查工作进展顺利. 案件侦查终结后,将移送检察机关审查起诉.

JBPM表结构

- - CSDN博客综合推荐文章
      JBPM全称——Java  Business PrcessManagerment(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开放的、灵活的、易扩展的可执行流程语言框架.        (1)它的业务逻辑定义没有采用目前的一些规范,而是采用了它自己定义的Jboss Jbpm Process Definition Language(jpdl).

普通話是胡語嗎?

- Shawn - Beyond the Void
近些年,有人把普通話被稱爲“胡普”,暗示普通話是胡語、滿蒙靼語,或是深受北方遊牧民族影響的語言,由此否定普通話作爲漢族共同語的合理性,甚至有人直接高呼“普通話已經不是漢語了”,“粵語/吳語/閩語/客家話才是真正的漢語”,實在是匪夷所思. 有人認爲“漢語”即古漢語,普通話與古漢語無論從語音、語法還是詞彙上,都有了顯著的差別,所以普通話已經不是漢語.

Linux 文件结构

- Shiina Luce - OSMSG
想了解 Linux 文件系统树形结构,却又不愿翻阅 FHS 的朋友,可以参考 skill2die4 制作的这张简图. 此图算是 FHS 的图形化版本,简要的说明了 Linux 系统中各个目录的用途及层级关系,适合初学者使用参考. 不过其中较新的如 /run 目录并未在其中出现. 做为参考,这是 Fedora 16 Beta i686 上的文件结构:.

TCP报文结构

- - 互联网 - ITeye博客
一、TCP报文结构如下:.  固定首部长度为20字节,可变部分0~40字节,各字段解释:. source port number:源端口,16bits,范围0~65525. target port number:目的端口,16bits,范围同上. sequence number:数据序号,32bits,TCP 连接中传送的数据流中的每一个字节都编上一个序号.

普通人跑步的要点

- S - FeedzShare
来自: Pure Pleasure - Reborn - FeedzShare  . 发布时间:2010年10月05日,  已有 2 人推荐. 昨天在Twitter上发了十几条 #普通人跑步的要点,很多人觉得有用,于是,就整理到博客上罢. 1) 即便跑步这样貌似简单的事情也需要认真学习才行. 2) 跑步最容易受伤的两个部位是膝关节和脚踝.