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 .
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.
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.
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 ) )?
Assumi un modello di RAM a costo uniforme e che gli elementi spazio O ( 1 ) e il confronto tra loro sia 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à.