Двоичное дерево, хранящее частичные суммы: название и существующие реализации

Рассмотрим последовательность из n положительных действительных чисел (ai) и ее последовательность частичной суммы (si ). Учитывая число x ∊ (0, sn], мы должны найти i такое, что si−1 ‹ x ≤ si. Также мы хотим иметь возможность изменить один из ai без необходимости обновления всех частичных сумм. Оба можно сделать за O(log n) время с использованием двоичного дерева с ai в качестве значений конечных узлов, а значения нелистовых узлов представляют собой сумму значений соответствующие дочерние элементы. Если n известно и фиксировано, дерево не должно быть самобалансирующимся и может быть эффективно сохранено в виде линейного массива. Кроме того, если n является степенью двойки, требуется только 2 n − 1 элементов массива. См. Blue et al., Phys. Rev. E 51 (1995), стр. R867– R868 для приложения.Учитывая универсальность проблемы и простоту решения, интересно, имеет ли эта структура данных конкретное имя и существуют ли существующие реализации (желательно в С++). Я уже реализовал это сам, но написание структур данных с нуля для меня всегда кажется изобретением велосипеда — я был бы удивлен, если бы никто не сделал этого раньше.


person Philipp    schedule 29.09.2010    source источник


Ответы (2)


В функциональном программировании это известно как дерево пальцев, но, очевидно, существуют реализации на императивных языках. В статьях есть ссылка на сообщение в блоге, объясняющее реализация этой структуры данных на C#, которая может быть вам полезна.

person Daniel    schedule 29.09.2010

Дерево Фенвика (также известное как двоичное индексированное дерево) – это структура данных, которая поддерживает последовательность элементов, и может вычислить кумулятивную сумму любого диапазона последовательных элементов за время O(logn). Изменение значения любого отдельного элемента также требует времени O(logn).

person Branimir    schedule 29.09.2010