Menghitung permutasi yang unsur-unsurnya tidak persis indeksnya ± M


13

Saya baru-baru ini ditanya masalah ini dalam wawancara algoritmik dan gagal menyelesaikannya.

Diberikan dua nilai N dan M, Anda harus menghitung jumlah permutasi dengan panjang N (menggunakan angka dari 1 hingga N) sedemikian sehingga perbedaan absolut antara angka dalam permutasi dan posisinya dalam permutasi tidak sama dengan M.

Contoh - Jika N = 3 dan M = 1 maka, 1 2 3 dan 3 2 1 adalah permutasi yang valid tetapi 1 3 2 tidak valid karena angka 3 ada di posisi 2 dan perbedaannya adalah M.

Saya mencoba pemrograman NxM Dynamic tetapi gagal membentuk perulangan yang tidak menghitung pengulangan.


Anda mungkin dapat memperoleh formula menggunakan inklusi-pengecualian. Kasus secara klasik dikenal sebagai gangguan . M=0
Yuval Filmus

1
Ini adalah contoh khusus penghitungan kecocokan sempurna dalam grafik bipartit, masalah yang . Tentu saja, kasus khusus ini bisa lebih mudah. #P
Yuval Filmus

Saya sudah mencoba Inklusi-pengecualian tetapi tidak membuat kemajuan.
Gena

Anda dapat mencoba mengadaptasi metode untuk menghitung kekacauan . Saya tidak tahu apakah itu akan membawa Anda ke mana saja. Anda juga dapat mencoba memperbaiki M = 1 (katakanlah), menghitung angka untuk nilai kecil N (N = 1,2,3,4,5,6,7,8) dengan brute force, dan kemudian mencari urutan yang sesuai di OEIS dengan harapan Anda menemukan sesuatu yang bermanfaat.
DW

Apa rekursi yang Anda atur? Apa yang Anda maksud dengan "hitung pengulangan"?
Raphael

Jawaban:


2

Hal pertama yang akan saya tanyakan ketika diberikan pertanyaan ini adalah

Apakah Anda ingin algoritma waktu polinomial?

dan kemudian saya berharap jawabannya adalah 'tidak'. Saya menduga bahwa masalah ini NP-keras, karena alasan berikut:

Pendekatan alami untuk masalah ini adalah dengan mempertimbangkan penempatan nomor pertama dan mendapatkan formula rekursif untuk menempatkan yang lain. Ini bekerja dengan baik untuk kasus (yaitu menghitung jumlah gangguan), karena tidak masalah pada posisi apa Anda menempatkan angka pertama, karena hanya ada satu posisi 'ilegal' dari setiap angka. Dengan kata lain, pendekatan ini mengarah ke subproblem independen.M=0

Untuk , ini tidak begitu sederhana, karena kita sekarang dapat memiliki posisi ilegal untuk beberapa angka. Posisi mana yang tetap dalam subproblem sekarang relevan dengan solusi subproblem. Hanya mempertimbangkan jumlah posisi 'ilegal' tidak cukup, karena 'rantai' angka yang berbagi posisi ilegal diperlukan untuk menentukan struktur sub-masalah dari sub-masalah tersebut. Jadi, pendekatan ini pada dasarnya mengarah ke subproblem berikut:M>02

Diberikan himpunan , himpunan keduanya berukuran paling banyak dan bilangan alami , hitung jumlah kecocokan sempurna pada grafik bipartit , di mana jika dan hanya jika . B N N M ( A , B , E ) ( a , b ) E | a - b | M.ANBNNM(A,B,E)(a,b)E|ab|M

Masalah ini terlihat sulit. Satu-satunya pendekatan untuk masalah ini yang saya lihat adalah inklusi / pengecualian, yang tidak akan mengarah pada algoritma waktu polinomial.

Kita dapat mempertimbangkan pendekatan yang tidak bergantung pada penempatan angka-angka yang berulang, tetapi saya tidak tahu bagaimana Anda akan melakukan ini. (terutama saat wawancara!)

Tentu saja, semua ini hanya spekulasi dan masih mungkin bahwa trik pintar dapat memberikan solusi waktu polinomial, tapi saya harap saya telah membuat argumen yang meyakinkan bahwa trik ini memang harus sangat pintar.

Mungkin dimungkinkan untuk menunjukkan kekerasan-NP dengan mengurangi masalah ini menjadi # 2-SAT ('rantai' angka yang berbagi posisi ilegal tampaknya merupakan pilihan non-sepele yang bisa dicocokkan dengan pemilihan nilai kebenaran), tetapi Saya belum melihat cara yang jelas untuk melakukan itu sampai sekarang.


Jika pewawancara benar-benar puas dengan algoritma waktu eksponensial, saya hanya akan menghasilkan semua solusi yang mungkin dengan mengadaptasi algoritma backtracking rekursif untuk menghasilkan permutasi untuk mengecualikan kasus khusus ini.


Saya memang mengatakan bahwa saya dapat memberikan algoritma waktu eksponensial, tetapi diminta untuk solusi waktu polinomial yang berfungsi ketika N adalah <= 1000.
Gena

1
Nah, kecuali Anda salah mengingat / salah mengartikan pertanyaan seperti yang disarankan oleh jawaban dari PPenguin, saya pikir pertanyaan ini bisa ditanyakan oleh pewawancara yang sangat menuntut, pewawancara yang sendiri salah paham tentang pertanyaan itu atau mungkin bahkan sebagai pertanyaan yang mereka tidak harapkan orang untuk pecahkan. . Bahkan jika pertanyaan ini ternyata tidak sulit secara komputasi, kemungkinan besar wawancara-sulit.
Kadal diskrit

Tampaknya M = 1 kemungkinan bisa dilakukan (dan karena itu mungkin yang lain), jadi ada sesuatu yang kami lewatkan. Bisakah Anda membantu saya memahami / mengevaluasi kasus M = 1? Saya membuat pertanyaan terpisah untuk itu cs.stackexchange.com/questions/74674/…
PPenguin

2

Mungkinkah Anda mengingat detail spesifik salah atau salah mengartikan pertanyaan?

Dalam deskripsi Anda, elemen dalam posisi b dibatasi untuk sebuah - b ± M . Tetapi jika mereka hanya bermaksud bahwa perbedaannya dibatasi: a - b M , Maka masalahnya akan muncul.abab±M
abM


Saya memecahkan masalah yang lebih sederhana itu, dan saya mencoba untuk menggeneralisasi dengan cara yang saya harap dapat memberikan kebebasan dalam menyelesaikan masalah yang lebih besar. Tetapi ini hanya menjelaskan bagi saya mengapa pendekatan rekursif sangat tidak berhasil, yang saya bahas di bagian akhir.

Pertimbangkan fungsi yang memberikan jumlah permutasi dari daftar elemen berlabel 1 ke N , di mana elemen a di posisi b (posisi pertama adalah 1) memenuhi a - b M , dan b - a P .f(N,M,P)NababMbaP

Untuk memvisualisasikan ini, memisahkannya menjadi dua kendala memungkinkan dan P untuk menggeser batasan-batasan itu secara terpisah.MP

1 2 3 4 5  M=0, restricted values for each position
. . . . .  (positions in list)
1 2 3 4 5  P=0, restricted values for each position

3 4 5      M=2, restricted values for each position
. . . . .  (positions in list)
  1 2 3 4  P=1, restricted values for each position

Untuk kenyamanan, ketika sehingga tidak membatasi permutasi, tentukan g ( N , M ) = f ( N , M , P ) . Demikian pula, g ( N , P ) = f ( N , M , P ) ketika M N sehingga tidak menempatkan batasan pada permutasi.PNg(N,M)=f(N,M,P)g(N,P)=f(N,M,P)MN

Dalam kasus khusus batasan dari M dan P adalah setara, sehingga kita dapat diabaikan, memungkinkan kita untuk menulis f dalam bentuk g : f ( N , 0 , 0 ) = g ( N , 0 ) .M=P=0MPfg

f(N,0,0)=g(N,0).

Dari simetri masalah:

f(N,M,P)=f(N,P,M)

Pertama-tama mari kita selesaikan untuk , dan kemudian atasi f yang lebih umum ( N , M , P ) .g(N,M)f(N,M,P)

Untuk , setiap elemen memiliki satu batasan penempatan (dan batasannya berbeda). Jadi memilih beberapa elemen i , kita akan menempatkannya di beberapa posisi j . Ada N - 1 kemungkinan berbeda untuk pilihan j .M=0ijN1j

Pilihan ini menghapus posisi terbatas untuk elemen , sedangkan elemen lainnya ( N - 2 ) masih memiliki satu batasan. Kami dapat membagi penempatan j menjadi dua opsi:j(N2)j

  1. Tempatkan di . Ini meninggalkan semua elemen lain dengan satu batasan, sehingga masalah penempatan yang tersisa sekarang dikurangi menjadi g ( N - 2 , 0 ) .ig(N2,0)

  2. Tempatkan di posisi . Ini sekarang memberikan satu pembatasan penempatan untuk j , dan setiap elemen memiliki satu batasan, dan masalah penempatan yang tersisa dikurangi menjadi g ( N - 1 , 0 )ijg(N1,0)

Jadi ini memberikan rumus rekursif:

g(N,0)=(N1)[g(N2,0)+g(N1,0)]

Dan dengan melihat situasi sederhana dengan tangan, bisa mendapatkan kasing pangkalan.

g(1,0)=0,  g(2,0)=1

Ini adalah formula rekursif kekacauan yang biasa.

Meskipun saya tidak dapat membayangkan seseorang datang dengan ini di tempat, ternyata ada solusi bentuk tertutup untuk ini (lihat artikel wiki kekacauan untuk detail).

g(N,0)=n!e+12

Untuk , tidak ada batasan pada salah satu penempatan:MN

(MN)g(N,M)=N!

Dengan , elemen M pertama tidak akan memiliki batasan dan elemen yang tersisa akan memiliki satu pembatasan penempatan. Dari segi posisi, posisi M terakhir akan memungkinkan semua angka.0<M<NMM

Untuk posisi terakhir, pilih elemen . Ada dua kemungkinan seperti apa penempatan yang tersisa:i

  1. Jika , maka saya tidak memiliki batasan penempatan, jadi menggunakan saya tidak mengubah batasan pada posisi apa pun. Kami juga telah menghapus satu posisi tanpa batasan, sehingga penempatan yang tersisa terlihat seperti g ( N - 1 , M - 1 ) .i<Miig(N1,M1)

  2. Jika , maka saya memiliki batasan penempatan, dan kami menghapus satu posisi tanpa batasan. Karena saya ditempatkan, posisi yang dibatasi mulai sekarang dapat menerima nomor yang tersisa. Jadi penempatan yang tersisa terlihat seperti g ( N - 1 , M ) .i>=Miig(N1,M)

Jadi ini memberikan rumus rekursif:

(0<M<N)g(N,M)=(M1)g(N1,M1)+(NM+1)g(N1,M)

Ini menyelesaikan solusi rekursif untuk .g

Ketika , posisi N - M pertama memiliki batasan nomor tunggal pada mereka, posisi N - P terakhir memiliki batasan nomor tunggal pada mereka, dan posisi M + P - N tengah tidak memiliki batasan. Ini seperti kasus g ( N , M + P - N ) .M+PNNMNPM+PNg(N,M+PN)

(M+P)Nf(N,M,P)=g(N,M+PN)

Kami telah menangani semua kasus saat ini kecuali dan 0 < P < N sehingga M + P < N . Di sinilah beberapa elemen memiliki beberapa batasan. Karena simetri dalam f , kita dapat mempertimbangkan 0 < M P < N tanpa kehilangan sifat umum.0<M<N0<P<NM+P<Nf0<MP<N

Posisi pertama akan memiliki batasan tunggal, kemudian posisi N - M - P dengan dua batasan, kemudian posisi M terakhir memiliki batasan tunggal.PNMPM

Melihat elemen, elemen pertama akan memiliki batasan tunggal, lalu elemen N - M - P memiliki dua batasan, lalu elemen P terakhir memiliki batasan tunggal.MNMPP

Namun di sinilah kita harus mengakhiri. Karena tidak ada jalan ke depan dengan metode ini.


Saya memisahkan kedua kendala karena saya bisa melihat bahwa menempatkan angka pada posisi yang dipilih bisa ketidakseimbangan berapa posisi dibatasi tunggal ada untuk "+" kendala dan "-" kendala dari .ab±M

Tetapi dalam masalah yang lebih umum, menghapus posisi dengan menempatkan nomor di dalamnya, tidak selalu menghasilkan subproblem yang dijelaskan dengan .f(N,M,P)

Untuk memvisualisasikan kendala pada permutasi, mempertimbangkan grafik diarahkan dengan node, satu set N berlabel { A 1 , A 2 , . . . , A N } dan lain diberi label { B 1 , B 2 , . . . , B N } . Tepi terarah ( A i , B j ) ada jika i - j = M2NN{A1,A2,...,AN}{B1,B2,...,BN}(Ai,Bj)ij=M, dan tepi terarah ada jika j - i = M dan M 0 .(Bj,Ai)ji=MM0

Himpunan node dapat dianggap angka yang kita permutasi dalam beberapa daftar, dan B node posisi yang mungkin mereka. Grafik ini mewakili kendala. Tidak akan ada siklus dalam grafik. Itu akan selalu menjadi simpul terpisah atau rantai dengan panjang satu atau lebih.AB

Jadi kami ingin fungsi yang mengambil sebagai input grafik kendala ini, dan menampilkan jumlah permutasi yang memenuhi kendala.

M+PN

0<MP<NNN!

Karena ada begitu banyak subgraph yang mungkin begitu rantai diizinkan, saya benar-benar tidak melihat bagaimana ini dapat diselesaikan dengan metode rekursif yang biasa kecuali ada hubungan yang pintar mengatakan bagaimana grafik kendala non-isomorfik entah bagaimana setara dengan jumlah permutasi.

Saya pikir kemungkinan besar, pertanyaan itu disalahtafsirkan. Mungkin bahkan oleh pewawancara (yang mungkin lupa jawabannya merinci sendiri).


Mengapa grafik kendala Anda diarahkan? Apa artinya arah?
Kadal diskrit

@ Discretelizard Dua arah (a-> b vs b-> a) membedakan antara mana kendala berasal (versi '+' atau '-' dari kendala). Itu tidak benar-benar diperlukan, karena tidak masalah asal dari kendala, itu hanya memudahkan saya untuk memvisualisasikan apa yang sedang terjadi.
PPenguin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.