利用邻居查找和对称性来获得运行时性能?

时间:2014-04-06 18:47:27

标签: algorithm

假设我有一组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]]。这是一种浪费。那么这可以改进吗?

谢谢!

1 个答案:

答案 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