Изменения

Перейти к: навигация, поиск

Обсуждение участника:KirillKutirev

1 байт добавлено, 16:42, 29 декабря 2013
Алгоритм Хаффмана за O(n) .
== Алгоритм Хаффмана за <tex> O(n) </tex>. ==
У нас есть массив частот (массив, в котором хранится число вхождений каждого символа в строку), отсортированный по возрастанию, нужно построить по нему код Хаффмана за <tex> O(n) </tex> (если массив не отсортирован, то это можно сделать, например, цифровой сортировкой за <tex> O(n) </tex> , что не ухудшит асимптотику).
Идея алгоритма заключается в том, чтобы создать такую очередь с приоритетами, из которой можно было бы доставать два минимума за <tex> O(1) </tex>, после чего в эту же очередь с приоритетами положить их сумму за <tex> O(1) </tex>. У нас уже есть массив с отсортированными частотами, теперь давайте заведем второй массив, в котором мы будем хранить суммы. Несложно заметить, что в этом массиве элементы тоже будут идти по неубыванию. Допустим, что на каком-то шаге сумма получилась меньше чем предыдущая, но это противоречит тому, что на каждом шаге мы выбираем два минимальных (т.е. на каждом последующем шаге мы выбираем два минимума из элементов больших, чем на предыдущем шаге).
40
правок

Навигация