C #: эффективный алгоритм для поиска наибольших m элементов в матрице N x N - PullRequest
2 голосов
/ 02 мая 2009

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

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

Есть идеи?

1 Ответ

5 голосов
/ 02 мая 2009

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

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

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

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

С здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...