看到了一句:B+树在内存中是没有优势的,但是在磁盘上,就显示出来了.求解..

ibmmicrosoft 2012-07-10 11:01:35
RT, 为什么在内存中是没有优势的??
求具体分析...
...全文
670 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ibmmicrosoft 2012-07-10
  • 打赏
  • 举报
回复
还是得靠自己来........
ibmmicrosoft 2012-07-10
  • 打赏
  • 举报
回复
自己顶`~
施工中请绕行 2012-07-10
  • 打赏
  • 举报
回复
为了证明上述观点我还进行了测试,结果如下
程序中用1~1000000作为关键字顺序插入B+树中

内存中存储B+树
阶数为3时 : 2062 ms
阶数为101时 : 4578 ms

外存存储B+树
阶数为3时 : 141328 ms
阶数为101时 : 36234 ms
施工中请绕行 2012-07-10
  • 打赏
  • 举报
回复
举个例子,假设B+树一个节点保存了101个关键字,即使我们只对其中一个关键字操作,也必须将这个B+树节点
整个读取出来,修改完关键字后还需要将节点全部写回内存,上述操作冗余操作了100个关键字。而对于内存来说,寻址时间和读取时间的差距不大,可以近似的理解为同样的操作读取的关键字越少速度越快,而B+树在这种情况下劣势,为了弥补内存中B+树的这种劣势,可以把树的阶数设置小点,减少关键字冗余操作,可以提升内存B+树的效率。

而外存和内存的情况不一样,外存的寻址速度和外存的读取速度差距比较大,举个例子:假设在外存读取4K的数据,其中寻址用了4ms,而真正读取的时间连1ms都不到,此时能提升速度的途径就是,尽量减少读写次数,每次多读多写,而B+树正是基于这种思想设计的数据结构。假设用平衡二叉树实现外存索引,在数据规模相同的情况下,在平衡二叉树中操作一个关键字需要对节点I/O的次数比B+树多很多,并且平衡二叉树节点比B+树节点小,违背了上述的途径,因此效率自然不如B+树。

另外在外存索引中,B+树阶数和它的效率有很大的关系,效率和阶数在一定范围内是成正比的,超过这个范围就是反比了.
V68V6 2012-07-10
  • 打赏
  • 举报
回复
磁盘本身是一个顺序读写快,随机读写慢的物理系统,那么如果想高效的从磁盘中找到数据,势必需要满足一个最重要的条件:减少寻道次数。B+树提出来的背景,就是为了减少查找时产生的磁盘磁道寻道次数。

不过随着磁盘逐渐的淡出,由于磁盘特性而设计的数据结构也会逐渐的被其它数据结构所替代。譬如,现在比较火的LSM树和COLA树。
绿色夹克衫 2012-07-10
  • 打赏
  • 举报
回复
主要原因在于我们用的都是机械硬盘,机械硬盘最慢的就是寻道,寻道之后读取数据的话,2个字节同4K个字节消耗的时间几乎没有区别。用B树可以减少树高,如果用二叉树,也许需要寻道20次,B数也许2次就够了。

不过现在的SSD硬盘,不用寻道,B树就不一定强了。另外在普通机械硬盘上,顺序读写的速度要远远高于随机读写,针对于顺序写,LSM树效率更优。
hz张三 2012-07-10
  • 打赏
  • 举报
回复
因为B+树在内存中会占据大量的空间,内存相对比较宝贵。
硬盘上则空间几乎无限。

33,009

社区成员

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

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