Estrutura de dados para pesquisa eficiente, quando inserções e remoções são apenas unilaterais

8

Eu preciso de uma estrutura de dados para armazenar um número  de elementos, cada um dos quais está associado a algum tempo diferente nti .n varia e, embora tenha um limite superior teórico, há muitas ordens de magnitude maiores do que o que é normalmente usado.

Através da minha inscrição, posso garantir que:

  • Os elementos inseridos são sempre mais recentes que todos os elementos existentes, ou seja, se um elemento associado a um tempo tˇ é inserido, então tˇ>tii1,,n. Os elementos são inseridos um por um.

  • Somente os elementos mais antigos são removidos, ou seja, se o elemento j é removido, então tj<ti i{1,,n}{j}. As remoções acontecem principalmente uma a uma, mas não há dano direto se a remoção de um elemento for atrasada, desde que a fração de elementos armazenados espuriosamente permaneça menor que 1.

  • Além de inserir e remover, a única coisa que preciso fazer é encontrar os dois elementos vizinhos por algum tempo t~ com miniti<t~<maxiti. Com outras palavras, preciso encontrar os dois elementos  e  modo que e ∄ l ∈ \ {1,…, n \}: t_j <t_l <t_k .jktj<t~<tkl{1,,n}:tj<tl<tk

Meus critérios para a estrutura de dados são:

  1. A localização dos elementos descritos acima deve ser o mais rápido possível.
  2. A inserção e remoção deve ser rápida.
  3. A estrutura de dados é comparativamente simples de implementar.

Desde que não falemos de um pequeno deslocamento de tempo de execução, cada critério tem prioridade sobre o próximo.

Até agora, minha pesquisa resultou em que a resposta provavelmente é algum tipo de árvore de pesquisa com auto-equilíbrio, mas não encontrei nenhuma informação sobre qual delas é melhor para o caso de inserção ou exclusão unilateral, e provavelmente me custará um tempo considerável para me descobrir. Além disso, só encontrei informações incompletas sobre o quão bem as árvores se auto-organizam e com que rapidez (por exemplo, as árvores AVL se auto-organizam mais rigidamente do que as árvores vermelho-preto), sem falar em como isso é afetado pela inserção ou exclusão unilateral.

Wrzlprmft
fonte
4
Isso é apenas uma pesquisa binária do tipo matriz em uma fila.
O11c 08/04/19

Respostas:

5

Armazene os elementos como uma sequência, classificados aumentando o carimbo de data / hora. Use a pesquisa binária para encontrar o local onde ocorreria se estivesse na matriz; então você pode encontrar facilmente os dois elementos vizinhos. A localização dos dois elementos vizinhos pode ser feita em .t~O(lgn)

Você também precisará anexar ao final da sequência e excluir desde o início. Assim, basicamente você precisa de uma fila.

Existem construções padrão para uma fila. Por exemplo, você pode armazená-los em uma matriz, com operações de inserção e exclusão de tempo amortizadas . Basicamente, você tem uma matriz para os elementos da sequência e um índice inicial (para o início da sequência) e um índice final (para o final da sequência). Para excluir desde o início, aumente o índice inicial. Para adicionar ao final, aumente o índice final; se isso ultrapassar o final da matriz existente, aloque uma nova matriz com o dobro do tamanho e copie para a nova matriz.O(1)

Como alternativa: você pode armazenar os elementos em uma árvore binária equilibrada. Isso atingirá o pior tempo para todas as operações.O(lgn)

DW
fonte