Algoritmo per trovare la minima differenza nell'array


8

Vogliamo un algoritmo che, data una matrice di lunghezza di numeri interi, trovi la differenza minima tra due numeri interi nella matrice.n

Uno di questi algoritmi è quello di ordinare l'array e controllare coppie di numeri adiacenti. Questo richiede tempo .O(nlog⁡n)

Esiste un modo più veloce, ad esempio un algoritmo ?O(n)


O(n) non è più veloce diO(nlog⁡n)
— David Merinos,

Risposte:


7

Questo dipende dal tuo modello di calcolo. Se si consentono solo l'aritmetica e i confronti (il modello dell'albero delle decisioni algebrico), esiste un limite inferiore per la distinzione degli elementi , il problema di decidere se tutti gli elementi sono distinti. Il tuo problema è ovviamente ancora più difficile, quindi si applica lo stesso limite inferiore.Ω(nlog⁡n)

(C'è qualche buona stampa: il limite inferiore vale solo se il grado dei polinomi da confrontare è limitato. Se tutto ciò che stai facendo è confrontare varie differenze , allora sei a posto. Il modello dell'albero delle decisioni algebrico consente inoltre di confrontare i polinomi più generali negli input, purché abbiano un grado limitato.)xi−xj

Esistono altri modelli che potrebbero offrire prestazioni migliori, ad esempio in alcuni modelli è possibile ordinare numeri interi in . Ma immagino che tu non voglia permettere il tipo di inganno usato in tali algoritmi.o(nlog⁡n)


Grazie. Che cosa intendi con "confrontare varie differenze "? Dal momento che esistono tali coppie, ciò non richiederebbe tempo ? xi−xjΘ(n2)Ω(n2)
— Boaten

Non necessariamente. Gli algoritmi basati sul confronto possono solo confrontare coppie di elementi. Qui ti sto permettendo di fare domande più complicate comex1−x2>x3−x4, o anche x1+5x8−17x3<−5. Sappiamo che esiste una soluzione che utilizzaO(nlog⁡n) confronti del tipo xi>xj, e O(n) confronti del tipo xi−xj>xk−xℓ. La domanda è: puoi fare di meglio, e la risposta è no, se sei limitato a fare solo domande lineari (o, più in generale, domande di laurea limitate).
— Yuval Filmus,

Non sono sicuro di capire il significato pratico di questo limite per la distinzione degli elementi. Non avresti una O (n) attesa con una tabella hash?
— jkff,

Una tabella hash non può essere implementata usando questo modello di calcolo. In generale, i limiti inferiori sono difficili da dimostrare. Il modello dell'albero delle decisioni algebrico è quello in cui sono provabili limiti inferiori non banali. Non vedo come dimostrarloω(n)limite inferiore in qualsiasi altro modello - in effetti, tali limiti inferiori sono generalmente noti solo per funzioni casuali. Hai ragione che potrebbe esserci un truccoo(nlog⁡n)algoritmo che va oltre questo modello, ma non riesco a pensare a nessuno.
— Yuval Filmus,

-1

Se gli interi nell'array hanno un numero limitato di cifre, è possibile ordinare un array con algoritmo di ordinamento radix , ovvero O (kN) e quindi controllare le coppie di numeri adiacenti (O (N))? La complessità risultante sarà O ((k + 1) N), lineare.


1
Prestare attenzione alle condizioni in cui il tempo di esecuzione di radix sort è effettivamente buono.
— Raffaello

@Raphael Bene, la domanda originale era l'esistenza dell'algoritmo lineare, quindi ci ho pensato. Intendi che k sarà più grande di log (N) per N piccola?
— Pavel Davydov,

k e N sono parametri indipendenti, motivo per cui l'ordinamento radix non è un algoritmo a tempo lineare per tutti gli ingressi, e quindi non contraddice il Ω(nlog⁡n)legato all'ordinamento (confronto). (Anche l'articolo di Wikipedia lo spiega.)
— Raffaello

@Raphael Sì, ma per array di numeri interi che sono meno i 64 bit (è un caso abbastanza comune) sarà lineare. Modificherò la mia risposta. Grazie per i tuoi commenti
— Pavel Davydov,
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.