Para minha surpresa, não consegui encontrar artigos sobre isso - provavelmente procurei as palavras-chave erradas.
Então, temos uma matriz de qualquer coisa e uma função em seus índices; f é uma permutação.
Como reordenar a matriz de acordo com com memória e tempo de execução o mais próximo de O ( 1 ) e ?
Existem condições adicionais quando essa tarefa se torna mais fácil? Por exemplo, quando conhecemos explicitamente uma função é o inverso de f ?
Conheço um algoritmo que segue ciclos e percorre um ciclo para cada índice para verificar se é o menos do seu ciclo, mas, novamente, ele tem o pior caso tempo de execução de 2 ) , embora, em média, pareça se comportar melhor. ..
Respostas:
Opção 1: trapaceie comprimindo sua permutação em uma estrutura de dados sucinta, consulte Munro http://www.itu.dk/people/ssrao/icalp03-a.pdf .
Opção 2: use uma decomposição do ciclo principal para armazenar sucintamente o perm e use esse espaço extra para trapacear http://oeis.org/A186202
fonte
Se você usar a representação de ciclo da permutação, precisará de 1 elemento de matriz adicional para armazenar o item que está sendo permutado no momento e poderá percorrer os ciclos nas piores operações O (N).
fonte
Qualquer permutação de N itens pode ser convertida em qualquer outra permutação usando trocas N-1 ou menos. O pior caso para esse método pode exigir chamadas O (n ^ 2) para o seu oráculo, F (). Comece da menor posição. Seja x a posição que estamos trocando no momento.
Se F (x)> = x, troque as posições x e F (x). Senão, precisamos descobrir onde o item que estava na posição F (x) está atualmente na lista. Podemos fazer isso com a seguinte iteração. Seja y = F (x). Faça até y> = x: y = F (y): Finalize Do. Agora troque as posições x e y.
fonte
Este método usa o inverso de F e requer n bits de armazenamento. Se x é a posição de um item na matriz original, seja G (x) a posição do item na matriz classificada. Seja B uma matriz de n bits. Defina todos os n bits de B como 0.
FOR x = 1 en-1: SE B (x) == 0 ENTÃO: y = G (x): ATÉ x == y: Troque as posições x e y: B (y) = 1: y = G ( y): LOOP: ENDIF: PRÓXIMO X
Esse método continua trocando o item atualmente na posição x para a posição final do item. O loop interno termina quando o item correto é trocado na posição x. Como cada troca move pelo menos um item para a posição final do item, o loop Do interno não pode exceder mais de n-1 vezes durante a execução. Eu acho que esse método é O (n) tempo e espaço.
fonte