По словам Рона Вейна, вы можете выполнять разделение и конкатенацию красно-черного дерева в O (log (n)) времени. См. Его артикул: Efficient Implementation of Red-Black Trees with Split and Catenate OperationsRed-Black tree: Split/Concatenate in log (n) time
Однако я все еще не убежден, что время работы раскола действительно верно.
Идея состоит в том, что split использует наихудшие логические (n) конкатенации. Эти concat'ы выполняются быстро, поскольку мы можем найти узел p, помня p, из последней конкатенации.
Проблема заключается в том, что конкатенация запускает алгоритм фиксации (балансировки), который, насколько я знаю, принимает O (log n) (см. Шаг 5 в псевдокоде для конкатенации). Это дает мне время работы log (n) * log (n), так как split будет делать наихудшие log (n) конкатенации.
Рон Вейн, не принимает алгоритм исправления в счет в своей аргументации. Что я пропустил в своем анализе, или неправильный алгоритм?
Вероятно амортизационный аргумент Wein, что подразумевает, что не каждый из fixups действительно дорого –
Хорошая мысль, но это было так, то конечный результат будет по крайней мере, быть в амортизированном времени, а это не так. Так что не думайте, что это так. Но спасибо за ваш ответ –
Это не то, что я имею в виду. Если вы можете связать общую работу по исправлению * внутри * операции разделения (например, с помощью амортизации), вы получите правильную оценку худшего случая для разделения. –