Как повысить эффективность функции, которая находит количество элементов в диапазоне от AVL дерева?

голоса
0

Я пишу функцию, которая выясняет, общее число элементов в дереве AVL по диапазону. Например, аргументы, которые прошли в это «AB» и «аи», то мне нужно, чтобы узнать, сколько элементов они находятся в AVL дерева находится в этом диапазоне.

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

Мой диапазон функций:

void range(AvlTree T, char* k1, char* k2) {
    if ( T == NULL )
        return;

    if ( strcmp(k1, T->Element) < 0 )
        range(T->Left, k1, k2);

    if ( strcmp(k1, T->Element) <= 0 && strcmp(k2, T->Element) >= 0 )
        total++;

    if ( strcmp(k2, T->Element) > 0 )
        range(T->Right, k1, k2);
}
Задан 13/02/2020 в 23:59
источник пользователем
На других языках...                            


1 ответов

голоса
1

Ваш текущий алгоритм имеет сложность O (М + журнал N) , где N представляет собой размер дерева и М представляет собой количество элементов в пределах диапазона . Я не думаю , что вы можете сделать лучше с unaugmented AVL дерева. Таким образом, решение будет включать в себя изменение вашей реализации дерева.

Несложный способ сделать это, чтобы хранить в каждом узле размер поддерева в этом узле. Эта информация может быть обновлена ​​в постоянная время во время вращения дерева. Позже он может быть использован, чтобы пропустить все суб-дерева следующим образом:

int range(AvlTree T, const char* k1, const char* k2) {
    assert(!k1 || !k2 || strcmp(k1, k2) <= 0);
    if(T == NULL)
        return 0;
    if(!k1 && !k2)
        return T->size;
    if(k2 && strcmp(k2, T->Element) < 0)
        return range(T->left, k1, k2);
    if(k1 && strcmp(T->Element, k1) < 0)
        return range(T->right, k1, k2);
    return range(T->left, k1, 0) + 1 + range(T->right, 0, k2);
}

Это дало бы O (журнал N) сложность.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: код не тестировался.

Ответил 14/02/2020 в 00:38
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more