Credo che sia possibile risolvere questo problema utilizzando una variante sulla ricerca binaria. L'intuizione dietro questo algoritmo è la seguente. Lascia che i due array siano A e B e assumiamo per semplicità che hanno le stesse dimensioni (non è necessario, come vedrai). Per ogni array, possiamo costruire array paralleli Ac e Bc in modo tale che per ogni indice i, Ac [i] sia il numero di elementi nei due array che non sono più grandi di A [i] e Bc [i] è il numero di elementi nei due array non più grandi di B [i]. Se potessimo costruire questi array in modo efficiente, potremmo trovare il kth più piccolo elemento in modo efficiente facendo ricerche binarie sia su Ac che su Bc per trovare il valore k. La voce corrispondente di A o B per quella voce è quindi il kesimo elemento più grande. La ricerca binaria è valida perché i due array Ac e Bc sono ordinati, il che credo si possa convincere abbastanza facilmente.
Ovviamente, questa soluzione non funziona in tempo sublinear perché richiede O (n) tempo per costruire gli array Ac e Bc. La domanda allora è - c'è un modo che possiamo implicitamente costruire questi array? Cioè, possiamo determinare i valori in questi array senza necessariamente costruire ciascun elemento? I penso che che la risposta è sì, usando questo algoritmo. Iniziamo cercando l'array A per vedere se ha il kth valore più piccolo. Sappiamo per certo che il k più piccolo valore non può apparire nell'array nell'array A dopo la posizione k (assumendo che tutti gli elementi siano distinti). Quindi concentriamoci solo sui primi k elementi dell'array A. Effettueremo una ricerca binaria su questi valori come segue. Inizia alla posizione k/2; questo è il k/2 ° elemento più piccolo nell'array A. Ora fai una ricerca binaria nell'array B per trovare il valore più grande in B più piccolo di questo valore e osserva la sua posizione nell'array; questo è il numero di elementi in B più piccoli del valore corrente. Se sommiamo la posizione degli elementi in A e B, abbiamo il numero totale di elementi nei due array più piccoli dell'elemento corrente. Se questo è esattamente k, abbiamo finito. Se questo è minore di k, allora ricorsiamo nella metà superiore dei primi k elementi di A, e se questo è maggiore di k ricorsiamo nella metà inferiore dei primi elementi di k, ecc. Alla fine, saremo entrambi trova che il k più grande elemento è nella matrice A, nel qual caso abbiamo finito. Altrimenti, ripetere questo processo sull'array B.
Il runtime per questo algoritmo è il seguente. La ricerca dell'array A esegue una ricerca binaria su k elementi, che prende le iterazioni di O (lg k). Ogni iterazione costa O (lg n), dal momento che dobbiamo eseguire una ricerca binaria in B. Ciò significa che il tempo totale per questa ricerca è O (lg k lg n). Il tempo per farlo nell'array B è lo stesso, quindi il runtime netto per l'algoritmo è O (lg k lg n) = O (lg n) = o (n), che è sublineare.
Non penso sia possibile, ma sarò felice di essere smentito, motivo per cui questo è un commento piuttosto che una risposta :-) L'unico modo per rendere l'estratto stesso O (1) è unire le liste che è O (n).A qualsiasi altra soluzione manca il bit vitale di informazioni su come vengono allocati gli interi tra i due elenchi, quindi è necessario esaminare tutti i valori in essi contenuti (sopra quello che stai cercando) - questo lo rende automaticamente O (n) lineare. Ma ti darò +1 per una domanda interessante comunque. – paxdiablo
@ paxdiablo- Puoi controllare la mia risposta e vedere se mi manca qualcosa? Mi sembra di averlo ottenuto in O (lg^2 n). – templatetypedef