空间分区
目的与常用方法
-
常常需要解决的问题:对象的附近存在哪些其它对象?两两比较对象的位置的蛮力算法,复杂度是O(n^2);
-
用链表储存同格子对象。同一个格子的对象储存在同一个链表中;
-
遍历周围格子:每一个格子只需要遍历其 上方、左上、左侧、左下 四个格子即可;
空间划分
- 分区不依赖于对象:将空间均等地分割为若干个分区。其优点有:
a. 对象可以逐步添加;
b. 内存的使用量恒定。新增对象不会新增分区;
c. 可以在对象可以快速移动; - 分区自适应于对象:二叉空间分割(BSPs)和 k-d trees ,递归地将世界分隔开来,以使得每部分包含数目几乎相同的对象。其优点有:
- 确保分区间的平衡。
- 对整个对象集合进行一次性的分区时更高效;对静态
- 分区不依赖对象,层级依赖对象:四叉树/八叉树:若空间中的对象数目超过指定数目,则继续沿着象限/卦限均等划分为4份/8份;
对象只存在于分区容器中吗?
- 是的,只用分区来储存对象。避免两个集合带来内存开销和复杂性;
- 不是,还有其它容器储存对象。根据不同的需要,以不同的容器遍历对象,会更为快捷便利;