Sia B
essere l'elenco delle somme a coppie, con B[0] <= B[1] <= ... <= B[m-1]
e lasciare A
essere la lista originale dei numeri che stiamo cercando di trovare, con A[0] < A[1] < ... < A[n-1]
, dove m = n(n-1)/2
.
Dato A[0]
, calcolare A
in tempo polinomiale
Corporatura A
dal elemento più piccolo al più grande. Supponiamo che sappiamo già A[0]
. Quindi, poiché B[0]
è l'elemento più piccolo in B
, può sorgere solo come A[0] + A[1]
. Allo stesso modo, B[1]
deve essere uguale a A[0] + A[2]
. Pertanto, se conosciamo A[0]
, possiamo calcolare A[1]
e A[2]
.
Dopo questo, tuttavia, questo schema si interrompe. B[2]
potrebbe essere A[0] + A[3]
o A[1] + A[2]
e senza conoscenza preliminare, non possiamo sapere quale sia. Tuttavia, se conosciamo A[0]
, possiamo calcolare A[1]
e A[2]
come descritto sopra, quindi rimuovere A[1] + A[2]
da B
. Il successivo elemento più piccolo è quindi garantito da A[0] + A[3]
, che ci consente di trovare A[3]
. Continuando così, possiamo trovare tutto il A
senza mai tornare indietro. L'algoritmo simile a questa:
for i from 1 to n-1 {
// REMOVE SEEN SUMS FROM B
for j from 0 to i-2 {
remove A[j]+A[i-1] from B
}
// SOLVE FOR NEXT TERM
A[i] = B[0] - A[0]
}
return A
Ecco come funziona dal vostro esempio dove B = [4,5,7,10,12,13]
se sappiamo A[0]=1
:
start
B = [4,5,7,10,12,13]
A[0] = 1
i=1:
B = [4,5,7,10,12,13]
A[1] = 4-1 = 3
i=2:
Remove 1+3 from B
B = [5,7,10,12,13]
A[2] = 5-1 = 4
i=3:
Remove 1+4 and 3+4 from B
B = [10,12,13]
A[3] = 10-1 = 9
end
Remove 1+9 and 3+9 and 4+9 from B
B = []
A = [1,3,4,9]
Quindi tutto si riduce a conoscere A[0]
, da cui si può calcolare la resto di A
.
Compute A[0]
in tempo polinomiale
Ora possiamo semplicemente provare ogni possibilità di A[0]
. Poiché sappiamo B[0] = A[0] + A[1]
, sappiamo che A[0]
deve essere un numero intero compreso tra 0
e B[0]/2 - 1
. Sappiamo anche che
B[0] = A[0] + A[1]
B[1] = A[0] + A[2]
Inoltre, c'è qualche indice i
con 2 <= i <= n-1
tale che
B[i] = A[1] + A[2]
Perché? Poiché le uniche voci potenzialmente più piccole di A[1]+A[2]
hanno il formato A[0] + A[j]
e ci sono al massimo n-1
tali espressioni. Pertanto sappiamo anche che
A[0] = (B[0]+B[1] - B[i])/2
per alcuni 2 <= i <= n-1
.Questo, insieme al fatto che 0129061-e B[0]/2-1
offre A[0]
offre solo alcune possibilità per il test A[0]
.
Per l'esempio, esistono due possibilità per A[0]
: 0
o 1
. Se cerchiamo l'algoritmo con A[0]=0
, ecco cosa succede: approccio
start
B = [4,5,7,10,12,13]
A[0] = 0
i=1:
B = [4,5,7,10,12,13]
A[1] = 4-0 = 4
i=2:
Remove 0+4 from B
B = [5,7,10,12,13]
A[2] = 5-0 = 5
i=3:
Remove 0+5 and 4+5 from B
B = !!! PROBLEM, THERE IS NO 9 IN B!
end
Si prega di citare da quale pagina web hai ottenuto questo. –