Algoritmo di tempo lineare deterministico per verificare se un array è una versione ordinata dell'altro


19

Considera il seguente problema:

Input: due matrici e di lunghezza , dove è in ordine.ABnB

Domanda: do e contengono gli stessi elementi (con la loro molteplicità)?AB

Qual è l' algoritmo deterministico più veloce per questo problema?
Può essere risolto più velocemente di ordinarli? Questo problema può essere risolto in un tempo lineare deterministico?


1
FWIW l'approccio probabilistico è hash con una funzione hash indipendente dall'ordine. Carter e Wegman hanno scritto uno degli articoli originali su questo ( sciencedirect.com/science/article/pii/0022000081900337 ), ma non ho visto nulla nelle citazioni di quell'articolo che suggerisca un algoritmo deterministico (finora).
KWillets,

1
L'affermazione che citi riguarda il modello della macchina di Turing, che è solo di interesse teorico. Gli algoritmi vengono generalmente analizzati rispetto al modello RAM.
Yuval Filmus,

ah, allora quello è il modello che sto cercando. Ho modificato la domanda.
Albert Hendriks

Perché non sommi semplicemente gli elementi nell'array e poi confronti la somma? Per quanto riguarda il titolo, è lineare e risponde alla domanda "un array è la versione ordinata di un altro? '. Sono consapevole che non è il modello della macchina di Turing, ma una soluzione pratica.
atayenel,

1
@AlbertHendriks (molto probabilmente) non puoi ordinare un array in O(nlogn) su una macchina Turing. Alcuni limiti inferiori su SAT (ad esempio cs.cmu.edu/~ryanw/automated-lbs.pdf ) sono in realtà per la macchina RAM, mi dispiace per il mio commento fuorviante.
Yuval Filmus,

Risposte:


14

Non hai specificato il tuo modello di calcolo, quindi assumerò il modello di confronto.

Si consideri il caso speciale in cui l'array è tratto dall'elenco { 1 , 2 } × { 3 , 4 } × × { 2 n - 1 , 2 n } . In parole, l' i elemento è 2 i - 1 o 2 i .B

{1,2}×{3,4}××{2n1,2n}.
i2i12i

Sostengo che se l'algoritmo conclude che e B contengono gli stessi elementi, che l'algoritmo è confrontato ogni elemento B alla sua controparte A . Infatti, supponiamo che l'algoritmo conclude che A e B contengono gli stessi elementi, ma mai a confronto il primo elemento di B alla sua controparte in A . Se cambiamo il primo elemento, l'algoritmo procederà esattamente allo stesso modo, anche se la risposta è diversa. Ciò dimostra che l'algoritmo deve confrontare il primo elemento (e qualsiasi altro elemento) alla sua controparte A .ABBAABBAA

Ciò significa che se e B contengono gli stessi elementi, quindi dopo aver verificato questo algoritmo conosce l'ordinamento dei A . Quindi deve avere almeno n ! foglie diverse, e quindi ci vuole tempo Ω ( n log n ) .ABAn!Ω(nlogn)


Avrei pensato che ciò implicherebbe che in generale, ma apparentemente il modello di confronto è diverso da quello. P=Ω(nlogn)
Albert Hendriks,

@AlbertHendriks, è lo stesso modello usato per mostrare nlg n limite inferiore per l'ordinamento. Significa che l'unica operazione che puoi eseguire è il confronto, quindi non puoi fare di meglio. Penso che questo risponda alla tua domanda.
Kaveh,

[CNT] non abbiamo limiti più forti anche per l'ordinamento! e se puoi ordinare più velocemente di nlg n, puoi usarlo per risolvere il problema più velocemente di nlg n.
Kaveh,

1
@AlbertHendriks, conosci algoritmi di tempo lineari per l'ordinamento di numeri interi? Cerca in CLRS. Il tuo caso potrebbe essere uno dei casi in cui possiamo ordinare in tempo lineare.
Kaveh,

6
I numeri interi possono essere ordinati in (vedere nada.kth.se/~snilsson/fast-sorting ) o nel tempo previsto O ( n O(nloglogn)(vediieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1181890), o anche in tempo lineare se la dimensione della parola è abbastanza grande (vedi LNCS 8503, p. 26ff). O(nloglogn)
Yuval Filmus,

10

Questa risposta considera un diverso modello di calcolo: il modello di RAM a costo unitario. In questo modello, le parole macchine hanno dimensione e le operazioni su di esse richiedono O ( 1 ) . Supponiamo anche per semplicità che ogni elemento dell'array si adatti a una parola macchina (e così sia al massimo n O ( 1 ) in grandezza).O(logn)O(1)nO(1)

Costruiremo un algoritmo randomizzato a tempo lineare con errore unilaterale (l'algoritmo potrebbe dichiarare che i due array contengono gli stessi elementi anche se non è così) per il problema più difficile di determinare se due array e b 1 , , b n contengono gli stessi elementi. (Non richiediamo che nessuno di questi sia ordinato.) Il nostro algoritmo commetterà un errore con probabilità al massimo 1 / n .a1,,anb1,,bn1/n

L'idea è che la seguente identità valga se gli array contengono gli stessi elementi: Il calcolo esatto di questi polinomi richiederà troppo tempo. Invece, scegliamo un primo casuale p e un casuale x 0 e testiamo se n i = 1 ( x 0 - a i ) n

i=1n(xai)=i=1n(xbi).
px0 Se gli array sono uguali, il test passerà sempre, quindi concentriamoci sui casi in cui gli array sono diversi. In particolare, un coefficiente din i = 1 ( x - a i ) - n i = 1 ( x - b i ) è diverso da zero. Poiché a i , b ho magnitudine n O ( 1 ) , questo coefficiente ha magnitudine 2 n n O (
i=1n(x0ai)i=1n(x0bi)(modp).
i=1n(xai)i=1n(xbi)ai,binO(1) , e quindi ha al massimoO(n)fattori primi di dimensioneΩ(n). Questo significa che se si sceglie un set di almeno n 2 numeri primipdi dimensioni di almeno n 2 (ad esempio), poi per un primo casopdi questo set sarà tenere con probabilità di almeno1-1 / nche n Π i = 1 (x- a i )2nnO(n)=nO(n)O(n)Ω(n)n2pn2p11/n Unmodulo p casuale x 0 lo vedrà con probabilità 1 - n / p 1 - 1 / n (poiché un polinomio di grado al massimo n ha al massimo n radici).
i=1n(xai)i=1n(xbi)0(modp).
x0p1n/p11/nnn

pn2n2x0p1O(1/n)O(n)p

n2Ω(1/logn)p(logn)O(1)X0pX0

O(n)1-O(1/n)1-O(1/nC)C


1
Mentre questo algoritmo è randomizzato, spiega come implementare le idee in alcune delle altre risposte in modo che funzionino effettivamente. Ha anche un vantaggio rispetto all'approccio hashtable: è sul posto.
Yuval Filmus,

Penso che all'OP non piacciano gli algoritmi probabilistici in quanto non gli piaceva l'algoritmo del tempo lineare previsto usando una tabella hash.
Kaveh,

Kaveh hai ragione. Ma ovviamente questa soluzione è anche interessante e dovrebbe essere mantenuta, risolve il caso degli algoritmi probabilistici. Inoltre, penso che usi il modello che sto cercando.
Albert Hendriks,

1
Mi chiedo solo se la notazione O (1 / n) sia corretta. Ovviamente so cosa intendi, ma penso che per definizione di big-O sia equivalente a O (1).
Albert Hendriks,

2
C/nnO(1).
Yuval Filmus,

-3

proporrò un altro algoritmo (o almeno uno schema di tale algoritmo)

Lo schema presuppone che i valori (presupposti " numeri interi ") siano compresi in un intervallo (stretto?) Tra[mion,mun'X]

  1. Nel O(n)scansionando i due array, possiamo trovare i valori mine maxper entrambi e la loro molteplicità, se questi differiscono, gli array non sono permutazioni l'uno dell'altro

  2. Sottrai mintutti i valori da entrambi gli array (qui il fatto che un array sia già in ordine non viene preso in considerazione, presumibilmente questo può essere migliorato)

  3. Supponiamo che i valori nelle matrici rappresentino le masse e applichiamo un'accelerazione / velocità a ciascuna grandezza1 (questo può essere migliorato fino a un massimo di c>1 in alcuni casi)

  4. spostare le masse fino a raggiungere il valore massimo max-min, questo ha una complessità diO((mun'X-mion)n). Ciò consente di trovare sia gli stessi valori sia la loro molteplicità, se questi differiscono, gli array non sono permutazioni l'uno dell'altro. Altrimenti decidi che le matrici sono permutazioni l'una dell'altra.

notare che lo schema dell'algoritmo sopra può essere (deterministico) abbastanza veloce in molte situazioni pratiche.

Lo schema dell'algoritmo sopra riportato è una variazione di un algoritmo di ordinamento a tempo lineare che impiega " masse mobili ". L'intuizione fisica dietro l' algoritmo di ordinamento delle " masse in movimento " è questa:

Supponiamo che il valore di ogni oggetto rappresenti effettivamente la sua grandezza di massa e immagina di disporre tutti gli oggetti in una linea e applicare la stessa forza di accelerazione.

Quindi ogni oggetto si sposterà fino a una distanza relativa alla sua massa, più enorme meno distanza e viceversa. Quindi, per recuperare gli oggetti ordinati, è sufficiente raccogliere gli articoli in ordine inverso per distanza percorsa.

Questo algoritmo è lineare e deterministico , ma c'è un avvertimento in quanto la quantità di forza di accelerazione iniziale e la distanza da percorrere (o il tempo di attesa) è correlata alla distribuzione dei valori (cioè le " masse ", ilmun'X-mionfattore sopra). Si può anche provare a discretizzare lo spazio per gli oggetti di viaggiare in una griglia e ottenere un fattore costante nella velocità dell'algoritmo (e utilizzare una routine di ordinamento rapido per ordinare elementi diversi nella stessa cella ).

A questo proposito, l'algoritmo sopra riportato è simile agli algoritmi di ordinamento basati su valori numerici (ad es. Radix-sort , counting-sort )

Si potrebbe pensare che questo algoritmo non significhi molto, ma mostra almeno una cosa. Ciò, " fondamentalmente ", a livello fisico, l'ordinamento di numeri arbitrari è un'operazione a tempo lineare nel numero di elementi.


In termini di raccolta degli articoli in ordine inverso rispetto alla distanza percorsa, ciò non si tradurrebbe in confronti a livello di implementazione, e a quel punto non dovresti ordinare le "distanze"?
JustAnotherSoul,
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.