Pular para o conteúdo

Algoritmos e estruturas de dados · Estruturas de dados · 5 min de leitura

Arrays e strings

A estrutura mais básica: acesso por índice em O(1), mas inserir no meio desloca tudo. E por que concatenar strings num laço pode virar O(n²).

[3] = 4 → [4] livre: move1[2] = 9 → [3] = 4: move2[1] = 3 → [2] = 9: move3inserir 5 → [1] = 3: grava4[0] = 7[0] = 7[1] = 3 — vira 5[1] = 3vira 5[2] = 9 — vira 3[2] = 9vira 3[3] = 4 — vira 9[3] = 4vira 9[4] livre — vira 4[4] livrevira 4inserir 5 — no índice 1inserir 5no índice 1

Arraste para o lado para ver o diagrama inteiro.

Os deslocamentos começam pelo fim (passos 1 a 3) para não sobrescrever nada; só então o 5 é gravado (passo 4). Quanto mais perto do início, mais elementos andam: O(n).

Memória contígua

Um array guarda os elementos lado a lado na memória. Por isso o endereço de a[i] é uma conta (início + i × tamanho) e o acesso é O(1). O preço: inserir ou remover no meio exige deslocar tudo o que vem depois — O(n).

Arrays dinâmicos

ArrayList/MutableList no Kotlin, Array no Swift e o array do JavaScript crescem sozinhos: quando enchem, alocam um bloco maior (em geral 1,5× ou 2×) e copiam. Uma cópia custa O(n), mas acontece tão raramente que adicionar no fim sai O(1) amortizado.

Strings imutáveis

Em Kotlin/Java e Swift, cada s += x pode criar uma string nova e copiar a antiga. Num laço de n voltas isso soma 1 + 2 + … + n cópias = O(n²). Use buildString/StringBuilder, joinToString ou, em TypeScript, array.join("").

No código: antes e depois

✗ AntesKotlin
fun csv(linhas: List<String>): String {
    var s = ""
    for (l in linhas) s += l + "\n" // copia tudo a cada volta
    return s
}
✓ DepoisKotlin
fun csv(linhas: List<String>): String = buildString {
    for (l in linhas) append(l).append('\n') // um buffer só, O(n)
}
// ou, mais curto: linhas.joinToString("\n", postfix = "\n")

buildString usa um StringBuilder por baixo: cresce como um array dinâmico e copia cada caractere poucas vezes.

Em resumo

Exercícios

Responda e confira na hora. Complexidades valem com ou sem espaços, como O(n log n).

  1. Qual a complexidade de ler o elemento de índice i de um array?

    Ver a solução

    Resposta: O(1). O endereço é calculado com uma conta (início + i × tamanho), independente de n.

  2. Qual a complexidade de inserir no início de um array com n elementos?

    Ver a solução

    Resposta: O(n). Todos os n elementos precisam andar uma posição para abrir espaço.

  3. Num laço de 100 voltas, cada s += "x" copia a string inteira: 1 caractere na 1ª volta, 2 na 2ª, …, 100 na 100ª. Quantos caracteres são copiados no total?

    Ver a solução

    Resposta: 5050. 1 + 2 + … + n = n(n + 1)/2 = 100 × 101 / 2 = 5050 — cresce como n², por isso O(n²).

Perguntar à IA

Monte um prompt pronto sobre Arrays e strings na sua linguagem e no seu caso, e abra num chat gratuito.

ChatGPT Claude Perplexity

O prompt vai para o site que você escolher. Não cole senhas, tokens nem dados reais de clientes. Para Gemini e outros, copie e cole.

Referências

Continue aprendendo

Todos os temas de algoritmos e estruturas de dados →