Algoritma waktu pseudo-polinomial yang lebih cepat untuk PARTITION

8

Saya ingin mempartisi angka yang diberikan N (mungkin atau mungkin tidak sama) menjadi 2 himpunan bagian sehingga 2 himpunan bagian memiliki jumlah sedekat mungkin dan juga kardinalitas set sama (jika n genap) atau hanya berbeda dengan 1 ( jika n aneh).

Saya pikir kita bisa melakukan ini dalam waktu polinomial semu , di mana adalah jumlah angka dalam himpunan.AO(n2A)A

Bisakah saya melakukan lebih baik dari ini? Yaitu, apakah ada algoritma waktu polinomial semu yang berjalan dalam waktu dengan ?c < 2O(ncA)c<2

Terima kasih sebelumnya!

Firebrandt
sumber
1
Perhatikan bahwa sebagai kasus khusus Knapsack, ia memiliki FPTAS . Lihat misalnya ELLawler. Algoritma aproksimasi cepat untuk masalah ransel .
Mathieu Chapelle
1
@Olexandr, maksud saya adalah apakah ada algoritma polinom pseudo yang berjalan di O (nA). maaf saya tidak dapat memposting dalam lateks.
Firebrandt
4
Saya takut pertanyaan ini berada di perbatasan karena terlalu sederhana. Misalnya, "Apakah masalah Partisi dengan batasan tambahan bahwa kedua set harus memiliki kardinalitas yang sama masih NP-complete?" bisa menjadi pertanyaan pekerjaan rumah yang khas dan saya takut bahwa menuliskan jawabannya mungkin berdampak negatif pada beberapa kursus dalam kompleksitas komputasi.
Tsuyoshi Ito
6
Bagaimana ini terlalu mendasar? Pendekatan yang jelas memberikan , dan pertanyaannya adalah apakah ada algoritma yang lebih baik berjalan dalam waktu mana . Dugaan saya adalah bahwa ini adalah pertanyaan terbuka. O ( n c A ) c < 2O(n2A)O(ncA)c<2
Peter Shor
3
@ Firebrandt: Saya mengambil kebebasan mengedit pertanyaan asli Anda untuk menambahkan versi klarifikasi Anda (mengubah menjadi dengan , karena saya pikir bahkan itu mungkin pertanyaan terbuka). Jangan ragu untuk mengubahnya kembali ke jika Anda mau. Saya pikir pertanyaannya, sebagaimana diklarifikasi oleh komentar Anda, jelas tingkat penelitian. O ( n c A ) c < 2 O ( n A )O(nA)O(ncA)c<2O(nA)
Peter Shor

Jawaban:

7

Seseorang dapat menyelesaikan masalah keputusan dalam waktu .O~(nA)

Biarkan urutan angka menjadi . Definisikan sebagai himpunan sedemikian rupa sehingga jika jika ada dengan panjang yang berjumlah . Jika kami telah menghitung , maka kami hanya perlu waktu tambahan untuk menyelesaikan secara menyeluruh untuk menyelesaikan masalah Anda.F S ( i , j ) F S S j i F S O ( n A ) F SSFS(i,j)FSSjiFSO(nA)FS

Jika dan adalah dua bagian dari partisi , makaS 2 SS1S2S

FS=FS1+FS2

di mana adalah jumlah minkowski, dan penambahan di antara tupel didefinisikan secara koordinat.A+B={a+b|aA,bB}

Klaim: Menghitung dari F S 1 dan F S 2 membutuhkan waktu ˜ O ( | S | A ) .FSFS1FS2O~(|S|A)

Bukti: Menerapkan konvolusi 2D pada dua tabel ukuran .A×|S|

Algoritma mempartisi urutan ke dua urutan berukuran sama, menerapkan rekursi untuk masing-masing, dan mengambil jumlah hasil minkowski. Misalkan menjadi waktu berjalan terburuk ketika input ke algoritma memiliki elemen n dan A adalah batas atas dari penjumlahan. Kami memiliki Yang menunjukkan .TA(n)nA
T A ( n ) = ˜ O ( n A )

TA(n)=2TA(n/2)+AO~(n)
TA(n)=O~(nA)

Tersembunyi Faktor adalah log n log n A .loglognlognA

Chao Xu
sumber
3

Jika perawatan siapa pun tentang faktor, dengan analisis yang cermat kita dapat membuktikan kompleksitas waktu untuk algoritma Chao adalah O ( n A log ( n A ) ) .logO(nAlog(nA))

Bukti. Pada lapisan genap dari pohon rekursi, kami mempartisi himpunan menjadi dua himpunan berukuran sama S 1 dan S 2 , yang menghasilkan T e ( n , A ) = T o ( n / 2 , A ) + T o ( n / 2 , A - A ) + O ( n A log ( n A ) ) ,SS1S2

Te(n,A)=To(n/2,A)+To(n/2,AA)+O(nAlog(nA)),
dan pada lapisan ke-3 dari pohon rekursi, kita mempartisi himpunan menjadi dua "himpunan sama" set S 1 dan S 2 . Lebih tepatnya, kita dapat mempartisi himpunan S dengan jumlah A menjadi dua himpunan S 1 dan S 2 dengan masing-masing jumlah hingga A / 2 , dengan paling banyak satu elemen tersisa. Kita dapat menangani elemen itu dengan pemrograman dinamis sepele di O ( A ) . Ini memberi T o ( n , A ) = T eSS1S2SAS1S2A/2O(A) mana n 1 = | S 1 | . Oleh karena itu kami memiliki T ( n , A ) 4 Σ i = 1 T ( n i ,
To(n,A)=Te(n1,A/2)+Te(nn1,A/2)+O(nAlog(nA)),
n1=|S1| mana4 i = 1 n in ,4 i = 1 A iA , dani , n in / 2 , A iA / 2 . Ini akan memberi kita T ( n , A )
T(n,A)i=14T(ni,Ai)+O(nAlog(nA)),
i=14nini=14AiAi, nin/2, AiA/2 .T(n,A)=O(nAlog(nA))
hqztrue
sumber