Блог пользователя konstantin.lex

Автор konstantin.lex, 12 лет назад, По-русски

Доброго времени суток! Программисты, которые умеют писать Splay tree — подскажите, по каким статьям/лекциям учились его писать ? Ну и, если можно, подкиньте задач, которые можно сдать пользуясь этой структурой. Заранее благодарен !

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

Я читал Википедию и код от Burunduk1. Splay-деревом решаётся как минимум всё то же самое, что и любым балансирующимся деревом поиска, потому что нет явных ограничений на дерево и splay-дерево, по сути, самое мощное из всех и умеет всё то, что умеют другие. Так что искать в сторону задач на, например, декартово дерево.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    А нельзя ли сылочку на код ? Я видел в исходниках к VK Cup реализацию, на боюсь, там могут быть не все операции

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Судя по плюсикам, не одному мне интересно . Дело в том, что сам уже написал примитивную реализацию, но наверное есть более "традиционный" код, который пишется быстрее, или, например, реализация более ефективная.

»
12 лет назад, # |
Rev. 3   Проголосовать: нравится +3 Проголосовать: не нравится

Учился по лекциям в параллели А+ ЛКШ.Зима. В английской википедии вполне прилично написано. Задачи — казалось бы, любая задача, где нужно двоичное дерево поиска? Я уже говорил, что можно считать себя умеющим писать любую деревянную структура данных если, например, сдал эту задачу с помощью неё.

Другой вопрос — зачем? Сплэй умеет не больше и не меньше, чем любое дерево поиска. Во всяком случае, всё, что он умеет, декартово дерево, наверное, тоже умеет.

UPD: а, блин... Правильно говорят, что я неправ. Мне спать пора.

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

    Сплэй умеет строго больше, чем декартово. Хотя бы Dynamic Connectivitylinking-cutting trees за (жду коммент от Игоря =). А еще он не рандомизирован. Я верю, что можно придумать что-нибудь, что splay может, а декартово так же или проще — нет. Но это всё равно очень вряд ли пригодится на олимпиадах.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Dynamic Connectivity? можно по подробнее здесь?

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +4 Проголосовать: не нравится

        Черт, имелись в виду Linking-Cutting trees. Извиняюсь, в DC Splay вроде никак не помогает

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится +2 Проголосовать: не нравится

          Ок. теперь про Linking-Cutting trees можно подробнее? Из слов сказанных об этом на вики я не понял чем это отличаеся от декартового дерева, с его операциями Merge/Split. Можешь сформуливровать что это такое в паре предложений, суть только, а не то как оно делается.

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится +3 Проголосовать: не нравится

            Splay умеет такую штуку как make_root. Т.е. сделать вершинку корнем дерева. После запроса к какой-то вершине её делают корнем, и если обратиться к ней еще раз, то это произойдет быстрее. Утверждается, что если запросы происходят к K элементам, то среднее время запроса(по всем запросам) будет log K.

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
            Rev. 3   Проголосовать: нравится +6 Проголосовать: не нравится

            Splay — это самобалансирующееся дерево поиска без явных ограничений на структуру. Поэтому мы его можем менять как угодно, а потом вызвать expose() пару раз и всё станет хорошо. Но это лирика.

            LCT, как известно, почему-то работают за операций с деревом поиска. Если написать декартово, время работы будет . А вот если написать splay (который, вроде как, специально для этого и был придуман), то он очень хорошо самортизируется вместе с LCT и суммарное время работы получится , т.е. одна операция со splay будет работать в среднем за O(1) Вроде это получается рассуждениями в стиле "заметим, что если объединить корни splay'ев в большой лес по путям, то получается один большой splay", но я даже не знаю, как амортизировать обычный splay.

            • »
              »
              »
              »
              »
              »
              »
              12 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              Спасибо за попытку, но должен сказать ты очень не ясно отвечаешь на вопросы, создавая еще больше вопросов. "LKT работают за ..." что есть LKT ? подразумевалось LCT? т.е. Linking-Cutting trees? Допустим ты опечатался и я угадал. тогда что означает "LCT работают за..."? имеется в виду серия запросов на разрезание/объединение? Извиняюсь если у меня одного существует такой пробел в знаниях, но я даже не понял что у декартового дерева работает за Log(n)^2

              • »
                »
                »
                »
                »
                »
                »
                »
                12 лет назад, # ^ |
                Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

                Самая главная операция в LCT – expose работает за log(n) splice'ов. Каждый splice работает за O(1) split и merge дерева. Поэтому если пути хранить в декартовом дереве один expose будет работать за log(n) ^ 2. Слейтор и Тарьян доказали, что если использовать Splay, то expose будет работать в среднем за log(n), то есть splice будет выполняться в среднем за O(1)

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится +11 Проголосовать: не нравится

            Поподробней про link-cut trees можно прочитать у их автора :

            http://codeforces.com/blog/entry/2752#comment-63273