Блог пользователя Perlik

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

Начал изучать, возникла пара вопросов. Сдал эту задачу, по времени не сильно отличается от декартова. Так ведь и должно быть? Или может у меня не очень эффективная реализация? Второй вопрос по неявному дереву. Операцию merge по-моему можно делать как в обычном дереве, а вот если в обычном дереве split выполняется через splay, то здесь так нельзя. Нужно ли его делать, как в декартовом? Не ухудшит ли это время работы?
UPD: В неявном все как и в обычном, с этим разобрался, спасибо. Тогда другой вопрос. На вики написано, что эту жуть легко персистентной сделать. Может кто знает как?

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

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

В дереве по неявному ключу split делается через splay, как еще его делать?

По поводу времени работы — в статье Тарьяна и Слейтора показано, что к каждой вершине, к которой ты касаешься, нужно применять splay, тогда будет амортизировано O(logn) на операцию.

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

    Просто если делать через splay, как в обычном, то вот что получается:
    пусть было дерево (это я не неявные ключи расставил, а просто данные сопутствующие)
        1
       /  \
      4   5
     /      \
    2       6
     \
      3
    Пусть мы теперь хотим по ключу 2 отрезать (неявному разумеется), т.е на выходе должны получить в качестве левого дерева 2 — 3. Если через сплей, то найдем 2 и от нее его сделаем, получится такое дерево:
      2
       \
        1
        / \
      4   5
     /      \
    3       6
    В левую часть ответа пойдет 2, а в правую 1 и ее поддерево.

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

Неявное тоже медленнее декартова немного.

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

    Скорее всего где-то неоптимально написано, или забыли где-то сделать Splay. Хотя по отдельности оно не сильно выигрывает. А вот в более сложных структурах.

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

Тоже хочу изучить эту структуру, но столкнулся с трудностями:

  1. Непонятно, как именно называется по-английски вот это "по неявному ключу". Эта идея используется в Rope, но это всё же не то. По-русски кроме е-макса и этой записи в гугле не находится ничего содержательного.
  2. Не мог бы кто-нибудь разбирающийся написать, как выглядят операции split и merge в splay-деревьях по неявному ключу? Моя идея слияния была — просплеить самую правую вершину в левом дереве и самую левую в правом и просто подвесить одну к другой. Но можно же придумать еще много похожих, ну или например просто делать как в декартовом дереве и каждый раз выбирать случайно корень. Про split пока не думал, но там тоже много вариантов, как мне кажется...
  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    1. Splay дерево по неявному ключу представляется точно так же (смысл тот же), как и декартово по неявному. А декартово неявное можно найти на хабре например, английских статей я тоже не видел таких.
    2. Точно так же, как и в обычном. Ничего не надо случайно выбирать. Merge — просплеить самую правую в левом, и правое дерево просто подвесить как правое поддерево. Split — находим вершину с неявным ключом x, просплеим ее. Отрезаем правое поддерево.
»
11 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Кто-то может обьяснить как обрабатывать запросы, связаные с отрезками? И возможно ли это? Например интересно было бы услышать как делать эту, или эту задачи. Хоть по тематике эти задачи даются как для дерамиды, но так как неоднократно писалось что сплей умеет строго больше декартки, то интересно было бы узнать решение с использованием именно сплей дерева.

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

    По идее реверс такой же, как в декартовом: высплитили, реверснули, вмержили. Единственное — нужно быть очень аккуратным с push'ами во время splay.

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

      Наверно меня сейчас страшно заминусуют, но видимо я не могу понять то что для каждого в этой ветке является элементарным. Как хранить в дереве элементы, при этом как-то упорядоченые по их расположению на отрезках и как при сплеях не потерять эту упорядоченость?

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

        А в чем проблема? Splay устроен так, что не меняет обход дерева в смысле порядка вершин даже.

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

      Аккуратность заключается в том, что надо сделать push для всех предков (начиная с корня, это важно) перед тем, как делать Splay. На время оно не влияет, потому что явно посмотрели на потенциал, он не поменялся от этих операций. А время на них просто увеличивает константу при реальном времени каждой отдельной операции.

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

    Offtopic: а что это умеет сплей, чего не умеет декартово дерева?

    Точно знаю, что умеет декартово, но не умеет сплей: одновременный доступ на чтение из нескольких потоков. Splay требуется каждый раз перестраивать, а декартову это нужно только при изменениях.

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

      Амортизироваться в link-cut :)

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

        Где-то слышал, что оно примерно для этого и было придумано.

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

          На самом деле link-cut это не единственная надстройка. Просто она единственная с которой было не лень разобраться кому-то кто разбирался с Splay и связанным из российских олимпиадников.

          P.S. А придумано оно было ради того, чтобы сделать еще одну надстройку над lct и получить быстрый поток.

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

        Аватар в тему, спасибо. Как ни странно, конкретных задач на это с того времени так и не узнал (кроме упомянутого и тут, и там lct).