Existe uma estrutura de dados para manter uma lista ordenada que suporta as seguintes operações em tempo amortizado?
GetElement (k) : retorna o ésimo elemento da lista.
InsertAfter (x, y) : insira o novo elemento y na lista imediatamente após x.
Excluir (x) : remova x da lista.
Nas duas últimas operações, você pode assumir que x é fornecido como um ponteiro diretamente na estrutura de dados; InsertElement retorna o ponteiro correspondente para y. InsertAfter (NULL, y) insere y no início da lista.
Por exemplo, começando com uma estrutura de dados vazia, as seguintes operações atualizam a lista ordenada, como mostrado abaixo:
- InsertAfter (NULL, a) [a]
- InsertAfter (NULL, b) [b, a]
- InsertAfter (b, c) [b, c, a]
- InsertAfter (a, d) [b, c, a, d]
- Excluir (c) [b, a, d]
Após essas cinco atualizações, GetElement (2) deve retornar d, e GetElement (3) deve retornar um erro.