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

Автор Burunduk1, история, 9 лет назад, По-русски

Всем хорошего настроения.

Я заметил, что умею из дерева отрезков с реализацией сверху на массиве [0..n) получать его динамическую версию для интервала [0..INT_MAX) изменением всего пары строк: (simple) (dynamic)

По-моему, забавно, решил поделиться. Сам я раньше динамическую версию дерева отрезков всегда на ссылках писал.

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

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

Такое же решение для дерева Фенвика https://sites.google.com/site/indy256/algo_cpp/fenwick_tree_on_map

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

В каких задачах это бывает полезно? Допустим, когда дается массив размером 10^9, но заполнено там только 10^5 элементов, и требуется вычислять сумму элементов с индексами от i до j? (Тут несколько решений, можно еще сжать координаты и i, j до ближайшего сжатого индекса)

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

    Если на запросы нужно отвечать в онлайне, то сжать не получится.

    Но массив размером 10^9 — это редкость. Чаще оно используется как сбалансированное двоичное дерево, То есть, как аналог set'a, где мы еще можем выполнять различные запросы на подотрезках, поиск К-ого элемента, находить количество чисел меньше заданного и тд

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

Я думаю что лучше всегда использовать с ссылками, так как map занимает много памяти. <--- Я здесь кое что перепутал, думал речь о декартовом дереве. :D

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

    Если брать хеш-таблицу с открытой адресацией с отношением заполненности 1.5, то памяти на хеш-таблицу уйдёт меньше, чем на дерево с ссылками: (4 байта на координату + 4 байта на ключ) * 1.5 т.к. пустые ячейки = 12. Дерево с ссылками: 4 байта на ключ, 8*2 (или 4*2) байт на ссылки = 12 (или 20).

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

      Чем теоретизировать, проще, кажется проверить. Можешь закатать рукава и написать свою оптимальную реализацию динамического дерева отрезков на ссылках (указателях, а лучше даже индексах, ибо 64-битность, все дела), и сравнить с реализацией снизу на хеш-таблицах с открытой адресацией? Сравнить интересно по времени.

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

А еще, на ссылках нельзя было написать дерево снизу, а с unordered_map такое сделать можно.

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

Я туплю или v доходит до 2*INT_MAX ?

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

Ну с мапом там константа жёсткая. Помнится, задачи на тимусе ТЛили если так делать.

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

    Ну да, жёсткая... даже с unordered_map, даже если ему reserve сделать.

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

В задаче B мое решение прошло только с ссылками. а с map-ом падает на 7 тесте(память).