Conteggio delle coppie di inversione


14

Una classica applicazione di divisione e conquista è quella di risolvere il seguente problema:

Dato un array di elementi distinti e comparabili, conta il numero di coppie di inversione nell'array: coppie ( i , j ) tali che a [ i ] > a [ j ] e i < j .a[1n](i,j)a[i]>a[j]i<j

Un approccio a questo è quello di fare un Merge Sort, ma anche contare il numero di coppie di inversione nei sotto-problemi. Durante la fase di unione, contiamo il numero di coppie di inversione che si estendono tra i (due) sotto-problemi e aggiungiamo ai conteggi dei sotto-problemi.

Mentre questo è buono, e fornisce un algoritmo di tempo , questo incasina l'array.O(nlogn)

Se abbiamo il vincolo aggiuntivo che l'array è di sola lettura, allora possiamo fare una copia e gestire la copia, o usare una struttura di dati aggiuntiva come un albero binario bilanciato delle statistiche dell'ordine per fare il conteggio, entrambi i quali usano spazio.Θ(n)

La domanda attuale è cercare di migliorare lo spazio, senza influire sul tempo di esecuzione. vale a dire

Esiste un algoritmo di tempo per contare il numero di coppie di inversione, che funziona su un array di sola lettura e utilizza uno spazio sub-lineare (ovvero o ( n ) )?O(nlogn)o(n)

Assumi un modello di RAM a costo uniforme e che gli elementi spazio O ( 1 ) e il confronto tra loro sia O ( 1 ) .O(1)O(1)

Un riferimento farà, ma una spiegazione sarà migliore :-)

Ho provato a cercare sul Web, ma non sono riuscito a trovare una risposta positiva / negativa per questo. Suppongo che questa sia solo una curiosità.


3
Chan e Pătraşcu danno un algoritmo di tempo , ma per quanto ne so scremare la carta, hanno bisogno di Ω ( n ) spazio. o(nlogn)Ω(n)
Raffaello

2
Inoltre, Ajtai et al. dimostrare che qualsiasi algoritmo di streaming temporale (esatto) necessita di Ω ( n ) spazio. Tuttavia, sembrano esserci approssimazioni adeguate ai tuoi criteri. O(n)Ω(n)
Raffaello

1
@Raphael: grazie! Se nessuna risposta è in arrivo, il tuo commento sarebbe la risposta migliore finora.
Aryabhata,

A proposito, sono un po 'confuso dal fatto che Ajtai et al limite inferiore. Il teorema 8 dice "qualsiasi algoritmo", ma il limite inferiore per me sembra essere contrario agli algoritmi di streaming esatti a singolo passaggio, un modello molto limitato
Sasho Nikolov,

@SashoNikolov: Penso che abbiano impostato globalmente il loro modello su algoritmi di streaming, quindi "qualsiasi" sarebbe limitato a quelli. Spero che il mio corollario - qualsiasi algoritmo temporale esatto - sia corretto, cioè che qualsiasi algoritmo a tempo lineare possa essere espresso come algoritmo di streaming con costantemente molti passaggi. Staremo a vedere . O(n)
Raffaello

Risposte:


3

Ecco la risposta di Raffaello:

o(nlogn)Ω(n)O(n) ha bisogno dell'algoritmo di streaming del tempo Ω(n)spazio. Tuttavia, sembrano esserci approssimazioni adeguate ai tuoi criteri.


Grazie per averlo reso una risposta. Lo darò ancora un po 'di tempo. Il traffico sembra aumentare.
Aryabhata,
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.