C#:Эффективный алгоритм поиска наибольших m элементов в матрице N x N

StackOverflow https://stackoverflow.com/questions/814186

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хотел бы знать, существует ли эффективный алгоритм для поиска наибольших m элементов в матрице N x N, с заголовком метода, подобным этому:

double[] greatestValues(double[][] matrix, int numberOfElements);

Есть какие-нибудь идеи?

Это было полезно?

Решение

Если вы рассматриваете матрицу N x N как массив из N x N элементов, вы можете применить один из следующих методов:

Прямое применение алгоритма выбора на основе быстрой сортировки Быстрый алгоритм выбора на основе сортировки может быть использован для поиска k наименьших или k наибольших элементов.Чтобы найти k наименьших элементов найдите k-й наименьший элемент, используя алгоритм быстрой сортировки на основе медианы медиан .После разбиения, которое находит k-й наименьший элемент, все элементы, меньшие, чем k-й меньший элемент, будут присутствовать слева к k-му элементу и всем элементам более крупным будет присутствовать непосредственно к k-му наименьшему элементу.Таким образом, все элементы от 1-го до k-го элемента включительно составляют k наименьших элементов.Временная сложность линейна по n, общему количеству элементов.

Решения, основанные на структуре данных Другой простой метод заключается в добавлении каждого элемента списка в упорядоченную заданную структуру данных, такую как куча или самобалансирующееся бинарное дерево поиска, состоящее не более чем из k элементов.Всякий раз, когда структура данных содержит более k элементов, мы удаляем самый большой элемент, что может быть сделано за O (log k) времени.Каждая операция вставки также занимает O (log k) времени, что приводит к Общему времени O (nlog k).

Можно преобразовать список в кучу за Θ(n) времени, а затем обойти кучу, используя модифицированный Алгоритм поиска по ширине, который присваивает элементам приоритет Очередь (вместо обычной очереди , которая обычно используется в BFS), и завершите сканирование после обхода ровно k элементов.Поскольку размер очереди остается O (k) на протяжении всего обхода, для завершения потребуется O (klog k) времени, что приведет к ограничению по времени O (n + klog k) для этого алгоритма.

От здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top