在数组中查找 n 个最小值

Posted

技术标签:

【中文标题】在数组中查找 n 个最小值【英文标题】:Find n minimum values in an array 【发布时间】:2013-01-24 08:29:54 【问题描述】:

我正在使用 Matlab 2012a。

我有一个由 k 个单元组成的数组(比如 1000 个)。我需要找到这个数组的 5 个最低值,并且需要对 X 和 Y 中的这些值进行平均。

有人知道怎么做吗?

【问题讨论】:

您对算法有疑问吗?你用的是什么编程语言? 我编辑了,我的错。我正在使用 Matlab 2012a 你的数据结构是什么?您提到“数组”和“单元格”以及“X”和“Y”。假设您有数组 X 和 Y,我创建了一个答案 - 但是重新阅读您的问题我实际上不确定您有什么...您能澄清一下吗? 有比排序更有效的方法。谷歌类似"find highest k values"。 This 似乎很有用。 【参考方案1】:

使用minmaxselection MATLAB MEX 包,专门针对这个问题进行了优化:

a = [2,3,4,7,56,4,21, 64, -2];
mink(a, 2)

<< ans = 
<<    -2  2    

mink(a,4)

<< ans =
<<    -2     2     3     4

【讨论】:

【参考方案2】:

假设您有数组 X 和 Y,并且您想找到五个最低的 Y 值:

[m mi] = sort(Y);
lowest5index = mi(1:5);
lowest5Y = Y(lowest5index);
lowest5X = X(lowest5index);

meanYlowest5 = mean(lowest5Y);
meanXlowest5 = mean(lowest5X);

解释:

带有两个输出参数的sort 命令返回排序后的数组(m)和原始数组中的索引(mi)。前五个索引mi(1:5) 对应于五个最低值。为 X 和 Y 取这些值中的mean 将做我们想要的。如果我不理解您的问题陈述,请澄清您的问题,我会再试一次。

【讨论】:

是的,对不起,我不够清楚。我需要找到 Y 中的 5 个最低值,然后对这 5 个点的 X 和 Y 进行平均!不过你的技术很有趣!如果它派上用场,我会记住这个技巧! 我的技术完全符合您的要求...我已经编辑了代码以使其更加清晰。如果还是不行,你需要更清楚地解释你的数据结构。 好的,这行得通。我认为通过对它们进行排序,您可以修改 X 值。我误解了。谢谢您的帮助! :D【参考方案3】:

如何从最低值到最高值对数组进行sort,然后选择前 5 个值。这些将是您的数组的 5 分钟值。然后对这 5 个值求平均值。

这可能不是最节省内存的方法,但只需 1000 个值就可以完成工作!

希望对你有帮助!

【讨论】:

以上是关于在数组中查找 n 个最小值的主要内容,如果未能解决你的问题,请参考以下文章

在数组中查找最小值和最大值

旋转数组中查找最小值-剑指Offer11

在 MATLAB/Octave 中查找 N 维数组中的所有局部最小值

需要帮助编写一个函数来查找 N 维数组 C++ 中的最大值和最小值

用于查找数组中最小值的分治算法

查找对应于另一个数组中沿轴的最小值的数组