Дерево Фенвика, также известное как двоичное индексированное дерево (BIT), представляет собой мощную структуру данных, используемую для эффективного выполнения запросов диапазона и обновления массива. В этой статье блога мы рассмотрим различные методы инициализации дерева Фенвика с примерами кода. Независимо от того, являетесь ли вы новичком или опытным программистом, это руководство предоставит вам полное понимание инициализации деревьев Фенвика.
Метод 1: инициализация путем последовательной вставки
Самый простой способ инициализировать дерево Фенвика — последовательная вставка значений из входного массива. Вот пример на Python:
def initialize_fenwick_tree(arr):
# Create an empty Fenwick Tree with all zeros
fenwick_tree = [0] * (len(arr) + 1)
for i in range(len(arr)):
update(fenwick_tree, i, arr[i])
return fenwick_tree
def update(fenwick_tree, i, delta):
i += 1
while i < len(fenwick_tree):
fenwick_tree[i] += delta
i += i & -i
Метод 2: инициализация путем копирования массива
Другой подход заключается в инициализации дерева Фенвика путем копирования существующего массива. Этот метод может быть полезен, если у вас есть предварительно заполненный массив и вы хотите создать дерево Фенвика на основе его значений. Вот пример на C++:
void initialize_fenwick_tree(vector<int>& arr, vector<int>& fenwick_tree) {
// Copy the values from the array to the Fenwick Tree
for (int i = 0; i < arr.size(); i++) {
update(fenwick_tree, i, arr[i]);
}
}
void update(vector<int>& fenwick_tree, int i, int delta) {
i += 1;
while (i < fenwick_tree.size()) {
fenwick_tree[i] += delta;
i += i & -i;
}
}
Метод 3: инициализация путем построения из другого дерева Фенвика
Если у вас есть существующее дерево Фенвика, вы можете инициализировать новое дерево Фенвика, построив его на основе значений исходного дерева. Этот метод особенно полезен, если вы хотите создать несколько деревьев Фенвика с одинаковыми начальными значениями. Вот пример на Java:
int[] initializeFenwickTree(int[] originalTree) {
int[] fenwickTree = new int[originalTree.length];
for (int i = 1; i < originalTree.length; i++) {
fenwickTree[i] = originalTree[i];
int parent = i + (i & -i);
if (parent < originalTree.length) {
fenwickTree[parent] += fenwickTree[i];
}
}
return fenwickTree;
}
В этой статье мы рассмотрели три различных метода инициализации дерева Фенвика. Первый метод предполагает последовательную вставку, второй метод копирует существующий массив, а третий метод создает новое дерево из другого дерева Фенвика. В зависимости от ваших требований и имеющихся данных вы можете выбрать наиболее подходящий метод инициализации дерева Фенвика. Понимание этих методов инициализации поможет вам эффективно использовать возможности деревьев Фенвика для эффективного решения различных проблем с запросами диапазона.