Rilevare le progressioni aritmetiche "doppiamente" 3SUM è difficile?


20

Questo si ispira a una domanda di intervista .

Ci viene data una matrice di numeri interi e dobbiamo determinare se esistono distinti tali che i < j < ka1,,ani<j<k

  • akaj=ajai
  • kj=ji

cioè, le sequenze e sono entrambe in progressione aritmetica.{ i , j , k }{ai,aj,ak}{i,j,k}

Esiste un semplice algoritmo per questo, ma trovare un algoritmo sub-quadratico sembra inafferrabile.O(n2)

È un problema noto? Possiamo provare la durezza 3SUM di questo? (o forse fornire un algoritmo sub-quadratico?)

Se vuoi, puoi assumere e che per una costante nota . (Nel problema dell'intervista, ).un r + 1 - un rK K > 2 K = 90<a1<a2<...<anar+1arKK>2K=9

Risposte:


12

Questo è un problema aperto.

Forse una forma debole di durezza 3SUM potrebbe essere dimostrata adattando un risultato del documento STOC 2010 di Mihai Pătrașcu " Verso limiti inferiori polinomiali per problemi dinamici ". Innanzitutto, vorrei definire una sequenza di problemi strettamente correlati. L'input per ciascun problema è un array ordinato di interi distinti.A[1..n]

  • 3SUM: ci sono indici distinti tali che A [ i ] + A [ j ] = A [ k ] ?i,j,kA[i]+A[j]=A[k]

  • Convolution3SUM: ci sono indici tali che A [ i ] + A [ j ] = A [ i + j ] ?i<jA[i]+A[j]=A[i+j]

  • Media: ci sono indici distinti tali che A [ i ] + A [ j ] = 2 A [ k ] ?i,j,kA[i]+A[j]=2A[k]

  • ConvolutionAverage: ci sono indici tali che A [ i ] + A [ j ] = 2 A [ ( i + j ) / 2 ] ? (Questo è il problema che stai chiedendo.)i<jA[i]+A[j]=2A[(i+j)/2]

Nella mia tesi di dottorato, ho dimostrato che tutti e quattro questi problemi richiedono tempo in un modello di calcolo dell'albero delle decisioni che consente solo query della forma "Is α A [ i ] + β A [ j ] + γ A [ k ] + δ positivo, negativo o zero? ", Dove α , β , γ , δ sono numeri reali (che non dipendono dall'input). In particolare, qualsiasi algoritmo 3SUM in questo modello deve porre la domanda "Is A [ iΩ(n2)αA[i]+βA[j]+γA[k]+δα,β,γ,δ più grande, più piccolo o uguale a A [ k ] ? "Almeno Ω ( n 2 ) volte. Quel limite inferiore non esclude algoritmi subquadratici in un modello di calcolo più generale - anzi, è possibileradere alcuni fattori di login vari modelli di RAM interi, ma nessuno sa quale tipo di modello più generale potrebbe aiutare in modo più significativo.A[i]+A[j]A[k]Ω(n2)

Usando un'attenta riduzione dell'hash, Pǎtrașcu ha dimostrato che se 3SUM richiede tempo previsto, per qualsiasi funzione f , Convolution3SUM richiede Ω ( n 2 / f 2 ( n f ( n ) ) ) previsto tempo. Pertanto, è ragionevole affermare che Convolution3SUM è "debolmente 3SUM-difficile". Ad esempio, se Convolution3SUM può essere risolto in O ( n 1.8 ) tempo, allora 3SUM può essere risolto in O (Ω(n2/f(n))fΩ(n2/f2(nf(n)))O(n1.8) tempo.O(n1.9)

Non ho approfondito i dettagli, ma scommetto che un argomento parallelo implica che se Average richiede tempo previsto, per qualsiasi funzione f , allora ConvolutionAverage richiede Ω ( n 2 / f 2 ( n f ( n ) ) ) tempo previsto. In altre parole, ConvolutionAverage è "debolmente medio-difficile".Ω(n2/f(n))fΩ(n2/f2(nf(n)))

Sfortunatamente, non è noto se Average sia (anche debolmente) 3SUM difficile! Ho il sospetto che media è in realtà non 3sum-duri, se non altro perché l' limite inferiore per mediaΩ(n2) è considerevolmente più difficile da dimostrare che l' limite inferiore per 3sumΩ(n2) .


Fare anche per il caso particolare in cui elementi dell'array adiacenti differiscono di meno di alcuni fisso intero . Per 3SUM e Average, questa variante può essere risolta nel tempo O ( n log n ) usando le trasformazioni Fast Fourier come segue. (Questa osservazione è dovuta a Raimund Seidel.) KO(nlogn)

Costruire un vettore di bit , dove B [ i ] = 1 se e solo se il numero intero A [ 1 ] + i appare nella matrice di ingresso A . Calcola la convoluzione di B con se stessa in O ( K n log K n ) = O ( n log n ) tempo usando gli FFT. L'array risultante ha un valore diverso da zero in jB[0..Kn]B[i]=1A[1]+iABO(KnlogKn)=O(nlogn)jposizione se e solo se una coppia di elementi in somma a 2 A [ 1 ] + j . Pertanto, possiamo estrarre un elenco ordinato di somme A [ i ] + A [ j ] dalla convoluzione nel tempo O ( n ) . Da qui, è facile risolvere Average o 3SUM in O ( n ) time.A2A[1]+jA[i]+A[j]O(n)O(n)

Ma non conosco un trucco simile per Convolution3SUM o ConvolutionAverage!

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.