TreeMap

最优二叉树: 通信领域中的Huffman编码

树这个数据结构一直是我的弱项。其实最开始接触树是通信领域中的Huffman编码+奇怪的数学符号,直接对树吓出了阴影。

之前写过HashMap分析文章,它是通过Obeject的equalshashcode进行放入与查询的。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

参考

  1. https://zh.wikipedia.org/wiki/树_(数据结构)
  2. https://zh.wikipedia.org/wiki/堆_(数据结构)
  3. 优先队列与Huffman编码的很好翻译