计算机科学中的树详解(持续更新)

计算机科学中的树

二叉树
▪ 二叉树 ▪ 二叉查找树 ▪ 笛卡尔树 ▪ Top tree
▪ T树
自平衡二叉查找树
▪ AA树 ▪ AVL树 ▪ 红黑树 ▪ 伸展树
▪ 树堆 ▪ 节点大小平衡树
B树
▪ B树 ▪ B+树 ▪ B*树 ▪ Bx树
▪ UB树 ▪ 2-3树 ▪ 2-3-4树 ▪ (a,b)-树
▪ Dancing tree ▪ H树
Trie
▪ 前缀树 ▪ 后缀树 ▪ 基数树
空间划分树
▪ 四叉树 ▪ 八叉树 ▪ k-d树 ▪ vp-树
▪ R树 ▪ R*树 ▪ R+树 ▪ X树
▪ M树 ▪ 线段树 ▪ 希尔伯特R树 ▪ 优先R树
非二叉树
▪ Exponential tree ▪ Fusion tree ▪ 区间树 ▪ PQ tree
▪ Range tree ▪ SPQR tree ▪ Van Emde Boas tree
 
其他类型
▪  ▪ 散列树 ▪ Finger tree ▪ Metric tree
▪ Cover tree ▪ BK-tree ▪ Doubly-chained tree ▪ iDistance
▪ Link-cut tree ▪ 树状数组

1、四叉树

        四叉树(quad-tree)是一种数据结构,是一种每个节点最多有四个子树的数据结构。

        四叉树是在二维图片中定位像素的唯一适合的算法。因为二维空间(图经常被描述的方式)中,平面像素可以重复的被分为四部分,树的深度由图片、计算机内存和图形的复杂度决定。

        四叉树可以用来在数据库中放置和定位文件(称作记录或键)。这一算法通过不停的把要查找的记录分成4部分来进行匹配查找直到仅剩下一条记录为止。

        四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它将已知范围的空间等分成四个相等的子空间,如此递归下去,直至树的层次达到一定深度或者满足某种要求后停止分割。四叉树的结构比较简单,并且当空间数据对象分布比较均匀时,具有比较高的空间数据插入和查询效率,因此四叉树是GIS中常用的空间索引之一。

        下边内容摘自于u010019717

        四叉树来源于将正方形区域分成较小正方形的想法。所以他的应用倾向于 2D搜索或优化算法

                          

        当你沿着四叉树向下移动时,每个正方形被分成四个较小的正方形。

        换一种角度在来看。 通过绘制显示每个节点的子节点的线条,  如果你专注于黑色线条,你可以看到它们形成了一个分支树状结构,每层都有四个分支。

                          

        我们可以使树的视图更加抽象,更接近我们用来表示它的数据结构,方法是将图的树部分展平成二维树图。

            

2、八叉树

        八叉树与四叉树类似,只是将二维拓展到了三维空间

3、BSP树-二叉空间分割树

        参考:https://blog.csdn.net/pleasecallmewhy/article/details/8426183

        不得不说这篇博客博主讲的真的是很详细

4、KD树

        参考https://blog.csdn.net/richard9006/article/details/90058465

        kdtree 可以用于n维,虽然只有2叉, 但是不是空间等分的.

如何构建

        对于Kd-tree这样一棵二叉树,我们首先须要确定如何划分左子树和右子树

  1. 每次对子空间的划分时。如何确定在哪个维度上进行划分;
  • 选择分布比较散的, 数学上讲就是方差比较大的.
  • 统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数

     2.在某个维度上进行划分时,如何确保在这一维度上的划分得到的两个子集合的数量尽量相等

  • 选择数组中的中间的数, 左边的比他小, 右边的比他大, 参考bst
     

以二维平面点(x,y)的集合(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)为例

  • 构建根节点时,x维度上面的方差较大,如上点集合在x维从小到大排序为(2,3),(4,7),(5,4),(7,2),(8,1),(9,6);其中值为(7,2)。(注:2,4,5,7,8,9在数学中的中值为(5 + 7)/2=6,但因该算法的中值需在点集合之内,所以本文中值计算用的是len(points)//2=3, points[3]=(7,2))
  • (2,3),(4,7),(5,4)挂在(7,2)节点的左子树,(8,1),(9,6)挂在(7,2)节点的右子树。
  • 构建(7,2)节点的左子树时,点集合(2,3),(4,7),(5,4)此时的切分维度为y,中值为(5,4)作为分割平面,(2,3)挂在其左子树,(4,7)挂在其右子树。
  • 构建(7,2)节点的右子树时,点集合(8,1),(9,6)此时的切分维度也为y,中值为(9,6)作为分割平面,(8,1)挂在其左子树。至此k-d tree构建完成。

                              

发布了54 篇原创文章 · 获赞 80 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41685265/article/details/104380254