获取最多 'N' 个数组的最多数量的严格均匀分布的元素
Get the most number of strictly evenly spaced elements of an array up to 'N'
我想从一个数组中获取 N 个元素,这样元素之间 均匀分布。作为限制,我还希望始终选择 first 和 last 元素。
其他极端情况包括:
N <= 2
这只是 return 第一个和最后一个元素。
N >= Length
这只是 return 完整数组。
环顾四周后,我发现了几个解决这个问题的答案(例如, 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 功能。
编辑:实际的数组元素可能不是数字(并且没有顺序保证)。
对于给定的 Length
,N
的有效值等于 fac+1
,其中 fac
是 Length-1
的因数。
首先考虑边缘情况:1
和 Length-1
显然是因子,这给出了 N=2
和 N=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}
因此,对于给定的 Length
和 N
,确定最大值 M
使得 M <= N
和 M-1
是 Length-1
。像这样的东西(Java)会起作用:
static int maxN(final int len, final int n)
{
int maxN = n;
while((len-1) % (maxN-1) != 0)
maxN -= 1;
return maxN;
}
可能有更有效的方法。
我想从一个数组中获取 N 个元素,这样元素之间 均匀分布。作为限制,我还希望始终选择 first 和 last 元素。
其他极端情况包括:
N <= 2
这只是 return 第一个和最后一个元素。N >= Length
这只是 return 完整数组。
环顾四周后,我发现了几个解决这个问题的答案(例如,
给出的答案是 松散的 从某种意义上说,如果它们是 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 功能。
编辑:实际的数组元素可能不是数字(并且没有顺序保证)。
对于给定的 Length
,N
的有效值等于 fac+1
,其中 fac
是 Length-1
的因数。
首先考虑边缘情况:1
和 Length-1
显然是因子,这给出了 N=2
和 N=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}
因此,对于给定的 Length
和 N
,确定最大值 M
使得 M <= N
和 M-1
是 Length-1
。像这样的东西(Java)会起作用:
static int maxN(final int len, final int n)
{
int maxN = n;
while((len-1) % (maxN-1) != 0)
maxN -= 1;
return maxN;
}
可能有更有效的方法。