Двоичное дерево, в котором хранятся частичные суммы: имя и существующие реализации - PullRequest
7 голосов
/ 29 сентября 2010

Рассмотрим последовательность n положительных действительных чисел ( a i ) и ее последовательность частичной суммы ( s i ). Учитывая число x ∊ (0, s n ], мы должны найти i такой, что s i −1 <<em> x ≤ s i . Также мы хотим иметь возможность изменить один из a i без необходимости обновления всех частичных сумм. И то, и другое можно сделать за O (log n ), используя двоичное дерево с a i в качестве значений конечных узлов, а значения неконечных узлов являются суммой значений соответствующих дочерних элементов. Если n известно и исправлено, дерево не должно быть самобалансирующимся и может эффективно храниться в линейном массиве. Кроме того, если n - степень двойки, только 2 n - 1 требуются элементы массива. См. Blue и др., Phys. Rev. E 51 (1995), стр. R867 – R868, для приложения. Учитывая характер проблемы и простоту решения, я Интересно, имеет ли эта структура данных fic name и есть ли существующие реализации (желательно на C ++). Я уже реализовал это сам, но создание структур данных с нуля всегда кажется мне изобретением колеса - я был бы удивлен, если бы никто не делал это раньше.

Ответы [ 2 ]

4 голосов
/ 29 сентября 2010

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

4 голосов
/ 29 сентября 2010

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

...