Podemos fazer melhor do que

7

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 .O(nregistron)

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 concatoperaçã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, concattem complexidade .O(registron)

Mas há uma variante de construtor da lista de árvores de concha chamada Appendlista. Essa variante permite diferenças temporárias de altura em subárvores de mais de um. AmortizadoO(1 1) os anexos de tempo são reivindicados para esta variante.

Então parece anexar n elementos devem ter uma complexidade de O(n).

No entanto, é uma característica dessa variante que sempre que né 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 Appendnós, é introduzida e são esses nós cujas subárvores são permitidas diferem em altura em mais de um. No entanto, cada2k 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 appendmétodo em particular).

Então quando n é uma potência de dois o nosso custo para a inserção de elementos é O(n)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 denpor exemplo, para n=2k, Onde k é um número inteiro, isso é suficiente para permitir que eu indique a complexidade de todos os valores de n? "

Vejo pela resposta de Yuval Filmus que a resposta é não, mas que "em muitos casos, esperaríamosT ser monótono em n. Nesse caso, a dedução é válida. "

Parece-me que, neste caso, se inserir n elementos tem complexidade O(n) e todo 2k 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 O(n).

Então, o que há de errado aqui? Para ser sincero, não vejo o valor amortizadoO(1 1)acrescentar tempo reivindicado para esta variante. Percebo que muitas vezes as inserções custamO(1 1)mas quando se olha o que está acontecendo com os Appendnós temporários , o custo total de inserção parece ser amortizadoO(registron).

Se esse for o caso, a construção de nossa árvore binária equilibrada tem uma surpresa O(nregistron) 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.

George Hawkins
fonte
2
Pare de anexar novas perguntas à sua pergunta. Se sua pergunta original for respondida, inicie outra pergunta com quaisquer dúvidas ou confusões que você tenha que não estejam diretamente relacionadas à pergunta original. A questão em seu estado atual diverge completamente do título.
Aelguindy 06/11
11
Desculpas por acrescentar aqui no estilo de uma discussão em andamento, em vez de seguir o estilo de perguntas e respostas. Marcarei esta pergunta como respondida e tentarei formular, como uma pergunta separada, minha falha em ser amortizadoO(1 1)na minha análise atual da appendoperação.
George Hawkins
A versão muito expandida desta questão foi consignada ao histórico de edições . Embora eu aprecie muito a resposta de @ gnasher729, estou um pouco surpreso por ter tantos votos, já que a pergunta é definitivamente sobre árvores binárias e não sobre árvores de pesquisa binária . Confundir a complexidade de um com o outro não muda isso. Da mesma forma, a questão foi alterada de árvores binárias para árvores de pesquisa, o que não parece correto.
George Hawkins

Respostas:

7

Se eu entendi sua pergunta corretamente, sim, é claro que você pode criar uma árvore binária balanceada em O(n)Tempo. Aqui está um pseudocódigo simples:

L = [2, 4, 1, 3, 5, 6, 8]
q = Queue()
node root{value = L[0]}
q.add(root)
k = 1
while !q.isEmpty:
  n = q.pop
  if k < L.size:
     n.left = node{value=L[k]}
     k++
     q.add(n.left)
  if k < L.size:
     n.right = node{value=L[k]}
     k++
     q.add(n.right)

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 1)tempo amortizado para Anexa e prepends . Para pastilhas, isso só pode garantirO(registron) Tempo.

aelguindy
fonte
Pela segunda vez em tantos dias, me sinto um tanto estúpido por afirmar com confiança aqui algo que acaba sendo falso, com base em palestras meio lembradas de 20 anos atrás. No seu exemplo, você constrói um tipo de árvore um pouco diferente da árvore conc, onde apenas as folhas têm valores, mas ainda assim apenas aumenta o número de nós (folhas e nós internos) para2n-1 1 então a complexidade permanece como no seu caso O(n). Agora, fico me perguntando se alguma coisa é inteligente sobre a appendoperação de conc-tree . Adicionei outra seção ao final da minha já longa pergunta.
George Hawkins
@GeorgeHawkins não se preocupe, é uma confusão comum :). Meu exemplo não coloca os nós nas folhas, coloca os valores em todos os nós da árvore. Existem várias coisas muito inteligentes sobre as árvores de concerto, e tentar criar uma estrutura de dados que atinja os mesmos limites deve mostrar por que é inteligente. Por exemplo, se você deseja anexos rápidos, pode ficar tentado a usar listas vinculadas, mas como acessa elementos internos rapidamente?
Aelguindy 6/11
Finalmente adicionei minha atualização à minha pergunta. Nesta fase, porém, acho que estou mais interessado no que você chama de astúcia da estrutura de dados da conc-tree. Eu posso ver que as árvores têm vantagens sobre as listas (onde certas características são necessárias), mas não sou tão claro quanto às vantagens das árvores concêntricas em relação a outras implementações de árvores. No final da minha pergunta, adicionei algumas reflexões nesse sentido. Mas tão importante quanto eu ainda não consigo ver o valor amortizadoO(1 1) acrescentar tempo :( Minha análise do que está acontecendo no caso de 2k acrescenta ainda me leva a uma amortização incorreta O(registron).
George Hawkins
2
Sua pergunta está se tornando realmente grande e está divergindo do título da sua pergunta. Eu acho que você pode querer fazer algumas perguntas separadas.
Aelguindy 06/11
2
Quanto à astúcia da conc-tree, tente implementar uma árvore que se mantenha equilibrada com anexos e anexos em O(1 1)tempo amortizado e você verá por que as árvores de palma são inteligentes. Além disso, tente pensar em como implementar o concat para duas árvores binárias.
Aelguindy 06/11
6

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.

gnasher729
fonte