学习kdtree的数据结构,和二叉树的思想大体上算是比较相似的。
参考博客:https://blog.csdn.net/dive_shallow/article/details/113136145
建树,一个递归的操作。
这里的删除操作很好理解,分左子树和右子树两种情况。如果是左子树那么找最大的,如果是右子树,则找最小的。
上面这个例子就是说,当走到(13,10)这个节点以后,本来应该往右子树走的,但是右子树为空,那么就返回到上一层,然后程序结束返回(13,10)。但其实(12,8)才是我们所以得到的解,那么此时我们就以(10.1, 10.1)为圆心,到(13,10)的距离为半径画圆,发现(12,8)在圆内,所以此时对(12,8)进行进一步递归,然后继续求解即可。
下面是kdtree使用替罪羊进行增删改查的学习
博客:https://juejin.cn/post/6844904128150241294
Kdtree不能像平衡二叉树那样进行旋转操作。
我的理解就相当于是一种延时操作。
拍平操作,就是对极度不平衡的部分取出来,然后重新构建该树。
这里对平衡的理解:我的理解就是,如果这颗二叉树平衡了,即左右子树的高度相差在1之内,那么这颗二叉树的查询效率非常高,每次对半查询,那么时间复杂度就是logn。
打上标记,也是一种延时的操作。这部分在ikdtree里面也使用到了。
总结像是心灵鸡汤。结束本篇博客。
针对最近邻搜索,最常用在激光slam中,对点云的最近邻点云进行搜索。Kdtree->替罪羊改善数据结构->ikdtree->ivox,随着这些年的进步,最近邻搜索的数据结构越来越完善,最近邻搜索查询的效率越来越高。