somma di indici simili in elenchi circolari


8

Considera il seguente problema:

Consenti a una -wheel di essere definita come un elenco indicizzato collegato circolarmente di interi. Per esempio…kk

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

… È una 5 ruote con 3 in posizione 0, 4 in posizione 1 e così via. Una ruota supporta l'operazione di rotazione, in modo che una rotazione di un passo trasformi la ruota sopra in ...

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

... ora con 6 in posizione 0, 3 in posizione 1 e così via. Lascia che sia un insieme ordinato di ruote distinte . Dati alcuni e alcuni interi , trova una serie di rotazioni tali che ...WNkNkWNkt

 0i<k,NWNi=t

In altre parole, se disponessi le ruote come una matrice, la somma di ogni colonna sarebbe . Supponiamo che sia costruito in modo tale che la soluzione sia unica fino alle rotazioni di ogni elemento (ad esempio, ci sono esattamente soluzioni uniche che consistono nel prendere una soluzione, quindi ruotare ogni ruota in con lo stesso numero di passaggi).tWNkkW

La banale soluzione a questo problema consiste semplicemente nel controllare ogni possibile rotazione. Ecco alcuni pseudocodici per questo:

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)

Questa è una soluzione piuttosto lenta (qualcosa come ). Mi chiedo se è possibile risolvere questo problema più velocemente e anche se esiste un nome per questo.O(kn)


Ho il sospetto che questo potrebbe essere NP-completo, dal momento che non sembra che possiamo davvero dire se una soluzione parziale porterà a una soluzione corretta fino a quando non imposteremo la ruota finale ... Non ho ancora una prova però . Aggiungerò una risposta se ne penso una.
Matt Lewis

Risposte:


3

Per la maggior parte di questa risposta, discuto la versione decisionale del problema, in cui viene fornita un'istanza con al massimo una soluzione (la "promessa") e devi decidere se ha qualche soluzione o nessuna.

Puoi ridurre la PARTITION al tuo problema (esercizio). (PARTITION è il problema di determinare se un insieme di numeri interi può essere partizionato in due parti con uguale somma.) Certamente, questo non soddisfa necessariamente la condizione che la soluzione sia unica.

Con un po 'più di lavoro, puoi (direttamente) ridurre il SAT a (la versione decisionale del) tuo problema, e forse questo può essere fatto in modo tale che se l'istanza SAT ha una soluzione unica, allora anche l'istanza risultante di il tuo problema. In tal caso, otteniamo che la versione della decisione non è risolvibile in polytime a meno che NP = RP, che è considerato improbabile.

Si noti che se la versione della decisione (più precisamente, la versione promessa) del problema non è risolvibile in polytime, allora nessun algoritmo può risolvere tutte le istanze SÌ in polytime: in tal caso, è possibile eseguirlo fino al tempo di esecuzione assegnato e controlla la soluzione (se l'algoritmo si è fermato in tempo).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.