splay tree

计算机算法和数据结构中,有各种多样的树,比如AVL树,红黑树,B+树等等,这几种树主要的主要目的是尽量保持平衡,保证即使在最坏情况下,时间复杂度 是O(logN),也就是说,从根节点到最底层的叶子节点,路径不会相差太远。比如B+树,它通过节点的分裂来保持尽量平衡,而且这种树比较散,高度不 高,访问路径都比较短,比较适合在数据库中作索引。


但是今天我要说一说splay树,我不知道中文叫什么名字,也许该叫它“变根树”。Splay树与众不同的是:它并不一味追求平衡,而是追求整体 的效率。当一个节点被访问以后,通过树的旋转,这个节点被移动到最上层,成为新的根节点。旋转以后,这棵树有可能变得很不平衡。但是,同样一个节点如果再 被访问的话,只用一次比较就可以返回了。当这棵树被访问了一段时间以后,常访问的节点就会浮到了上面(靠近根节点),也就是说,splay树天生就有缓存 的功能! 

Splay树的主要理论依据(assumption)是应用程序访问树节点的时候,总是有偏颇性的,有些节点访问得多,有些节点访问得少,不停地 将访问得多的节点移到顶部,对整个访问效率有好处。理论的证明大家可以参考文献。对有些应用来说,例如网络包处理,这种树能起很大的作用,因为在相近的时 间段中,网络包有同样IP的可能性很大。 

但是。Splay树的最大缺点是搜索是可能需要写很多次内存,在现代的CPU中,写内存的开销相对而言是挺大的,所以有一种观点是Splay树不适合用在内核编程中。 

我欣赏splay树的算法,但我更欣赏它背后说折射出来的思想:尽量追求个体利益最大化,并不能保证总体利益的最大化。二叉树不平衡了,有些节点 的访问开销会比平衡的二叉树大,但总体而言,它又提高了效率。一味钻牛角尖,还不如有时候适当的妥协来得更有用一些。计算机算法中,同样的想法也有很多, 比如,Linux地输入输出调度器(IO scheduler)设计,一般的想法就是让磁盘越忙,效率越高,但是2.6的内核中,Anticipatory IO Scheduler采取了等一等的策略,反而得到总体的更高效率。 

从算法中懂得了一些生活的道理,大概也是搞电脑的一些乐趣吧...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值