"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como podemos encontrar duplicatas em uma matriz de números de 0 a n-1 em tempo O(n) e espaço O(1)?

Como podemos encontrar duplicatas em uma matriz de números de 0 a n-1 em tempo O(n) e espaço O(1)?

Publicado em 2024-11-08
Navegar:775

How can we find duplicates in an array of numbers from 0 to n-1 in O(n) time and O(1) space?

Encontrando duplicatas no tempo O(n) e no espaço O(1): uma explicação detalhada

O problema colocado envolve a identificação de duplicatas elementos dentro de uma matriz contendo números variando de 0 a n-1. O desafio está em conseguir isso de forma eficiente, dentro da complexidade de tempo O(n) e usando apenas espaço de memória constante (O(1)).

A solução apresentada emprega uma técnica engenhosa que não requer tabelas hash ou outros dados adicionais estruturas. Em vez disso, ele aproveita os valores da própria matriz para identificar e marcar os elementos duplicados.

  1. Permutando a matriz:

    O loop interno permuta a matriz com base na seguinte lógica:

    while A[A[i]] != A[i]
        swap(A[i], A[A[i]])
    end while

    Esta etapa de permutação garante que se um elemento x existir no array, pelo menos uma de suas instâncias será posicionada em A[x]. Isso é crucial para as etapas subsequentes.

  2. Identificando duplicatas:

    O loop externo inspeciona cada elemento A[i]:

    for i := 0 to n - 1
        if A[i] != i then
            print A[i]
        end if
    end for

    Se A[i] != i, significa que i não está presente em seu devido lugar na matriz. Portanto, é um elemento duplicado e é impresso.

  3. Análise de complexidade de tempo:

    A técnica é executada em tempo O(n) . O loop aninhado possui um loop externo que itera n vezes e um loop interno que executa no máximo n - 1 iterações (porque cada troca aproxima um elemento de sua posição correta). Assim, o número total de iterações é limitado por n*(n - 1), que é O(n^2), mas pode ser simplificado para O(n) como n*(n - 1) = n^2 - n = n(n - 1) = n*n - n

  4. Complexidade Espacial Análise:

    O algoritmo usa apenas espaço constante, independente do tamanho da entrada. O principal insight é que o espaço utilizado para as permutações já está presente na matriz de entrada. Nenhuma estrutura de armazenamento adicional é necessária.

  5. Notas adicionais:

    • O algoritmo assume que a matriz contém números inteiros de 0 a n - 1.
    • A complexidade do tempo permanece a mesma, mesmo na presença de duplicatas.
    • O algoritmo é eficiente para matrizes de tamanho pequeno a moderado. Para matrizes grandes, abordagens alternativas que usam estruturas de dados como tabelas hash podem ser mais adequadas.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3