Estou (tolamente, ao que parece) confiante de que a resposta a esta pergunta é não. Então, por que estou perguntando?
Porque o Dr. Aleksandar Prokopec da EPFL em seu curso de programação paralela introduz uma estrutura de dados para a qual ele afirma várias propriedades. Se essas propriedades se mantiverem, parece -me que deve ser possível construir uma árvore binária equilibrada em um tempo melhor que .
Eu não acredito nisso, então estou me perguntando onde está a falha no meu pensamento.
A estrutura de dados é a lista de árvores conc . Em sua forma padrão, parece uma árvore binária normal e vem com uma concat
operação que garante a invariante de que as subárvores esquerda e direita de qualquer nó nunca diferem na altura em mais de um. Como esperado, concat
tem complexidade .
Mas há uma variante de construtor da lista de árvores de concha chamada Append
lista. Essa variante permite diferenças temporárias de altura em subárvores de mais de um. Amortizado os anexos de tempo são reivindicados para esta variante.
Então parece anexar elementos devem ter uma complexidade de .
No entanto, é uma característica dessa variante que sempre que é uma potência de dois e termina com uma árvore binária equilibrada completa (contendo todos os elementos inseridos até o momento). Assim, enquanto desequilíbrios temporários são permitidos, a árvore fica equilibrada a cada potência de 2 inserções.
Nesta variante, uma nova classe de nós, denominada Append
nós, é introduzida e são esses nós cujas subárvores são permitidas diferem em altura em mais de um. No entanto, cada inserções todos esses nós temporários são eliminados.
A página da página da Wikipedia descreve o algoritmo de forma bastante sucinta (veja a descrição da estrutura de dados básica e o append
método em particular).
Então quando é uma potência de dois o nosso custo para a inserção de elementos é e construímos uma árvore binária equilibrada. Ou assim parece.
Em uma pergunta separada, perguntei efetivamente "se posso indicar o número de etapas de um algoritmo para determinados valores depor exemplo, para , Onde é um número inteiro, isso é suficiente para permitir que eu indique a complexidade de todos os valores de ? "
Vejo pela resposta de Yuval Filmus que a resposta é não, mas que "em muitos casos, esperaríamos ser monótono em . Nesse caso, a dedução é válida. "
Parece-me que, neste caso, se inserir elementos tem complexidade e todo Se eu tiver uma árvore binária balanceada, o custo de construir árvores binárias balanceadas com essa abordagem de variante de árvore de concha deve ser .
Então, o que há de errado aqui? Para ser sincero, não vejo o valor amortizadoacrescentar tempo reivindicado para esta variante. Percebo que muitas vezes as inserções custammas quando se olha o que está acontecendo com os Append
nós temporários , o custo total de inserção parece ser amortizado.
Se esse for o caso, a construção de nossa árvore binária equilibrada tem uma surpresa custo.
Desculpe por uma pergunta tão longa e desculpe por não entrar em detalhes sobre o algoritmo em questão - ao invés disso, você pode procurar na Wikipedia.
fonte
append
operação.Respostas:
Se eu entendi sua pergunta corretamente, sim, é claro que você pode criar uma árvore binária balanceada emO ( n ) Tempo. Aqui está um pseudocódigo simples:
Não é difícil ver que esse código é executado em tempo linear e cria uma árvore binária equilibrada.
O que você não pode fazer é criar uma árvore de pesquisa binária equilibrada (ordenada) noO ( n ) tempo (usando apenas comparações nos valores). O algoritmo acima não garante que o valor na raiz seja maior ou igual a todo valor na subárvore esquerda e seja menor ou igual a todo valor na subárvore direita, para cada subárvore.
O algoritmo acima não garante isso, nem a conc-tree (usando anexos e prefixos). Na página da wikipedia, apenas garanteO ( 1 ) tempo amortizado para Anexa e prepends . Para pastilhas, isso só pode garantirO ( logn ) Tempo.
fonte
append
operação de conc-tree . Adicionei outra seção ao final da minha já longa pergunta.Adicionando à resposta de aelguindy: você simplesmente não pode colocar n itens não classificados em nenhum tipo de estrutura de dados e depois enumerá-los em ordem classificada, em tempo melhor que O (n log n) tempo total - porque, se pudesse, poderia classificar uma matriz em tempo melhor que O (n log n).
Se definirmos uma estrutura de dados "classificada" como qualquer estrutura de dados que possa ser enumerada na ordem classificada em O (n), não poderemos criar nenhuma estrutura de dados classificada mais rapidamente do que em O (n log n). Isso incluiria árvores classificadas, equilibradas e desequilibradas.
fonte