版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、javatrccmap源码解析-编程开发技术java treemap源码解析原文出处:liujiacai (jiacai2050)继上篇文章介绍完了 hashmap,这篇文章开始介绍map系列另一个比较重要的类 treemapo大家也许能感觉到,网络上介绍ilashmap的文章比较多,但是介绍 treemap反而不那么多,这里而是冇原因:一方而hashmap的使用场景比较多; 二是相对于hashmap来说,treemap所用到的数拯结构更为复杂。废话不多说, 进入正题。签名(signature)public class treemap<k, v>extends abstractma
2、p<k, v>implements navigablemap<k, v>, cioneable, java. io.serializable口j以看到,相比hashmap來说,treemap多继承了一个接口 navigab 1 emap,也就 是这个接口,决定了 treemap与hashmap的不同:hashmap的key是无序的,treemap的key是有序的接口 navi gab 1 emap首先看下navi gab 1 emap的签名public interface navigablcmap<k, v> extends sortcdmap<k,
3、v>发现 navi gab 1 emap 继承了 sortedmap,再看 sortedmap 的签名sortedmappublic interface sortedmap<k, v> extends map<k, v>sortedmap就像其名字那样,说明这个ifep是有序的。这个顺序一般是指由 comparable接口提供的keys的自然序(natural ordering),或者也可以在创 建sortedmap实例时,指定一个comparator来决定。当我们在用集合视角(collection views, 与 hashmap样,也是由 entryset、k
4、eyset 与 values 方法提供)来迭代(iterate) 个sortedmap实例时会体现出key的顺序。这 里引申下关于comparable comparator的区别(参考这里):comparable 一般表示类的自然序,比如定义一个student类,学号为默认排序 comparator 一般表示类在某种场合下的特殊分类,盂要定制化排序。比如现在想按 照student类的age来排序插入sortedmap中的key的类类都必须继承comparable类(或指定一个 comparator),这样才能确定如何比较(通ii kl. compareto(k2)或 comparator, c
5、ompare (kl, k2)两个 key,否则,在插入时,会报 classcastexccption的异常。此为,sortedmap屮key的顺序性应该与equals 方法保持一致。也就是说 kl. compareto (k2)或 comparator, compare (kl, k2)为 true时,kl. equals (k2)也应该为true。介绍完t sortedmap,再來回到我们 的 navi gab 1 emap 上面来。nav i gab 1 emap 是 jdk1. 6 新增的,在 sortedmap 的基 础上,增加了一些"导航方法”(navigation me
6、thods)來返冋与搜索目标最近 的元素。例如下面这些方法: lowerentry,返冋所有比给定map.entry小的元素 floorentry,返冋所有比给定map.entry小或相等的元素 ceilingentry,返回所冇比给定map.entry大或相等的元素 higherentry,返回所有比给定map.entry大的元素设计理念 (design concept)红黑树(red - black tree)treemap是用红黑树作为基础实现的,红黑树是一种二叉搜索树,让我们在一起 回忆卜'二叉搜索树的一些性质二叉搜索树先看看二叉搜索树(binary search tree,
7、bst)长什么样呢?二叉搜索树相信大家对这个图都不陌生,关键点是:左子树的值小于根节点,右子树的值大于根节点。二叉搜索树的优势在于毎进行一次判断就是能将问题的规模减少一半,所以如果 二叉搜索树是平衡的话,查找元素的时间复杂度为log(n),也就是树的高度。我 这里想到一个比较严肃的问题,如果说二叉搜索树将问题规模减少了一半,那么 三叉搜索树不就将问题规模减少了三分z二,这不是更好嘛,以此类推,我们还 可以冇四叉搜索树,五叉搜索树对于更一般的情况:n个元素,k叉树搜索树的k为多少时效率是最好的? k = 2时吗?k叉搜索树如果大家按照我上面分析,很可能也陷入一个误区,就是三叉搜索树在将问题规模减
8、少三分z二时,所需比较操作的次数是两次(二叉搜索树再将问题规模减少一半时,只需要一次比较操作)我们不能把这两次给忽略了,对于更一般的情况:n个元素,k叉树搜索树需要的平均比较次数为k*log(n/k)。对于极端情况k = n时,k叉树就转化为了线性表了,复杂度也就是0(n) 了,如 果用数学角度來解这个问题,相当于:n为固定值时,k取何值时,k*log(n/k)的取值最小?k*log(n/k)根据对数的运算规则可以转化为ln(n)*k/ln(k), ln(n)为常数,所 以相当于取k/ln(k)的极小值。这个问题对于大一刚学高数的人来说再简单不过 t,我们这里直接看结果当k=e时,k/ln(k
9、)取最小值。自然数e的取值大约为2. 718左右,可以看到二叉树基本上就是这样最优解了。 在nodejs的repl中进行下面的操作function foo(k) return k/math. log(k);> foo (2)2.8853900817779268> foo (3)2. 730717679880512> foo (4)2.8853900817779268> foo (5)3. 1066746727980594貌似k = 3时比k = 2时得到的结果述要小,那也就是说三叉搜索树应该比二叉搜 索树更好些呀,但是为什么二叉树更流行呢?后来在力能的stackover
10、flow ±找 到了答案,主旨如下:现在的cpu可以针对二重逻辑(binary logic)的代码做优化,三 重逻辑会被分解为多个二重逻辑。这样也就大概能理解为什么二叉树这么流行了,就是因为进行一次比较操作,我 们最多可以将问题规模减少一半。好了这里扯的冇点远了,我们再回到红黑树 上来。红黑树性质先看看红黑树的样子:红黑树示例i:图是从wiki截來的,需要说明的一点是:叶子节点为上图中的nil节点,国内一些教材中没冇这个nil节点, 我们在画图时有时也会省略这些nil节点,但是我们需耍明确,当 我们说叶子节点时,指的就是这些nil节点。红黑树通过下面5条规则,保证了树是平衡的:1.
11、树的节点只有红与黑两种颜色2. 根节点为黑色的3. 叶子节点为黑色的4. 红色节点的字节点必定是黑色的5. 从任意一节点出发,到其后继的叶子节点的路径屮,黑色节点的数目相同满足了上面5个条件后,就能够保证:根节点到叶子节点的最长路径不会大于根 节点到叶子最短路径的2倍。其实这个很好理解,主要是用了性质4与5,这 里简单说2假设根节点到叶子节点最短的路径屮,黑色节点数目为b,那么根 据性质5,根节点到叶子节点的最t路径中,黑色节点数目也是b, 最长的情况就是每两个黑色节点屮间有个红色节点(也就是红黑相 间的情况),所以红色节点最多为b1个。这样就能证明上面的 结论了。红黑树操作红黑树旋转示例(没
12、有画111 nil节点)关于红黑树的插入、删除、左旋、右旋这些操作,我觉得最好可以做到可视化,文字表达比 较繁琐,我这里就不在献丑了,网上能找到的也比较多,像vjuly.v的教你透彻了解红 黑树。我这里推荐个swf教学视频(视频为英文,大家不耍害怕,重点是看图?),7分钟 左右,大家可以参考。这里还冇个交互式红黑树的可视化网页,大家可以上去自己操作操 作,插入几个节点,删除几个节点玩玩,看看左旋右旋是怎么玩的。源码剖析由于红黑树的操作我这里不说了,所以这里基本上也就没什么源码可以讲了,因 为这里而重要的算法都是from clr,这里的clr是指cormen, lciscrson, rivest,他们是算法导论的作者,也就是说treemap里面算法都是参照算法导论 的伪代码。因为红黑树是平衡的二叉搜索树,所以其put (包含update操作)、 get> remove的时间复杂度都为log (n) o总结到目前为止,treemap与hashmap的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全新公司法考试题目及答案
- 04729试题及答案全解
- 初级养护工考试题型及答案展示
- 管道施工专项试题及答案展示
- 2026年隔离病区消杀操作规范考试试卷试题及答案
- 2026年电力两票三制落实业务考试试卷试题及答案
- 2026年出入口值守管控实务考试试卷试题及答案
- 2026年统计专业技术中级资格考试(统计工作实务)练习题及答案
- 医废考试题目与精准答案呈现
- 2026年水处理应急处置考试题库及答案
- 《智慧医院医用耗材SPD物流管理流程技术规范》
- 隧道裂缝修补技术完整方案
- 玻璃栈道审批管理办法
- DB53-T 1032-2021 公路隧道超前地质预报技术规程
- 中央储备成品油管理办法
- T/CBMCA 039-2023陶瓷大板岩板装修镶贴应用规范
- 2025年全国HIV抗体诊断试剂临床质量评估报告范文
- 初中物理跨学科教学的创新策略与实践路径
- 2025-2030全球滑移装载机行业风险评估及未来销售趋势预测研究报告
- 快递车辆承包协议书
- 《专业论文选读与写作》教学大纲
评论
0/150
提交评论