我有一个浮点值数组,想要这个值,更重要的是最大四个值的位置。
我最初构建系统是为了遍历数组并以通常的方式找到最大值,方法是将当前位置的值与记录的 max-so-far 进行比较,并在 max-so-far 变化时更新位置变量。这很好用,一个非常简单的 O(n) 算法。后来我才知道,我不仅需要保持最高价值,还需要保持前三四名。我扩展了相同的过程并将 max-so-far 复杂化为一个包含四个 max-so-far 的数组,现在代码很难看。
它仍然可以工作并且仍然足够快,因为只在过程中添加了少量的计算。它仍然有效地遍历数组并检查每个值一次。
我在 MATLAB 中使用返回两个数组、排序列表和随附的原始位置列表的排序函数来执行此操作。通过查看前几个值,我得到了我所需要的。我正在将此功能复制到 C# .NET 2.0 程序中。
我知道我可以对 List 对象做类似的事情,并且 List 对象具有内置的排序例程,但我不相信它可以告诉我原始位置,而这些正是我所追求的。
它一直运行良好,但现在我发现自己想要第五个最大值,并且看到重写目前是一个丑陋的 if 语句混乱的 max-so-far 检查器只会加剧丑陋。添加第五个级别会很好并且不会变慢,但我想问问 SO 社区是否有更好的方法。
对整个列表进行排序比我当前的方法需要更多的计算,但我认为这不是问题,因为列表“只有”一两千个浮点数;因此,如果有一个排序例程可以返回原始位置,那将是理想的。
作为背景,该数组是对一千字节波形文件进行傅立叶变换的结果,因此最大值的位置对应于样本数据的峰值频率。我一直对前四名感到满意,但我认为需要真正收集前五名或六名以获得更准确的样本分类。