假设我有一组3D点{x[i], i=1,...,n}
和
我有一个数组A
,数组的每个条目A[i]
对应一个点x[i]
的某个度量。如果两个点x[i]
和x[j]
在彼此固定的距离d
之内,那么我们会添加一些由函数f(x[i],x[j])
计算的常量f
到它们在数组中的条目A[i]
和A[j]
。
计算数组A
的条目的直接方法是(在伪代码中)
for i = 1,...,n
A[i] = 0
for i = 1,...,n
for j = i,...,n
if dist(x[i],x[j]) < d
tmp = f(x[i],x[j])
A[i]+= tmp
A[j]+= tmp
如果我还有一个函数find_nb(x[i])
,它会将x[i]
作为参数,并返回距d
点的固定距离x[i]
内的一组点数,包括点x[i]
本身,以及它们的数量,我想知道这个函数如何帮助改善上述算法的运行时性能(如时间和/或空间)?
以下是我的想法:
for i = 1,...,n
A[i] = 0
for i = 1,...,n
(nbs, num) = find_nb(x[i])
for j = 1,...,num
A[i]+=f(x[i],x[nbs[j]])
但它并没有利用每两个点之间的对称性,即我们必须计算两次f(x[i],x[nbs[j]])
A[i]
和A[nbs[j]]
。这是一种浪费。那么这可以改进吗?
谢谢!
答案 0 :(得分:1)
首先,您的代码中存在一个错误:当i = j时,您将tmp两次添加到[i]和[j]中,它们是相同的数组元素。
很明显,函数不会返回一组点,而是一组点的索引,因此改进非常简单:
for i = 1,...,n
(nbs, num) = find_nb(x[i])
for k = 1,...,num
j = nbs [k]
if (j >= i)
tmp = f (x [i], x [j])
A[i]+=tmp
if (j != i)
a [j] += tmp