假设我有一个长度n
的数组,我希望从0开始均匀地从中选择k
个值。如果k
除n
,那么这很容易,但是如果k
没有除n
,那么我需要改变值m
我用数组指针递增。你会怎么做?
例如,如果m=1.5
,那么我想选择以下数字:
var arr = array(0,1,2,3,4,5,6,7,8);
arr.every(1.5);
//返回0,1,3,4,6,7
如果k
大于n
答案 0 :(得分:3)
你需要决定规范“k”或“均匀”是否更重要,因为当k不分n时,必须牺牲一个。
答案 1 :(得分:3)
首先,您必须定义“均匀”的含义。如果n = 12且k = 3则则是正确的值(1,5,9)(从1开始)或者说,(1,7,7)。显然他们会有不同的结果。
在某些方面,这类似于缩放/拉伸图像和光栅化线的问题(Wu's algorithm通常用于现代图形中的抗锯齿,但Bresenham仍然很重要且与此更相关)并且可以解决与Bresenham's line algorithm。
1 *
2 **
3 **
4 **
5 **
6*
1234567890
注意:如果这些是正确的值,我实际上没有计算出来。这只是说明性的。
在此示例中,您将在6x10框中创建对角线。查看此算法的另一种方法是说n = 10,k = 6,每次线增量时,你都有一个值(1,2,4,6,8,10)。
但这一切都取决于你如何定义“均匀”。
答案 2 :(得分:1)
你必须向上或向下舍入到最接近的整数。
答案 3 :(得分:1)
你可能会看一下Bresenham's line algorithm,它实际上做了类似的事情。
线算法,以大致均匀的间距选择适当数量的步骤,看起来非常平滑和自然,您只需要将其调整到数组中的样本值,它将使线条处于分步状态。
答案 4 :(得分:1)
保持浮点索引以m为增量。当你需要从数组中获取一个项目时,将索引置于一个整数。
i = 0.0
inc = n/(float)k
while(i < n)
i += inc
solutionSet.add(array[floor(i)])