У меня есть массив значений с плавающей запятой, и я хочу получить значение и, что более важно, положение максимальных четырех значений.
Первоначально я построил систему для обхода массива и нахождения максимального значения обычным способом, сравнивая значение в текущей позиции с записанным максимальным значением до сих пор, и обновляя переменную позиции, когда максимальный показатель до сих пор изменения. Это сработало хорошо, алгоритм O (n), который был очень прост. Позже я узнал, что мне нужно сохранять не только верхние значения, но и верхние три или четыре. Я расширил ту же процедуру и преобразовал max-so-far в массив из четырех max-so-fars, и теперь код выглядит ужасно.
Это все еще работает и все еще достаточно быстро, потому что к процедуре добавлено только тривиальное количество вычислений. он по-прежнему эффективно просматривает массив и проверяет каждое значение один раз.
Я делаю это в MATLAB с помощью функции сортировки, которая возвращает два массива, отсортированный список и сопровождающий исходный список позиций. Глядя на первые несколько значений, я получаю именно то, что мне нужно. Я копирую эту функциональность в программу на C # .NET 2.0.
Я знаю, что мог бы сделать что-то подобное с объектом List, и что объект List имеет встроенную процедуру сортировки, но я не верю, что он может сказать мне исходные позиции, и это действительно то, что мне нужно ,
Это работало хорошо, но теперь я обнаружил, что хочу получить пятое максимальное значение, и вижу, что переписываю средство проверки максимального уровня, которое в настоящее время представляет собой ужасный беспорядок, если операторы только усугубляют уродство. Было бы неплохо добавить пятый уровень, и я не стал бы медленнее, но я хочу спросить SO-сообщество, есть ли лучший способ.
Сортировка всего списка требует намного больше вычислений, чем мой текущий метод, но я не думаю, что это будет проблемой, поскольку список «всего» одна или две тысячи чисел с плавающей запятой; поэтому, если есть процедура сортировки, которая может вернуть исходные позиции, это было бы идеально.
В качестве фона этот массив является результатом преобразования Фурье для килобайта волнового файла, поэтому позиции максимальных значений соответствуют пиковым частотам данных выборки. Я был доволен четырьмя лучшими, но вижу необходимость собрать пятерку или шестерку для более точной классификации образцов.