Вот аргумент, почему это O (N).
Предположим, что это полная куча, поэтому у каждого нелистового узла есть два потомка. (Это все еще работает, даже если это не так, но это больше раздражает.)
Положите монету на каждый узел дерева. Каждый раз, когда мы делаем обмен, мы собираемся потратить одну из этих монет. (Обратите внимание, что когда элементы меняются местами в куче, монеты не меняются местами с ними.) Если мы запустим MAX-HEAPIFY и останутся монеты, это означает, что мы сделали меньше свопов, чем узлов в дереве. и, таким образом, MAX-HEAPIFY выполняет O(N) свопов.
Утверждение: после завершения работы MAX-HEAPIFY в куче всегда будет хотя бы один путь от корня к листу с монетами на каждом узле пути.
Доказательство по индукции: для кучи с одним узлом нам не нужно делать никаких обменов, поэтому нам не нужно тратить монеты. Таким образом, один узел сохраняет свою монету, и у нас есть полный путь от корня до листа (длиной 1) с целой монетой.
Теперь предположим, что у нас есть куча с левой и правой подкучами, и MAX-HEAPIFY уже выполняется на обеих. Согласно индуктивной гипотезе, у каждого есть хотя бы один путь от корня к листу с монетами на нем, поэтому у нас есть как минимум два пути от корня к листу с монетами, по одному для каждого потомка. Самое большее, что нужно будет пройти корню, чтобы установить свойство MAX-HEAP, — это переместиться до конца дерева. Допустим, он переключается вниз в левое поддерево и переключается полностью вниз. Для каждого обмена нам нужно тратить монету, поэтому мы тратим ее с узла, на который перешел корень.
При этом мы потратили все монеты на один путь от корня к листу, но помните, что изначально у нас было как минимум два! Таким образом, у нас все еще есть путь от корня к листу с монетами после того, как MAX-HEAPIFY запустит всю кучу. Следовательно, MAX-HEAPIFY потратил меньше монет, чем узлов в дереве. Следовательно, количество свопов равно O(N). КЭД.
person
hjfreyer
schedule
11.02.2021