事先我会告诉你我开始学习编程。
问题如下:
我有一个长度为N的数组,我想找到位于半径为R的圆内的所有索引,以一个索引为中心,比如第j个。
我有一个想法,但效率可能非常低。
我会使用以下函数将[0,N-1]中的某个第k个索引转换为笛卡尔坐标:
int x = k / side;
int y= k % side;
其中side是sqrt(N),并测试它是否满足圆的等式:
(x_xC)*(x-xC)+ (y_yC)*(y-yC)<=R*R
其中(xC,yC)是第j个元素的坐标。如果是,我将存储与(x,y)相关联的索引,或者为下一个元素再次执行,直到我掩盖整个数组。
对于超大型阵列来说,这是一个好主意还是效率太低?
答案 0 :(得分:1)
有一种方法可以遍历整个数组,但只有循环中的元素:
计算xC
和yC
。
让y
从yC-R
循环到yC+R
(在数组边界处进行适当的裁剪,并且在R
不是整数的情况下进行适当的舍入) 。
对于每个此类y
,请r=sqrt(R*R-(y-yC)*(y-yC))
让x
从xC-r
循环到xC+r
并进行适当的舍入(并且,再次,正确剪裁在数组边界处。)
将x
和y
转换回数组索引。