获取最多 'N' 个数组的最多数量的严格均匀分布的元素

Get the most number of strictly evenly spaced elements of an array up to 'N'

我想从一个数组中获取 N 个元素,这样元素之间 均匀分布。作为限制,我还希望始终选择 firstlast 元素。

其他极端情况包括:

环顾四周后,我发现了几个解决这个问题的答案(例如, and here)。它们有效,但我意识到我还有更多未解决的限制。

给出的答案是 松散的 从某种意义上说,如果它们是 off-by-one,那么这没什么大不了的。就我而言,它是,因此标题中的 strict 一词。

例如,给定 L=6 和 N=3,松散形式:
A = [ 0, 1, 2, 3, 4, 5 ]
R = [ 0, 2, 5 ]R = [ 0, 3, 5 ]

然而,这两个结果都不是严格均匀分布的,对于L=6,N=3这样的结果根本不可能。

我正在寻找的是 loose N 变量。换句话说,将 N 递减到最接近问题的数字。
在 L=6,N=3 的情况下,该数字将为 N=2,这将导致 R = [ 0, 5 ].

我可以用前面提到的答案中的答案做一个 trial-and-error 解决方案(简单地测试和递减 N 1),但我试图思考更高效的解决方案。

最后一句话:我正在寻找想法,因此 pseudo-code 完全没问题!但是,我将在 Javascript 中实现它,所以请不要依赖其他 language-specific 功能。

编辑:实际的数组元素可能不是数字(并且没有顺序保证)。

对于给定的 LengthN 的有效值等于 fac+1,其中 facLength-1 的因数。

首先考虑边缘情况:1Length-1 显然是因子,这给出了 N=2N=Length

如果 Length-1 是质数,那么这些是唯一的选择,就像您给出的示例中 Length=6 的情况一样。

对于Length=7{0, 1, 2, 3, 4, 5, 7},因数是(1,2,3,6),所以选项是N=2,3,4,7:

{0, 7}
{0, 3, 7}
{0, 2, 4, 7}
{0, 1, 2, 3 4, 5, 7}

因此,对于给定的 LengthN,确定最大值 M 使得 M <= NM-1Length-1。像这样的东西(Java)会起作用:

static int maxN(final int len, final int n)
{
    int maxN = n;
    while((len-1) % (maxN-1) != 0) 
        maxN -= 1;
    return maxN;
}

可能有更有效的方法。