TreeMap
最优二叉树: 通信领域中的Huffman编码
树这个数据结构一直是我的弱项。其实最开始接触树是通信领域中的Huffman编码+奇怪的数学符号,直接对树吓出了阴影。
之前写过HashMap分析文章,它是通过Obeject的equals
与hashcode
进行放入与查询的。HashMap内部通过数组进行存储,Index基于Hash值,由于hash算法的“随机”均匀性,因此,如果对KeySet进行遍历的话,将是不可预料的。
而TreeMap基于树,准确的说是基于红黑树实现了Map接口。
Huffman的思想在很多场景都有遇到过,比如在Switch/Case/If条件链中,概率高的条件放到前面,程序的执行会更快。
基础知识复习
树的定义
树是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
- 每个节点有零个或多个子节点;
- 没有父节点的节点称为根节点;
- 每一个非根节点有且只有一个父节点;
- 除了根节点外,每个子节点可以分为多个不相交的子树
上面定义可以看出,树不一定有2个Child,也不是父与子、兄弟一定要满足特定的大小关系
u5Y-gzU-CmQ-nge
堆的定义
n个元素序列{k1,k2...ki...kn},当且仅当满足下列关系时称之为堆: (ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2)
这种数据结构具有以下性质。
- 任意节点小于(或大于)它的所有后裔,最小元(或最大元)在堆的根上(堆序性)。
- 堆总是一棵完全树。即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右填入
这里也没有说一定是二叉堆,但是平时一般说堆都是特指二叉堆
TreeMap、TreeSet、HashMap 与 PriorityQueue 的对比
计算TopN
参考