Dato un flusso di input continuo di numeri interi, possiamo trovare il massimo dato qualsiasi intervallo arbitrario (a, b) nel tempo O (log t)?

Sì, questo può essere realizzato utilizzando una versione di streaming di un albero di segmenti. L’idea di base è semplice: per ogni secondo elemento che arriva, memorizzane il massimo e l’elemento precedente in un secondo array. Al momento t, questo array ha dimensioni approssimativamente t / 2. Quindi, per ogni secondo elemento che aggiungi a quell’array , memorizza il massimo di esso e l’elemento precedente che hai aggiunto allo stesso array su un altro array (con circa t / 4 elementi). Continuare a creare matrici fino a quando l’array finale ha 1 elemento.

Mentre lo fai su uno stream, alla fine l’array finale con 1 elemento otterrà un secondo elemento, a quel punto dovresti aggiungere un altro array di dimensioni 1, con il massimo di questi due elementi. Nota che questa struttura usa t + t / 2 + t / 4 +… = O (t) spazio, quindi questo non è male in termini di utilizzo dello spazio.

In termini di tempo impiegato per posizionare gli elementi in questa struttura di dati quando sono pronti dallo stream, scriviamo una voce nell’array di base il 100% delle volte, una voce nell’array successivo il 50% delle volte, una voce all’array dopo quel 25% delle volte, ecc. Effettuando il calcolo, ciò fa una media di solo 2 scritture (e una quantità proporzionale di calcolo) per elemento letto. Quindi, l’inserimento è O (1) per elemento.

Per quanto riguarda l’operazione richiesta nella domanda, l’idea è che se vogliamo il massimo di un intervallo come 1-7 di un array a, possiamo dividerlo in max (a [1], max (a [2 … 7])). Ma a max (a [2… 7]) si può rispondere interamente con l’array ridotto di dimensioni t / 2, perché max (a [2… 7]) = max (b [1… 3]) se b è l’array ridotto . Quindi procediamo allo stesso modo per promuovere la valutazione su array sempre più ridotti. Se esegui l’analisi completa, vedrai che al massimo 2 elementi in ciascun array devono essere esaminati (con solo un numero costante di operazioni per ciascuno) e ci sono array O (log t), perché l’array di base ha t elementi, il successivo ha t / 2, ecc., fino a quando la dimensione non viene ridotta a 1. Pertanto la complessità temporale per una query di intervallo è la O desiderata (log t).

Questa struttura di dati è chiamata albero dei segmenti. La presentazione normale considera solo come risolvere questo problema per array di dimensioni fisse noti in anticipo, ma può funzionare anche per i flussi come l’ho presentato qui.

È possibile risolvere questo problema utilizzando un albero di ricerca bilanciato aumentato. Le tue chiavi sono i timestamp. Ogni nodo nella struttura ha un campo aggiuntivo che ti dà il massimo elemento all’interno della sottostruttura che ha il nodo come root.

Ora puoi fare queste query in O (log t) time.

Un altro modo è utilizzare un albero di segmenti di dimensioni fisse. Quando la t diventa troppo grande, puoi raddoppiare le dimensioni dell’albero del segmento, proprio come raddoppieresti le dimensioni di un array una volta esaurito lo spazio.

Non sono sicuro di aver capito la tua domanda, ma se lo faccio la risposta è no. Non hai detto cos’è n, ma suppongo che sia ba. Dato che non hai vincolato la sequenza in alcun modo, sarà necessario ispezionare ogni articolo da a a b, quindi è O (n). (La prova è per contraddizione: se dici che ci sono elementi tra aeb che non devo ispezionare, sceglierò una sequenza con l’articolo massimo in uno di quegli slot non previsti.) Ma peggio, sembra che noi deve contare gli elementi nello stream da 0 a b, ed è possibile b> a >> n, quindi non possiamo nemmeno garantire O (n).

More Interesting

Quali sono le aree su cui un programmatore Java con esperienza da nove anni dovrebbe concentrarsi mentre si prepara per un'intervista tecnologica su Amazon IDC?

Come ti sei preparato per le tue interviste tecniche di ingegneria del software? Per tutti gli stagisti e gli attuali ingegneri del software là fuori, quando hai ricevuto un'email per dirti che hai un colloquio, quali sono i passi che hai fatto per prepararti?

Con un'intervista di programmazione in coppia presso Square proprio dietro l'angolo, come si può preparare al meglio una mancanza di esperienza nei test unitari?

Quali sono alcune domande di intervista basate su MapReduce?

Come prepararsi per un colloquio con il software engineer di LinkedIn

Come prepararsi al colloquio telefonico per il programma di master informatico di TUM

Come prepararmi per un colloquio tecnico di screening telefonico su booking.com

Qual è il miglior libro di algoritmi per interviste di cracking?

Qual è la migliore strategia per preparare un'intervista di ingegneria del software di Google in una sola settimana?

Perché le persone di solito scelgono Java, C ++ o C # per le interviste tecniche?

Quali sono le domande più frequenti sul colloquio degli sviluppatori SQL entry level?

Una domanda di intervista CS: Come posso scrivere una coda di messaggi da zero?

Quali sono alcune buone domande di intervista di C?

Qual è l'input formale, l'output formale e lo pseudocodice dell'algoritmo per il problema del professor Gecko (CLRS 16.2-4)?

Quanto tempo impiegherebbe uno sviluppatore di software professionale senza conoscenze di algoritmo / struttura dei dati a prepararsi per colloqui di ingegneria di alto livello?