Uma árvore AVL, com valores repetidos, e a dupla de comparação

0

Pergunta

Eu preciso criar uma estrutura de dados (utilizando, principalmente, árvores AVL) de objetos com dois valores: nível (não exclusivo) e o id (é a única).

Eu preciso suportam a busca de identificação, a impressão por ordem de níveis, bem como a fusão de duas árvores e manter essas funcionalidades com a nova árvore.

Eu já tenho várias soluções em mente, mas eu queria perguntar sobre um específico:

Será que vai funcionar para implementar essa estrutura com uma única árvore AVL onde nós dois primeiro são comparados de acordo com o seu nível e, em seguida, suas identificações? Principalmente eu me esforço para perceber como a fusão de duas árvores trabalho, especialmente no caso temos Uma árvore onde todos os objetos são de nível x e a árvore B, onde todos os objetos são de nível de y.

EDIT: Também para a busca de identificação além disso, haverá uma árvore apenas ordenados por id.

Poderia este método de trabalho?

algorithm avl-tree data-structures
2021-11-23 19:10:15
1

Melhor resposta

2

singular AVL árvore onde nós dois primeiro são comparados de acordo com o seu nível e, em seguida, suas identificações?

Infelizmente não. Se o fizer, você não será capaz de encontrar, eficientemente, um nó com seu id -- você vai precisar olhar através de todas as possíveis 'níveis', que você não especificou então, eu suponho que eles podem ser acoplados.

Eu acho que você pode querer inserir cada nó em duas árvores AVL em vez disso. Uma árvore AVL vai encomendar a nós por nível, os outros pelo seu id. Todas as consultas, inserções, exclusões e mescla pode ser feito em cada árvore, em separado.

Em outras palavras, você teria que criar dois índices sobre seus dados.

Em código:

struct Node {
    int id;
    int level;

    // by id
    int id_bf;
    Node *id_left, *id_right;

    // by level
    int level_bf;
    Node *level_left, *level_right;
};

EDIT: Também para a busca de identificação além disso, haverá uma árvore apenas ordenados por id.

Em seguida, você essencialmente descrever a mesma coisa que eu. No entanto a sua árvore, que é classificada pelo composto (level, id) chave é um desperdício; tudo o que você precisa é de uma árvore ordenada por (level) e uma árvore ordenada por (id) (escalar chaves). Não há necessidade, entre as operações que você forneceu, para ordenar o (level, id) e (id).

2021-11-23 19:29:44

Obrigado pela resposta, infelizmente, eu só esqueci de mencionar que além disso eu vou ter uma árvore ordenada por identificação por esta funcionalidade. Eu pensei em você de solução que eu acabei perguntando sobre esta solução específica de um colega de classe me disse que eu acho que não vai funcionar por causa da fusão,
user3917631

@user3917631: uma árvore ordenada por (nível, id) é também classificada por (nível). Assim, se você tem uma árvore ordenada por (id), além desses, você vai ser capaz de fazer as operações de forma mais eficiente exatamente como eu descrevi. É um desperdício, para ordenar por (nível, id) se tudo o que você precisa é de (nível).
Yakov Galka

Eu sei, eu estou pedindo somente por interesse, ele pode trabalhar? É possível ter duas árvores ordenadas por (nível, id) os dois inteiros e juntá-las em O(n) (n número combinado de nós).
user3917631

@user3917631: sim é possível, e não diferente a partir da fusão de duas árvores ordenadas por qualquer outra coisa. Pesquisa binária árvores são base de comparação, para que eles não "cuidar" do que você está usando para a sua chave, enquanto ele é um totalmente conjunto ordenado. Uma tupla de números inteiros é um definir. Artigo da wikipédia em árvores AVL descreve como fazer eficiente de mesclagem; lá ele é chamado de união. No entanto, você pode querer armazenar nó de altura, em vez de um fator de equilíbrio para fazer isso.
Yakov Galka

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................