Inilah latar belakang untuk pertanyaan ini. Teman-teman dan saya sedang bermain permainan di mana semua orang perlu memberi orang lain hadiah. Untuk menentukan siapa yang harus memberikan hadiah kepada siapa, kami memutuskan untuk menggambar banyak. Tapi masalahnya adalah, seseorang mungkin akhirnya memberikan hadiah sendiri, yang tidak lucu. Anda dapat melihat bahwa jumlah yang diharapkan dari orang yang tidak beruntung tersebut adalah 1, jadi ini cukup sering terjadi.
Untuk tujuan ini, dearrangement tampaknya sangat cocok. Jika saya dapat dengan adil menghasilkan suatu perjanjian sayang, maka saya dapat memilih satu perjanjian sayang dan menggunakannya untuk memutuskan siapa yang memberikan hadiah kepada siapa.
Generasi sayang acak dapat dilakukan dengan metode Las Vegas. Tetapi masalahnya adalah, hanya diharapkan waktu berjalan polinomial. Jadi saya sampai pada masalah ini untuk menemukan kesesuaian saya. Jika saya dapat secara acak memilih i di [1, D_n], dan menggunakan beberapa algoritma waktu polinomial waktu (efisien) terburuk untuk mendapatkan persetujuan kedua, maka hal itu dilakukan.
sumber
Jawaban:
Sebenarnya ini mungkin pertanyaan yang bagus tetapi dirumuskan dengan buruk dalam bentuknya saat ini. Algoritma yang terkenal untuk menghasilkan kekacauan acak memiliki waktu linier yang diharapkan, tapi mungkin itu masalah terbuka untuk menemukan algoritma waktu polinomial kasus terburuk.
Lihat misalnya: http://www.siam.org/proceedings/analco/2008/anl08_022martinezc.pdf (dan slide: http://www.lsi.upc.edu/~conrado/research/talks/analco08.pdf )
sumber
Mengapa tidak, untuk setiap posisi i , pilih secara acak dari semua elemen selain saya ? Misalnya, Anda bisa memilih indeks ke dalam array asli dari [0..n-2] , dan jika Anda mendapatkan j> = i Anda menggunakan j +1 .
sumber