Я сейчас читаю эту статью и на пятой странице обсуждаются свойства двоичных куч, которые она считает общеизвестными.Тем не менее, одно из замечаний, которые они делают, - это то, чего я раньше не видел и не могу понять.Авторы утверждают, что если вы получаете сбалансированную двоичную кучу, вы можете перечислить элементы этой кучи в отсортированном порядке за O (log n) времени на элемент, используя стандартный поиск в ширину.Вот их первоначальная формулировка:
В сбалансированной куче любой новый элемент может быть вставлен в логарифмическом времени.Мы можем перечислить элементы кучи по порядку по весу, используя логарифмическое время для генерации каждого элемента, просто используя поиск в ширину.
Я не уверен, что авторы подразумевают под этим.Первое, что приходит на ум, когда они говорят «поиск в ширину», это поиск в ширину элементов дерева, начинающихся с корня, но это не гарантирует перечисления элементов в отсортированном порядке, а также не требует логарифмического времени.за элемент.Например, запуск BFS в этой минимальной куче приводит к тому, что элементы не в порядке, независимо от того, как вы разорвете связи:
1
/ \
10 100
/ \
11 12
Это всегда перечисляет 100 перед 11 или 12, что явно неверно.
Я что-то упустил?Существует ли простой поиск в ширину, который вы можете выполнить в куче, чтобы получить элементы в отсортированном порядке, используя логарифмическое время каждый?Ясно, что вы можете сделать это путем деструктивного изменения кучи, удаляя каждый раз минимальный элемент, но авторы, похоже, намереваются сделать это неразрушающим образом.