Не знаю, лучше ли это на MathOverflow.

Дерево динамического двоичного поиска (я предполагаю, что оно может поддерживать строго сбалансированное дерево, например, красно-черный, также у BST должно быть n ключей, и каждый ключ должен запрашиваться ровно один раз) может принимать минимум O (n) для "хорошо" экземпляра (например, отсортированный запрос) или максимум O (n log n) для «плохого» экземпляра (например, последовательность инвертирования битов).

Если вам это проще, это почти геометрическая настройка, любезно предоставленная Деменом: нарисуйте n точек на плоскости (не равные координаты x или y!). Для каждой пары точек нарисуйте прямоугольник, параллельный оси, с этими двумя точками в качестве углов. Если внутри этого прямоугольника нет другой точки, вы владеете его диагональю, но вы не можете владеть двумя диагоналями, если два прямоугольника перекрываются таким образом, что хотя бы один угол одного находится строго внутри другого. (Совместное использование угла - это нормально! Это несколько уродливое условие, поскольку в противном случае с двумя параллельными диагоналями точек вы можете иметь диагонали O (n ^ 2).) Опять же, можете ли вы владеть между O ( n) диагонали (точки лежат на диагонали) и O (n log n) (точки лежат хаотично)?

Сейчас я сижу над своей магистерской диссертацией почти два года и хотел бы указать namedrop на пример, для которого требуется промежуточное значение, скажем, O (n loglog n). Вы знаете одну? (Ссылка была бы еще лучше.)

Отказ от ответственности: работа почти завершена, это просто для незначительного придаточного предложения, но меня бесит то, что любая из глупых дурацких последовательностей, которые я придумал, попадает либо в максимальный, либо в минимальный случай. Кроме того, это может быть очень удобно для любой последующей работы. Если вы не можете придумать что-то одно, я вообще отбрасываю вопрос. Ведь я уже написал 150 страниц ... :-)

2
Hauke Reddmann 10 Фев 2021 в 18:09

1 ответ

Лучший ответ

Пусть в дереве есть числа 0..(n-1).

Пусть m будет целым числом, близким к log(n) и взаимно простым с n.

Ваш набор данных кратен m по модулю n. То есть m, 2m, ..., 0.

Вы можете легко убедиться, что все числа появляются один раз в последовательности. Вы выполняете циклический переход m ≈ log(n), каждый из которых приводит к тому, что запрос берет log(n) на накладные расходы на границах, что легко o(n). В противном случае n - m раз вам нужно подняться на log(m) уровни, а затем на log(m) уровни, чтобы добраться до значения, которое находится m. Эти шаги занимают O(log(m)) = O(log(log(n))) каждый за общее время O(n log(log(n))).

Достаточно хорошо?

1
btilly 10 Фев 2021 в 16:25