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(nlogn)

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


O(n) non è più veloce diO(nlogn)
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.Ω(nlogn)

(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.)xixj

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(nlogn)


Grazie. Che cosa intendi con "confrontare varie differenze "? Dal momento che esistono tali coppie, ciò non richiederebbe tempo ? xixjΘ(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 comex1x2>x3x4, o anche x1+5x817x3<5. Sappiamo che esiste una soluzione che utilizzaO(nlogn) confronti del tipo xi>xj, e O(n) confronti del tipo xixj>xkx. 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(nlogn)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 Ω(nlogn)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.