jumlah indeks seperti dalam daftar melingkar

8

Pertimbangkan masalah berikut:

Biarkan roda didefinisikan sebagai daftar bilangan bulat diindeks secara melingkar . Sebagai contoh…kk

{3, 4, 9, -1, 6}

… Adalah roda 5 dengan 3 di posisi 0, 4 di posisi 1, dan seterusnya. Roda mendukung operasi rotasi, sehingga rotasi satu langkah akan mengubah roda di atas menjadi ...

{6, 3, 4, 9, -1}

… Sekarang dengan 6 di posisi 0, 3 di posisi 1, dan seterusnya. Biarkan menjadi seperangkat - -roda yang dipesan . Diberikan beberapa dan beberapa bilangan bulat , temukan serangkaian rotasi sedemikian rupa sehingga…WNkNkWNkt

 0i<k,NWNi=t

Dengan kata lain, jika Anda meletakkan roda sebagai matriks, jumlah setiap kolom adalah . Asumsikan bahwa dibangun sehingga solusinya unik hingga rotasi setiap elemen (yaitu, ada solusi unik yang terdiri dari mengambil satu solusi, kemudian memutar setiap roda di dengan jumlah langkah yang sama).tWNkkW

Solusi sepele untuk masalah ini melibatkan hanya memeriksa setiap kemungkinan rotasi. Berikut ini beberapa pseudocode untuk itu:

function solve(wheels, index)
    if wheels are solved:
        return true
    if index >= wheels.num_wheels:
        return false
    for each position 1..k:
        if solve(index + 1) is true:
            return true
        else:
            rotate wheels[index] by 1

solve(wheels, 0)

Ini adalah solusi yang sangat lambat (seperti ). Saya bertanya-tanya apakah mungkin untuk melakukan masalah ini lebih cepat, dan juga apakah ada nama untuk itu.O(kn)

Apis Utilis
sumber
Saya menduga ini mungkin NP-lengkap, karena sepertinya kita tidak dapat benar-benar mengetahui apakah solusi parsial akan mengarah ke solusi yang benar sampai kita menetapkan roda akhir ... Saya belum memiliki bukti. . Saya akan menambahkan jawaban jika saya memikirkan satu.
Matt Lewis

Jawaban:

3

Untuk sebagian besar jawaban ini, saya membahas versi keputusan masalah, di mana sebuah contoh memiliki paling banyak satu solusi diberikan ("janji"), dan Anda harus memutuskan apakah ia punya solusi atau tidak.

Anda dapat mengurangi PARTISI untuk masalah Anda (olahraga). (PARTISI adalah masalah menentukan apakah satu set bilangan bulat dapat dipartisi menjadi dua bagian dengan jumlah yang sama.) Harus diakui, ini tidak selalu memenuhi syarat bahwa solusinya unik.

Dengan beberapa pekerjaan lagi, Anda dapat (secara langsung) mengurangi SAT menjadi (versi keputusan) masalah Anda, dan mungkin itu dapat dilakukan sedemikian rupa sehingga jika instance SAT memiliki solusi yang unik, maka demikian juga hasil instance dari masalahmu. Dalam hal itu, kami mendapatkan bahwa versi keputusan tidak dapat dipecahkan dalam polytime kecuali NP = RP, yang dianggap tidak mungkin.

Perhatikan bahwa jika versi keputusan (lebih tepatnya, versi janji) dari masalah tidak dapat dipecahkan dalam polytime, maka tidak ada algoritma yang dapat menyelesaikan semua instance YA dalam polytime: jika ya, Anda dapat menjalankannya hingga waktu berjalan yang ditentukan, dan periksa solusinya (jika algoritme berhenti tepat waktu).

Yuval Filmus
sumber