Se stai cercando una somma s e il totale di tutti gli elementi dell'array è t, allora la somma del primo i e dell'ultimo j elementi deve essere t -s, quindi gli elementi dall'indice i all'indice nj sono esclusivi aggiungere fino a s.
Quindi crei una tabella hash o un albero binario bilanciato per la somma degli ultimi j elementi, iniziando con j = 0, quindi aggiungendo un altro elemento per j = 1, 2, 3, ecc. La tabella hash sarà O (1 ) in media, ma l'albero binario bilanciato è O (log n) nel caso peggiore.
Per ogni j, si controlla se t min s meno la somma dei primi elementi i = n-j è nella tabella hash o albero binario, e procedere fino a j = n e i = 0.
O (n) media usando una tabella hash, ma nessuna garanzia per il caso peggiore. O (n log n) se si utilizza una struttura di ricerca bilanciata.
Come esempio con i dati [1, -3, 4, 8, 2, -14, 3, -1, 10, 6]: Il totale è t = 16, ci è stato dato s = 9, quindi il la somma del primo i e degli ultimi j elementi deve essere 7. L'elenco delle somme degli ultimi j elementi è:
j = 0: 0
j = 1: 0, 6
j = 2: 0, 6, 16
j = 3: 0, 6, 16, 15
j = 4: 0, 6, 16, 15, 18
j = 5: 0, 6, 16, 15, 18, 4
j = 6: 0, 6, 16, 15, 18, 4, 6
j = 7: 0, 6, 16, 15, 18, 4, 6, 14
j = 8: 0, 6, 16, 15, 18, 4, 6, 14, 18
j = 9: 0, 6, 16, 15, 18, 4, 6, 14, 18, 15
j = 10: 0, 6, 16, 15, 18, 4, 6, 14, 18, 15, 16
Quindi calcoliamo la somma dei primi elementi i = 10-j, e 7 meno quella somma deve essere nell'ultima delle somme degli ultimi j elementi.
j = 0, i = 10: 7 - 16 = -9, not found
j = 1, i = 9: 7 - 10 = -3, not found
j = 2, i = 8: 7 - 0 = 7, not found
j = 3, i = 7: 7 - 1 = 6, found
j = 4, i = 6: 7 - (-2) = 9, not found
j = 5, i = 5: 7 - 12 = -5, not found
j = 6, i = 4: 7 - 10 = -3, not found
j = 7, i = 3: 7 - 2 = 5, not found
j = 8, i = 2: 7 - (-2) = 9, not found
j = 9, i = 1: 7 - 1 = 6, found
j = 10, i = 0: 7 - 0 = 7, not found
I primi 1 elementi hanno una somma di 1, gli ultimi 1 o 6 elementi hanno una somma di 6, quindi gli elementi 1..9 o 1..4 hanno una somma di 9. Il tempo è fondamentalmente n inserimenti e ricerche in una struttura di dati.