Algoritmo del tempo lineare per la ricerca di max


11

Supponiamo che ci venga dato un array contenente numeri interi non negativi (non necessariamente distinti).A[1..n]

Sia in ordine in ordine crescente. Vogliamo calcolare A m = max i [ n ] B [ i ] + i .BA

m=maxi[n]B[i]+i.

La soluzione ovvia è ordinare A e quindi calcolare m . Questo dà un algoritmo che gira nel tempo O(nlgn) nel peggiore dei casi.

È possibile fare di meglio? Possiamo calcolare m in tempo lineare?


La mia domanda principale è quella sopra. Ma sarebbe interessante conoscere la seguente generalizzazione del problema.

Lasciate che B sia A ordinati in secondo alcuni confronto Oracle e f una funzione data da un oracolo. Dati A e gli oracoli per e f , cosa possiamo dire del tempo necessario per calcolare m=maxi[n]f(B[i],i) ?

Possiamo ancora calcolare m in O(nlgn) tempo. Ma possiamo dimostrare un limite inferiore super-lineare per questo caso generalizzato?

Se la risposta è sì, vale il limite inferiore se assumiamo che sia il solito ordine su numeri interi e sia una funzione "piacevole" (monotona, polinomiale, lineare, ecc.)?ff

Risposte:


10

Possiamo calcolare in tempo lineare.m

Per semplicità supponiamo che le matrici siano basate su 0: , . Vogliamo calcolare .B [ 0 .. n - 1 ] m = max i B [ i ] + iA[0..n1]B[0..n1]m=maxiB[i]+i

Sia . Ovviamente .m a x mmax=maxiA[i]maxm

Lascia che sia dopo l'ordinamento. Se abbiamo B [ k ] A [ j ] m a x - n B [ k ] + k B [ k ] + ( n - 1 ) = A [ j ] + ( n - 1 ) ( m a x - n ) + ( n - 1 ) =A[j]B[k]A[j]maxn

B[k]+kB[k]+(n1)=A[j]+(n1)(maxn)+(n1)=max1<maxm.

Pertanto possiamo ignorare quando . Dobbiamo solo considerare i numeri nell'intervallo .A [ j ] m a x - n [ m a x - n , m a x ]A[j]A[j]maxn[maxn,max]

Possiamo usare l'ordinamento di conteggio per ordinare i numeri in che sono nell'intervallo in tempo lineare e usare l'elenco ordinato per calcolare .[ m a x - n , m a x ] mA[maxn,max]m


... mmm ... ma qual è il costo di C [x] = C [x] +1?!?
Marzio De Biasi,

1
c'è un problema con la tua risposta? perché mi sembra perfetto: stai dicendo che ci preoccupiamo solo degli elementi dell'array con valori in , quindi possiamo usare l'ordinamento del conteggio. Questo funziona per il problema generale ogni volta che per tutti . [Mn,M]|f(B[i],i)B[i]|=O(n)i
Sasho Nikolov,

Grazie @Marzio. :) Ho leggermente modificato la tua risposta per chiarezza. Sentiti libero di ripristinare la mia modifica o di modificarla ulteriormente.
Kaveh,

1
Questa soluzione sembra funzionare anche per qualsiasi dove per tutti e , . f(x,i)xin|f(x,i)x|=O(n)
Kaveh,

@Kaveh: la modifica è ok! Ho scritto rapidamente la risposta e non ero nemmeno sicuro della sua correttezza: -S
Marzio De Biasi,

-1

Se l'array costituito da numeri interi distinti, allora , poiché la distanza tra le voci adiacenti in è almeno ; la situazione è più interessante quando non devono essere distinti.m = max ( A ) + 1 B 1Am=max(A)+1B1

Per la tua domanda più generale, immagina una situazione in cui è "interessante" solo quando . Sembra possibile costruire un argomento avverso che ti costringa a interrogare per tutti prima che tu possa conoscere , quindi devi ordinare per trova la risposta, che prende i confronti . (Ci sono alcune complicazioni poiché potrebbe essere il caso che possiamo testare se in tempo costante piuttosto che lineare interrogando .) Questo è il caso anche se è un polinomio (di alto grado).i = j f ( B [ i ] , i ) i max i f ( Bf(B[i],j)i=jf(B[i],i)imaxif(B[i],i)AΩ(nlogn)A[i]=B[j]f(A[i],j)f


1
Cosa succede se A ha n - 1 zeri e uno singolo? Quindi la risposta è n, non 1.
Grigory Yaroslavtsev

Ciao Yuval. Non ci può essere ripetuto i numeri in . Come ha detto Grigory, la soluzione non sembra funzionare. A
Kaveh,

Penso di vedere la tua idea per l'argomento del limite inferiore: dato possiamo calcolare rapidamente usando le coppie di query create da da un algoritmo che risolve il problema nel tempo . Possiamo assicurarci che l'algoritmo interroghi su tutto ma non possiamo assicurarci che non interroghi altre coppie. Tuttavia, possiamo impostare affinché altre coppie siano un valore distinguibile in modo da poter scartare quelle coppie. B f o ( n lg n ) f ( B [ i ] , i ) fABfo(nlgn)f(B[i],i)f
Kaveh,
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.