为什么[20,...,13,14] .min(2)=> [13,20]?

Ste*_*ann 27 ruby min

[20, 32, 32, 21, 30, 25, 29, 13, 14].min(2)
# => [13, 20]
Run Code Online (Sandbox Code Playgroud)

为什么不呢[13, 14]?怎么我得到我想要的东西,这两个最小的元素(以线性时间)?

doc的句子"如果给出n参数,最少n个元素作为数组返回"对我来说不是很清楚,但我认为它min(2)应该给我最小的两个元素.我找不到太多关于它的信息,但是这个可能是起源的线程似乎与我同意并说它应该返回相同的sort.first(n),它不会:

[20, 32, 32, 21, 30, 25, 29, 13, 14].sort.first(2)
# => [13, 14]
Run Code Online (Sandbox Code Playgroud)

对不起,如果愚蠢的问题和抱歉的"大"的例子,但已经减少 - 删除一个号码(13或14除外)确实给了我[13, 14].

Hel*_*ira 8

我刚刚发布了Ruby问题跟踪系统中的错误解释:

我想我发现了这个问题.举个例子:

[20, 32, 32, 21, 30, 25, 29, 13, 14].min(2)
Run Code Online (Sandbox Code Playgroud)

这将在文件"enum.c"中调用函数"nmin_run",它将"bufmax"设置为我们想要的最小数量(n)的4倍(例如,bufmax为8),然后在第1327行中 将为原始数组的每个元素调用函数"nmin_i".

在函数"nmin_i"中,当缓冲区已满("data-> curlen == data-> bufmax")时,调用函数"nmin_filter".在该示例中,当curlen为8时发生这种情况,因此缓冲区为[20,32,32,21,30,25,29,13]."nmin_filter"将执行快速排序,直到到目前为止n个最小元素位于缓冲区的最左边部分,并且将丢弃剩余的元素,这使得我们在缓冲区中使用[20,13].

现在开始问题了.在"nmin_filter"结束时,限制(显然是为了在缓冲区中存储最大值)被设置为缓冲区中的最后一个值(在示例中为13),这不是真的.然后根据该值"nmin_i"将丢弃所有大于该值的剩余元素(在示例中,丢弃14).然后对缓冲区进行排序并返回:

[13, 20]
Run Code Online (Sandbox Code Playgroud)

因此解决方案是删除所有与限制相关的部分,或者将最后一个数据透视作为限制.