2012-08-02 13 views
5

Questa domanda mi è stata data durante un'intervista. L'intervista è finita da un pezzo, ma sto ancora pensando problema HTE e la sua bugging me:riga casuale nel file

Si dispone di un linguaggio che contiene i seguenti strumenti: una funzione rand(), while e for loop, if dichiarazioni, e un metodo readline() (simile a Python readline()). Dati questi strumenti, scrivi un algoritmo che restituisce una riga casuale nel file. Non conosci la dimensione del file e puoi eseguire il looping dei contenuti del file solo una volta.

+0

Hanno richiesto una distribuzione uniforme nella linea restituita? Perché sarebbe banale fare altrimenti. – KRyan

risposta

7

non so la risposta desiderata, ma la mia soluzione sarebbe il seguente:

chosen_line = "" 
lines = 0 

while (current_line = readline()): 
    if (rand(0, lines) == 0): 
     chosen_line = current_line 

    lines++ 

return chosen_line 

Edit: Una buona spiegazione perché questo funziona è stato pubblicato in this comment.

+1

Questo è quello che stavano cercando. Volevano vedere se si sapeva che il prodotto di '(n/(n + 1))' come 'n' va da' 1' a 'p' è' 1/(p + 1) '. (Fornibile per induzione.) –

+7

Se non vedi perché il codice sopra funziona, pensalo in questo modo: Prende la prima riga con probabilità 1. Esatto per una linea. Nella seconda riga, passa a quella linea per metà tempo, quindi metà del tempo ha la prima riga, metà del tempo la seconda, buona finora. Sulla terza riga, prende la terza riga per 1/3 del tempo. Sappiamo già metà del tempo rimanente della prima riga (1/3) e metà del tempo rimanente del secondo (1/3). Quindi ancora buono per tre linee. E così via. –

+1

@DavidSchwartz +1 La spiegazione è apprezzata. – Josh

0

Un metodo, garantendo una distribuzione uniforme:

(1) leggere il file riga per riga in un array (o simile, ad esempio pitone list)

(2) Usare rand() per selezionare un numero compreso tra 0 e l'indice più grande nella matrice.

Un altro, non garantendo una distribuzione uniforme:

leggere ogni riga. Su ogni lettura, chiama anche rand(). Se oltre una soglia, restituire la linea.

+3

Downvoter: spiega cosa c'è di sbagliato in questa risposta. – Marcin

+0

Beh, non ho fatto un downvote, ma è chiaramente inferiore alla risposta accettata che ottiene una distribuzione uniforme senza usare un array. E gli array non erano una delle funzionalità linguistiche che l'OP diceva fossero disponibili. – jahhaj

-1

Sebbene simile alla terza opzione di Marcin, l'implementazione di Luc restituisce sempre la prima riga, mentre analizza l'intero file.

Dovrebbe essere qualcosa di simile:

chosen_line = "" 
treshold = 90 
max = 100 

while chosen_line == "": 
    current_line = readline() 
    if (rand(0, max) > treshold): 
     chosen_line = current_line 

print chosen_line 

Si potrebbe anche tornare current_line nel caso è stata scelta nessuna linea e leggere l'intero file.

+2

L'implementazione di Luc non restituisce sempre la prima riga e questa non fornisce una distribuzione uniforme. -1. – geoffspear

+1

Ora capisco il codice di Luc. Stai ancora analizzando l'intero file, ma non è descritto nel problema come qualcosa da evitare. – gepatino

+1

Non c'è alcun indizio su quanto tempo il file può essere. Potrebbero essere cinque righe, ma anche cinque milioni. Per ottenere qualsiasi tipo di casualità in esso, dovrete leggere l'intero file per scoprirlo. Dati i problemi di capacità, potresti limitare quanto legge o così ... Ma non c'è nulla a riguardo nella domanda. – Luc

Problemi correlati