1. 将所有的点数据,写在内存中。并统计其总数
2. 根据其总数和每个叶子结点最多点数据的数量, 得出叶子结点的数量
long countPerLeaf = pointCount = values.size();
long innerNodeCount = 1;
while (countPerLeaf > maxPointsInLeafNode) {
countPerLeaf = (countPerLeaf+1)/2;
innerNodeCount *= 2;
}
int numLeaves = Math.toIntExact(innerNodeCount);
3. 切分
- 条件一:先计算出切分次数最多的那个维度(根据parentSplits数组),切分次数记为maxNumSplits,如果有一个维度的切分次数小于 (maxNumSplits / 2) ,并且该维度中的最大跟(maxPackedValue)最小值(minPackedValue)不相同,那么令该维度为切分维度
- 条件二:计算出每一个维度中最大值跟最小值的差值,差值最大的作为切分维度
从条件一可以看出这条规则的目的就是保证所有的维度都能被用来切分,当条件一无法选出切分维度时,再考虑条件二。
4. 根据以上信息生成满二叉树。
参考文档
docid与点数据的对应关系