因此,在平衡KD树时,您应该找到中位数,然后将所有较少的元素放在左子树上,而将更大的元素放在右侧。但是如果你有多个与中位数具有相同价值的元素,会发生什么?他们是左边的子树,右边还是丢弃它们?
我问,因为我尝试过做多件事,它会影响我最近邻搜索算法的结果,并且在某些情况下,树的给定部分的所有元素都将具有完全相同的值,因此我在那种情况下不知道如何拆分它们。
答案 0 :(得分:5)
你把它们放在哪里并不重要。最好保持树木平衡。因此,根据需要在左侧放置尽可能多的数量以保持最佳平衡!
如果您当前的搜索半径触及中位数,则必须检查其他部分,这就是您在另一侧处理绑定对象所需的全部内容。这通常比在任何地方附加多个元素的复杂处理便宜。
答案 1 :(得分:2)
在进行搜索样式算法时,在中位数的两边放置等于中位数的元素通常是个好主意。
一种方法是将中位数等于元素放在"同一侧"在你进行分区之前的位置。另一种方法是将第一个放在左边,第二个放在右边,等等。
另一个解决方案是拥有一个只有"计数"的聚集数据结构。相同的东西,而不是单独存储每一个。 (如果他们有额外的状态,那么你可以存储那个额外的状态而不仅仅是一个计数)
我不知道哪种情况适合你的情况。
答案 2 :(得分:0)
这取决于你的目的。
对于精确匹配或范围搜索等问题,双方重复相同值的可能性会使查询复杂化,并且在两个叶子上重复相同的值会增加时间复杂度。
解决方案是在节点上存储所有中位数(等于中位数值的值),无论是左还是右。 kd-tree的大多数变体将medians存储在内部节点上。如果它们碰巧很多,你可以考虑使用另一个(k-1)d树作为中位数。