Junior
Qual é a complexidade assintótica das operações com elementos na lista?
sobes.tech IA
Resposta da IA
Depende do tipo de lista e da operação.
Normalmente consideram-se os seguintes tipos de listas:
- Lista ligada simples
- Lista ligada duplamente
- Array (como caso particular de lista)
Operações:
- Acesso por índice
- Inserção
- Remoção
- Pesquisa de valor
| Operação | Lista ligada simples | Lista ligada duplamente | Array |
|---|---|---|---|
| Acesso por índice | O(n) | O(n) | O(1) |
| Inserção | O(1) (no início) | O(1) (no início/no fim) | O(n) |
| Remoção | O(n) | O(n) | O(n) |
| Pesquisa de valor | O(n) | O(n) | O(n) |
Explicações:
- O(1) (Tempo constante): A operação leva um tempo fixo, independentemente do tamanho da lista. Por exemplo, acesso a um elemento por índice em um array.
- O(n) (Tempo linear): O tempo de execução da operação é proporcional ao tamanho da lista. Por exemplo, procurar um elemento numa lista não ordenada.
- O(log n) (Tempo logarítmico): O tempo de execução aumenta logaritmicamente com o tamanho da lista. Encontra-se frequentemente em operações com dados ordenados (por exemplo, busca binária).
Detalhes:
- Em uma lista ligada simples: Inserção no início - O(1). Inserção no fim ou inserção/remoção por índice requer percorrer a lista até ao elemento desejado, o que dá O(n).
- Em uma lista duplamente ligada: Inserção no início e no fim - O(1). Inserção/remoção numa posição dada - O(1), mas procurar esse nó por valor ou índice - O(n).
- Num array: Acesso por índice - O(1). Inserção ou remoção no meio do array requer deslocar elementos, o que dá O(n). Inserção/remoção no fim, se houver capacidade reservada (por exemplo, em
std::vectorcom certa capacidade), pode ser O(1) em média, mas O(n) no pior caso (reallocação).