Preciso escrever um RandomQueue que permita anexos e remoção aleatória em Constant Time (O (1)).
Meu primeiro pensamento foi apoiá-lo com algum tipo de Array (eu escolhi um ArrayList), pois os arrays têm acesso constante por meio de um índice.
Examinando a documentação, porém, percebi que as adições de ArrayLists são consideradas Tempo constante amortizado, pois uma adição pode exigir uma realocação da matriz subjacente, que é O (n).
O Tempo Constante Amortizado e o Tempo Constante são efetivamente os mesmos ou preciso examinar uma estrutura que não exija uma realocação completa de todas as adições?
Estou perguntando isso porque estruturas baseadas em array de lado (que, até onde eu sei, sempre terão adições de tempo constante amortizado), não consigo pensar em nada que atenda aos requisitos:
- Qualquer coisa baseada em árvore terá, na melhor das hipóteses, acesso O (log n)
- Uma lista vinculada pode potencialmente ter adições de O (1) (se uma referência à cauda for mantida), mas uma remoção aleatória deve ser, na melhor das hipóteses, O (n).
Aqui está a pergunta completa; no caso de ver alguns detalhes importantes:
Projete e implemente um RandomQueue. Esta é uma implementação da interface da Fila, na qual a operação remove () remove um elemento escolhido uniformemente aleatoriamente entre todos os elementos atualmente na fila. (Pense em um RandomQueue como uma bolsa na qual podemos adicionar elementos ou acessar e remover cegamente algum elemento aleatório.) As operações add (x) e remove () em um RandomQueue devem ser executadas em tempo constante por operação.
1/a
chance para uma operação O (n)), mas crescer por um fator constante a > 1
é O (1) amortizado para adição: temos uma (1/a)^n
chance para um O (n) operação, mas essa probabilidade se aproxima de zero para grandes n
.