Решение запросов о минимальном диапазоне с использованием двоично-индексированных деревьев (деревья Фенвика)

Формально проблема запроса минимального диапазона:

Учитывая массив A [0, N-1], найдите позицию элемента с минимальным значением между любыми двумя заданными индексами.

Теперь стандартным решением является использование дерева сегментов, которое описано здесь. Другая структура данных, используемая для решения запросов диапазона, - это дерево с двоичным индексом (дерево Фенвика), которое намного проще для понимания и программирования.

Может ли задача запроса минимального диапазона быть решена с помощью Binary-Indexed-Trees и как? Приветствуется реализация функции обновления и запроса.


person Ankesh Anand    schedule 27.12.2013    source источник
comment
@Kaustav Я сам пробовал, но решения не нашел. И поэтому я разместил это здесь. Я считаю, что мой вопрос ясен и свидетельствует о исследовательских усилиях. Ваш голос против был резким.   -  person Ankesh Anand    schedule 31.12.2013
comment
Я думаю, что простое наименование алгоритма и запрос его реализации не требуют больших исследовательских усилий. Вы должны были опубликовать то, что пробовали (коды).   -  person Kaustav Ray    schedule 31.12.2013
comment
Разве это не показывает, что я читал и внедрял BIT, и у меня уже есть подход дерева сегментов для решения проблемы? Разве исследования означают для вас только фрагменты кода? Ты не конструктивен, мой друг.   -  person Ankesh Anand    schedule 31.12.2013
comment
Опять же, Ваш ТОЧНЫЙ вопрос: можно ли решить вышеупомянутую проблему с помощью BIT. Если да, то как можно реализовать BIT для решения проблемы? Считаете ли вы это исследовательским усилием? Вы даете ссылку на топкодер дерева сегментов. Это исследовательская работа? Если вы рассматриваете возможность размещения ссылок на алгоритм, исследования и ожидания реализации! Тогда мне очень жаль!   -  person Kaustav Ray    schedule 31.12.2013


Ответы (3)


Несмотря на другие ответы, можно использовать деревья Фенвика для запросов о минимальном диапазоне для любого диапазона. Я разместил здесь подробное объяснение:

Как адаптировать дерево Фенвика к диапазону ответов минимум запросов

Короче говоря, вам нужно поддерживать

  • массив, представляющий реальные значения для узлов [1, N]
  • дерево Фенвика с 0 в качестве корня, где родителем любого узла i является i-(i&-i)
  • дерево Фенвика с N + 1 в качестве корня, где родителем любого узла i является i+(i&-i)

Чтобы запросить любой диапазон в O (log n)

Query(int a, int b) {
  int val = infinity // always holds the known min value for our range

  // Start traversing the first tree, BIT1, from the beginning of range, a
  int i = a
  while (parentOf(i, BIT1) <= b) {
    val = min(val, BIT2[i]) // Note: traversing BIT1, yet looking up values in BIT2
    i = parentOf(i, BIT1)
  }

  // Start traversing the second tree, BIT2, from the end of range, b
  i = b
  while (parentOf(i, BIT2) >= a) {
    val = min(val, BIT1[i]) // Note: traversing BIT2, yet looking up values in BIT1
    i = parentOf(i, BIT2)
  }

  val = min(val, REAL[i])
  return val
}

Чтобы обновить любое значение в амортизированном O (log n), вам необходимо обновить реальный массив и оба дерева. Обновление отдельного дерева:

while (node <= n+1) {
  if (v > tree[node]) {
    if (oldValue == tree[node]) {
      v = min(v, real[node])
      for-each child {
        v = min(v, tree[child])
      }
    } else break
  }
  if (v == tree[node]) break
  tree[node] = v
  node = parentOf(node, tree)
}
person Atte Juvonen    schedule 05.01.2016
comment
Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши друзья-пользователи имели некоторое представление о том, что это такое и почему. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно отключен. - person davejal; 05.01.2016
comment
Разве это не избавляет от главного преимущества деревьев Фенвика, которое заключается в том, что вам не нужна дополнительная память? Если вам нужен отдельный массив равного размера, почему бы просто не использовать кучу? - person Joseph Garvin; 20.07.2021
comment
@JosephGarvin Что вы имеете в виду под кучей? Вы имеете в виду дерево сегментов? - person Atte Juvonen; 20.07.2021

Как правило, дерево Фенвика можно настроить для любой обратимой операции (например, сложения, умножения).

По крайней мере, можно использовать дерево Фенвика для ответа на запросы для интервалов вида 0 ... x (левая точка зафиксирована на 0). Это при условии, что операция обновления до позиции x только снижает сохраненное значение.

person Filip Pavetić    schedule 23.04.2014

Я задавался вопросом о той же проблеме. Однако я думаю, что дерево фенвика не может выполнять минимальные / максимальные запросы, потому что оно полагается на тот факт, что накопительная частота от a до b равна f (b) -f (a-1), и что свойство не действует для функций min / max

person alei    schedule 18.01.2014