2011-01-07 7 views
3

Я пытаюсь создать некоторый ранг дерева на основе AVL дерева с особыми требованиями, позволяет предположить, что у меня есть AVL дерево с узлами, каждый узел имеет 2 поля:Алгоритм для специального случая ранга дерева

id, priority 

мое AVL дерево сортируется по идентификатору, а также у меня есть функция:

foo(currentId, delta) 

который понижает приоритет всех идентификаторов, которые меньше или равны currentId по delta эта функция должна работать со сложностью O (журнал n), , поэтому my qu estion - какая дополнительная информация мне нужна для хранения, чтобы иметь возможность поместить узел с highest priority на любом этапе with complexity O(1) (после использования foo тоже!).

P.S. Я попытался сохранить информацию о максимальном приоритете в правом поддереве, максимальный приоритет в левом поддереве, но после foo ему нужно много изменений. Это займет больше, чем просто O (log n). Заранее благодарим за хорошие идеи или хорошие книги о деревьях.

+0

Любые причины использования деревьев AVL? Кажется, что различные реализации очереди очередности могут быть приятнее здесь. – templatetypedef

+0

@templatetypedef: можете ли вы дать мне ссылку на полезную информацию? не знаю, о чем вы говорите ... – rookie

+0

Вы называете 'foo()' после каждого поп? Какие значения 'delta' вы используете относительно' id'? Прошедший пример того, что вы пытаетесь достичь, поможет нам понять, чего вы пытаетесь достичь здесь. – marcog

ответ

1

Вместо того, чтобы хранить приоритет максимум, который появляется в каждом поддереве, для каждого узел С с родительским р, магазином в гр в разности между максимальным приоритетом в поддереве deg; С и ​​максимальным приоритетом в поддереве р в. Таким образом, вы можете обновить ряд приоритетов в O (log n) времени и по-прежнему найти элемент максимального приоритета в O (log n) времени.

+0

спасибо за ответ, но мне нужно O (1) – rookie

+0

Почему так важно иметь O (1) вместо O (log n), так как вы уже много платите за другие операции над деревом? Если вы хотите, вы можете, вероятно, амортизировать стоимость удаления высокоприоритетных узлов до O (1), если вы платите double за события вставки и звоните в foo. Это просто учет. – jonderry

+0

благодарю вас за идею, но это мне не поможет ... – rookie

Смежные вопросы