当m是小数时,如何从数组中均匀地选取每个m值?

时间:2009-08-30 01:34:34

标签: algorithm language-agnostic

假设我有一个长度n的数组,我希望从0开始均匀地从中选择k个值。如果kn,那么这很容易,但是如果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

,我不需要知道会发生什么

5 个答案:

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