Existe um algoritmo eficiente para encontrar o i-ésimo arranjo?

9

Aqui está o plano de fundo para esta pergunta. Amigos e eu estávamos jogando um jogo em que todos precisam dar algum presente a outras pessoas. Para determinar quem deve dar um presente a quem, decidimos sortear. Mas o problema é que alguém pode acabar dando presentes a si mesmo, o que não é engraçado. Você pode ver que o número esperado de pessoas tão infelizes é 1, então isso acontece com bastante frequência.

Para esse propósito, o arranjo caro parece ser um ótimo ajuste. Se eu conseguir gerar um arranjo justo, posso escolher um arranjo caro e usá-lo para decidir quem dá presentes a quem.

A geração de arranjos aleatórios poderia ser feita com o método Las Vegas. Mas o problema é que ele só esperava tempo de execução polinomial. Então, cheguei a esse problema de encontrar o i-ésimo arranjo. Se eu puder escolher um i aleatoriamente em [1, D_n] e usar algum algoritmo de tempo polinomial de pior caso (eficiente) para obter o i-ésimo arranjo, então está feito.

Santa Zhang
fonte
11
Poderia, por favor, explicar a motivação para a pergunta? ou seja, por que você está interessado nesta questão?
Kaveh
2
Talvez você queira brincar de papai noel em segredo e não está disposto a se arriscar :)
Lev Reyzin
Você poderia adicionar uma linha sobre o que você quer dizer com arranjo?
precisa

Respostas:

9

Na verdade, essa é uma boa pergunta, mas está mal formulada em sua forma atual. Os algoritmos conhecidos para gerar perturbações aleatórias têm tempo esperado linear, mas talvez seja um problema em aberto encontrar o pior algoritmo de tempo polinomial.

Veja, por exemplo: http://www.siam.org/proceedings/analco/2008/anl08_022martinezc.pdf (e slides: http://www.lsi.upc.edu/~conrado/research/talks/analco08.pdf )

didest
fonte
Esta parece ser a resposta certa para mim.
Suresh Venkat
10
A recorrência! N = (n − 1) (! (N − 1) +! (N − 2)) descrita em en.wikipedia.org/wiki/Derangement imediatamente leva a um algoritmo polinomial de pior caso aleatoriamente geração?
David Eppstein
Sim você está certo. Eu estava pensando que há um pequeno problema, porque você deve ser capaz de gerar números aleatórios em subconjuntos arbitrários de {1, ..., n} no pior momento possível, mas isso é fácil de fazer.
didest
0

Por que não, para cada posição i , escolhe aleatoriamente todos os elementos que não sejam i ? Por exemplo, você pode escolher um índice na matriz original de [0..n-2] e, se você obtiver j> = i, usará j + 1 .

tapinha
fonte
3
Isso torna todos os desarranjos igualmente prováveis?
David Eppstein
oh, bom ponto - isso colocaria os elementos mais tarde na matriz, preferencialmente mais cedo na matriz. Se você preenchesse os slots na matriz de destino em uma ordem aleatória, todos os distúrbios seriam igualmente prováveis ​​(por simetria).
pat