Метод турниров можно использовать для решения задач, в которых информация, полученная в результате первого прохода по данным, может облегчить последующие проходы.
Поиск наибольшего значения
Если воспользоваться им для поиска наибольшего значения, то потребуется построение бинарного дерева, все элементы которого являются листьями. На каждом уровне два элемента объединены в пару, причем наибольший из двух элементов копируется в родительский узел. Процесс повторяется до достижения корневого узла. Полное дерево турнира для фиксированного набора данных:
Алгоритм поиска второго по величине элемента списка из N значений, требующий около N сравнений
В результате каждого сравнения мы получаем "победителя" и "проигравшего". Проигравших мы забываем, и вверх по дереву двигаются только победители. Всякий элемент, за исключением наибольшего, "проигрывает" в точности в одном сравнении. Поэтому для построения дерева турнира требуется N-1 сравнение.
Второй по величине элемент мог проиграть только наибольшему. Спускаясь по дереву вниз, мы составляем список элементов, проигравших наибольшему. Число таких элементов не превосходит ⌈log2N⌉. Их поиск по дереву потребует ⌈log2N⌉ сравнений; ещё ⌈log2N⌉-1 сравнений необходимо для выбора наибольшего из них. На всю работу уйдёт N+2⌈log2N⌉-2, т.е. O(N) сравнений.
Метод турниров годится и для упорядочивания списка значений. Сортировка куч основана на этом методе.
Метод турниров годится и для упорядочивания списка значений. Сортировка куч основана на этом методе.
Комментарии
Отправить комментарий