N-Tree是什么
N-Tree(N叉树)是一种树形数据结构。
与二叉树最多拥有两个子节点不同,N-Tree允许一个节点拥有多个子节点。
简单来说:
N-Tree就是一个节点可以分成N个子节点的树结构。
例如:
Root
├── Child 1
├── Child 2
├── Child 3
└── Child 4
这里一个节点拥有4个子节点。
因此:
N = 4
就可以形成:
4-ary Tree
如果:
N = 8
则可以形成:
8-ary Tree
N-Tree的基本结构
一个N-Tree可以表示为:
Root
├── Child 1
├── Child 2
├── Child 3
├── ...
└── Child N
例如:
Root
├── A
├── B
├── C
├── D
└── E
这里:
N = 5
因此它是一个5叉树。
N-Tree与二叉树
二叉树规定:
一个节点
↓
最多2个子节点
结构:
Root
/ \
A B
N-Tree则可以拥有更多子节点:
Root
┌──────┼──────┬──────┐
A B C D
因此:
Binary Tree
↓
最多2个Child
N-Tree
↓
最多N个Child
可以理解为:
二叉树实际上也是N-Tree的一种特殊情况。
当:
N = 2
时:
N-Tree = Binary Tree
N-Tree中的N是什么意思
N代表:
一个节点允许拥有的最大子节点数量
例如:
N = 2
表示:
最多2个子节点
N = 4
表示:
最多4个子节点
N = 8
表示:
最多8个子节点
因此:
N-Tree
不是一个固定的树,而是一类树结构。
N-Tree的层级结构
N-Tree同样具有层级结构:
Level 0
↓
Root
Level 1
↓
N个节点
Level 2
↓
N × N个节点
如果每个节点都拥有N个子节点,那么第 d 层理论上最多拥有:
N^d
个节点。
例如:
N = 4
那么:
Level 0 = 1
Level 1 = 4
Level 2 = 16
Level 3 = 64
这与QuadTree的层级结构类似。
N-Tree与空间划分
N-Tree本身只是树结构。
它并不规定:
必须划分空间
但是可以利用N-Tree组织空间数据。
例如:
空间
↓
划分
↓
多个子区域
↓
N-Tree
可以形成空间索引结构。
例如:
World
├── Region A
├── Region B
├── Region C
└── Region D
继续划分:
Region A
├── A1
├── A2
├── A3
└── A4
最终形成:
World
├── A
│ ├── A1
│ ├── A2
│ ├── A3
│ └── A4
│
├── B
│ ├── B1
│ ├── B2
│ ├── B3
│ └── B4
│
├── C
└── D
这就是将N-Tree用于空间组织的一种方式。
N-Tree与QuadTree
QuadTree是N-Tree在二维空间中的一种特殊应用。
QuadTree:
一个区域
↓
4个子区域
也就是:
N = 4
因此可以理解为:
N-Tree
↓
N = 4
↓
QuadTree
QuadTree通常按照二维空间进行:
NW
NE
SW
SE
四个方向划分。
结构:
Root
┌──────┼──────┐
NW NE SW SE
因此:
QuadTree可以看作具有特定空间划分规则的4叉树。
N-Tree与Octree
Octree用于三维空间。
一个三维空间可以沿:
X
Y
Z
三个方向进行划分。
每次可以分成:
2 × 2 × 2
也就是:
8
个子空间。
因此:
Octree
↓
N = 8
结构:
Root
├── Child 1
├── Child 2
├── Child 3
├── Child 4
├── Child 5
├── Child 6
├── Child 7
└── Child 8
因此:
QuadTree
↓
二维空间
↓
4个子区域
Octree
↓
三维空间
↓
8个子区域
QuadTree、Octree与N-Tree
可以简单理解为:
N-Tree
│
├── N = 2
│ └── Binary Tree
│
├── N = 4
│ └── QuadTree
│
└── N = 8
└── Octree
但需要注意:
N-Tree只是描述节点具有多个子节点的树结构,而QuadTree、Octree还包含特定的空间划分规则。
因此不能简单认为:
所有4叉树 = QuadTree
因为普通4叉树不一定用于空间划分。
N-Tree与GIS
GIS中的很多数据都具有天然的空间层级关系。
例如:
世界
↓
国家
↓
省
↓
城市
↓
区域
↓
街道
这种结构可以使用树进行组织:
World
├── Country A
│ ├── Province A1
│ ├── Province A2
│ └── Province A3
│
├── Country B
│ ├── Province B1
│ └── Province B2
│
└── Country C
由于每个节点拥有的子节点数量可能不同,因此可以使用N-Tree思想进行组织。
N-Tree与地图层级
地图本身具有明显的层级结构。
例如:
Map
├── Base Map
├── Roads
├── Buildings
├── POI
└── Labels
某一个Layer还可以继续划分:
Roads
├── Highway
├── National Road
├── Provincial Road
├── County Road
└── Local Road
这种层级关系可以使用N-Tree表示。
N-Tree与空间索引
空间索引的目标是:
快速找到与某个空间范围相关的数据。
N-Tree可以通过空间划分建立层级:
Spatial Data
↓
Root Region
↓
N个子区域
↓
继续划分
↓
Leaf
查询时:
Query
↓
Root
↓
相关Child
↓
相关Child
↓
Leaf
↓
Spatial Objects
这样可以减少不必要的数据扫描。
N-Tree与QuadTree查询
例如地图中有大量Point:
● ● ● ● ●
● ● ● ●
● ● ● ● ●
如果使用QuadTree:
World
↓
4个区域
↓
继续划分
查询:
BBox
时:
BBox
↓
相关区域
↓
相关子区域
↓
Point
N-Tree提供的是这种:
父节点
↓
多个子节点
↓
递归搜索
的通用思想。
N-Tree中的Leaf
树的最底层节点通常称为:
Leaf
即叶子节点。
例如:
Root
├── A
│ ├── A1
│ └── A2
│
├── B
│ ├── B1
│ └── B2
│
└── C
其中:
A1
A2
B1
B2
C
都是Leaf。
在空间索引中,Leaf通常保存:
空间对象
例如:
Leaf
├── Point
├── Point
└── Point
N-Tree中的内部节点
除了Leaf,还有:
Internal Node
即内部节点。
内部节点主要用于:
组织子节点
例如:
Root
├── Child A
├── Child B
├── Child C
└── Child D
Root就是Internal Node。
如果:
Child A
├── A1
├── A2
└── A3
那么Child A同样是Internal Node。
N-Tree的空间递归
如果将N-Tree用于空间划分:
Root
↓
N个区域
↓
每个区域继续划分
↓
N个子区域
可以形成:
Level 0
World
Level 1
A B C D
Level 2
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
这种递归划分是空间树的核心思想。
N-Tree与Bounding Box
GIS中的Geometry通常可以计算:
Bounding Box
例如:
Polygon
↓
BBox
然后可以根据BBox所属的空间区域:
BBox
↓
N-Tree
↓
对应节点
进行索引。
结构可以理解为:
Geometry
↓
Bounding Box
↓
Spatial Node
↓
N-Tree
N-Tree与Geometry
N-Tree本身不是Geometry。
需要区分:
Geometry
↓
描述空间对象
N-Tree
↓
组织空间对象
例如:
Geometry
├── Point
├── LineString
└── Polygon
而:
N-Tree
├── Node
│ ├── Geometry
│ └── Geometry
│
├── Node
│ └── Geometry
│
└── Node
因此:
Geometry负责描述对象是什么样子,N-Tree负责组织和快速定位这些对象。
N-Tree与Feature
GIS中的Feature通常包含:
Feature
├── Geometry
└── Properties
N-Tree可以保存:
Feature
或者保存Feature的空间索引信息:
Feature
↓
Geometry
↓
BBox
↓
N-Tree
例如:
N-Tree
├── Node A
│ ├── Feature 1
│ └── Feature 2
│
├── Node B
│ └── Feature 3
│
└── Node C
├── Feature 4
└── Feature 5
N-Tree与地图渲染
在地图渲染中,可以使用树结构管理不同空间层级的数据:
World
↓
Region
↓
SubRegion
↓
Objects
用户移动地图时:
Viewport
↓
找到相关区域
↓
加载相关节点
↓
渲染数据
例如:
Map
├── Region A
├── Region B
├── Region C
└── Region D
当前视口只覆盖:
Region B
Region C
那么可以只处理:
B
C
而不是整个地图。
N-Tree与LOD
LOD表示:
Level of Detail
即不同距离或缩放级别使用不同的数据精度。
N-Tree天然具有:
Level 0
Level 1
Level 2
Level 3
因此可以配合LOD:
缩小
↓
较高层节点
↓
低精度数据
放大
↓
更深层节点
↓
高精度数据
例如:
World
↓
Country
↓
City
↓
District
↓
Building
地图缩小时:
Country
地图放大后:
City
District
Building
N-Tree与3D空间
N-Tree不仅可以用于二维GIS。
在三维GIS和3D引擎中,可以进一步使用:
Octree
例如:
3D World
↓
8个空间
↓
每个空间继续划分
↓
8个子空间
形成:
World
├── Octant 1
├── Octant 2
├── Octant 3
├── Octant 4
├── Octant 5
├── Octant 6
├── Octant 7
└── Octant 8
因此:
N-Tree
↓
空间树思想
↓
QuadTree
↓
二维
Octree
↓
三维
N-Tree与3D Tiles
大型三维地理数据通常需要进行:
分层
分块
按需加载
LOD
空间索引
这些需求都可以使用树形空间层级表达。
例如:
3D Tiles
↓
Root
↓
Child Tiles
↓
More Detailed Tiles
可以形成类似:
Root
├── Tile A
│ ├── Tile A1
│ ├── Tile A2
│ └── Tile A3
│
├── Tile B
├── Tile C
└── Tile D
这里的核心思想与N-Tree非常接近。
N-Tree的优势
1. 结构灵活
一个节点可以拥有:
2
4
8
16
...
个子节点。
2. 适合层级数据
例如:
国家
↓
省
↓
市
↓
区
3. 适合空间分层
可以将空间划分为:
大区域
↓
中区域
↓
小区域
4. 适合LOD
树的深度可以对应:
Detail Level
5. 适合按需加载
只访问当前需要的节点:
Viewport
↓
相关节点
↓
加载数据
N-Tree的缺点
1. N值需要合理选择
如果N太小:
N = 2
树可能比较深。
如果N太大:
N = 100
每个节点可能拥有大量子节点。
因此需要根据实际场景设计。
2. 不一定适合作为通用空间索引
N-Tree本身没有规定:
如何划分空间
因此真正的GIS空间索引通常需要额外定义:
空间划分规则
Bounding Box
节点容量
深度
查询规则
3. 数据分布可能不均
如果大量对象集中在某个区域:
●●●●●●●●●
某些节点可能非常密集,而其他节点几乎没有数据。
N-Tree与R-Tree
两者都是树形结构,但用途不同。
N-Tree:
一个节点
↓
N个子节点
重点是:
树的分支数量
R-Tree:
空间对象
↓
Bounding Box
↓
层级空间索引
重点是:
空间对象的包围盒组织
简单理解:
| 特性 | N-Tree | R-Tree |
|---|---|---|
| 核心 | N个子节点 | BBox层级 |
| 是否必须空间索引 | 否 | 是 |
| 子节点数量 | N | 通常有范围 |
| 空间划分 | 不规定 | 基于空间对象 |
| GIS应用 | 可用于组织空间数据 | 非常常见 |
| 结构 | 通用树 | 空间索引树 |
N-Tree与QuadTree、Octree关系
可以建立这样的知识体系:
Tree
│
├── Binary Tree
│
└── N-Tree
│
├── 4-way Tree
│ └── QuadTree
│
└── 8-way Tree
└── Octree
如果从空间维度理解:
二维空间
↓
4个子区域
↓
QuadTree
三维空间
↓
8个子区域
↓
Octree
N-Tree的核心应用
N-Tree思想可以应用于:
GIS
地图渲染
空间索引
3D GIS
3D引擎
LOD
地图瓦片
数据分块
场景管理
空间查询
例如一个大型GIS场景:
World
↓
Region
↓
SubRegion
↓
Tile
↓
Feature
↓
Geometry
可以通过树形结构进行管理。
一个简单的GIS空间树
例如一个地图区域:
World
├── Region A
│ ├── Tile A1
│ ├── Tile A2
│ └── Tile A3
│
├── Region B
│ ├── Tile B1
│ └── Tile B2
│
└── Region C
├── Tile C1
├── Tile C2
└── Tile C3
查询:
Viewport
↓
World
↓
Region B
↓
Tile B1
↓
Feature
↓
Geometry
这样就可以避免遍历整个数据集。
N-Tree的核心关系
可以用下面的结构理解:
N-Tree
↓
树形结构
↓
一个节点拥有多个子节点
↓
递归形成层级
用于空间数据时:
空间
↓
空间划分
↓
N个子区域
↓
继续划分
↓
Leaf
↓
空间对象
最终形成:
Spatial Data
↓
N-Tree
↓
Spatial Hierarchy
↓
Spatial Query
↓
Relevant Objects
总结
N-Tree(N叉树)是一种允许一个节点拥有多个子节点的树形数据结构。
核心结构是:
Root
┌──────┼──────┐
A B C D
其中一个节点最多可以拥有:
N
个子节点。
在GIS领域,N-Tree可以作为空间层级组织的基础思想,并可以进一步形成:
N-Tree
↓
4个子区域
↓
QuadTree
以及:
N-Tree
↓
8个子区域
↓
Octree
可以记住:
N-Tree描述的是“一个节点可以拥有N个子节点”的树结构,而QuadTree和Octree是在空间数据中采用特定划分规则的N叉树。
GIS中的典型应用流程可以理解为:
空间数据
↓
空间划分
↓
N-Tree
↓
层级空间索引
↓
Viewport / BBox查询
↓
相关节点
↓
Geometry / Feature
↓
地图渲染
相关工具
使用 IYATools 在线工具快速处理 GIS 数据