假设我们在一个数据集中有n个数据点。对于给定的点,我们可以基于n-1个其他点到该点的距离(度量)对其进行排序。
在我们具有度量距离函数(例如L范数)的情况下,对数据集中的每个点进行计算的最有效方法是什么?
幼稚的方法似乎是依次对每个点的距离列表进行排序,代价是每个点的O(n log n),即所有点的O(n ^ 2 log n)。鉴于每次都要遍历整个树,因此使用k-d树似乎更好。
例如,是否有更好的方法可以利用三角形不等式?
答案 0 :(得分:0)
由于您的输出为O(n ^ 2),因此您将无法获得更好的结果。
我认为这归结为您可以相对于到点q的距离对所有其他点进行排名的速度。如果您有索引结构(例如KD-Tree或R-Tree),则可以使用distance browsing对所有其他点进行排序。 q。
距离浏览的基本思想是拥有一个优先级队列pq,其条目按到q的最小距离排序。 pq可以包含索引结构的点和条目。首先将索引结构的根条目放入pq。然后,您开始从pq弹出元素。当您遇到一个条目(节点)时,可以对其进行解析,然后将子级放回pq中。当遇到一个点时,便找到了q的下一个最近邻居。
总体而言,索引结构具有O(n)个条目。从pq弹出元素是O(log | pq |)。这使运行时为O(n * log | pq |)。问题是平均每个pq中有多少个元素。
我没有证据,但是快速草图让我假设对于L_1和2D空间,队列中元素的平均数量应约为O(sqrt(n))。请注意,队列的大小在很大程度上取决于距离度量和点的大小。
将所有这些放在一起即可构建索引结构(O(n log n)),然后对每个点q排名所有其他点(O(n * log(sqrt(n))))
总体而言,这为您提供了O(n * log(n) + n^2 * log(sqrt(n)))
的运行时间。
但是,回显@MBo:这是一个很大的麻烦,与O(n ^ 2 * log(n))相比没有什么改善