此方法可行,但工作起來非常緩慢。我認爲其中一個問題可能是add_by
方法中的'eval'聲明。用更好的解決方案取代'eval'
一些解釋:每節點對象有三個相關屬性,:x
,:y
和:neighbors
。 :x
和:y
是代表平面座標的整數,:neighbors
是一個數組,節點存儲在@nodes
數組中。我們的目標是找到k
中的每個節點k
在@nodes
中的節點,這些節點位於k
的某個距離d
內,並將它們添加到k
的@neighbors
數組中。
def set_neighbors d
def add_by dim, d
dict = {}
@nodes.each{|k| dict[k] = []}
@nodes.each_index do |k|
up = k+1
down = k-1
while up < @nodes.length and ((eval '@nodes[k].'+ dim) - (eval '@nodes[up].'+dim)).abs <= d
dict[@nodes[k]].push(@nodes[up])
up += 1
end
while down >= 0 and ((eval '@nodes[k].'+ dim) - (eval '@nodes[down].'+dim)).abs <= d
dict[@nodes[k]].push(@nodes[down])
down -= 1
end
end
return dict
end
@nodes.sort_by{|k| k.x}
exis = add_by('x', d)
whys = add_by('y', d)
@nodes.each do |k|
neighbors = exis[k]&whys[k]
k.neighbors = neighbors.select{|j| planar_distance(j,k) <= d}
end
end
我的問題是,你會怎麼做這個沒有任何重複add_by
例程x
和y
或使用eval?
加快了這一點,謝謝! – philosodad 2010-11-12 14:10:47
但是,我應該提到,不在這裏使用.select的原因是因爲節點的數量非常非常大,而且在平面距離內的數量很小。因此,在排序之後從索引中計數是有意義的......在那裏也應該有y排序。 – philosodad 2010-11-23 00:23:06
您提供的代碼實際上沒有排序。 'sort_by'不會進行排序,而是返回一個有序數組。 – 2010-11-23 00:36:26