Al igual que muchas buenas preguntas de la entrevista, la pregunta se formula de forma un tanto ambigua/imprecisa, para obligar al entrevistado a hacer preguntas aclaratorias y suposiciones del estado. Creo que algunas de las otras respuestas aquí son buenas, ya que abordan estas suposiciones y demuestran una comprensión a gran escala.
Estoy asumiendo que el texto se almacena 'offline' en alguna parte, pero hay una manera de iterar sobre cada palabra en el texto sin cargar todo el texto en la memoria.
Luego el código F # a continuación encuentra las N palabras superiores. Solo la estructura de datos es un mapeo de pares clave-valor (palabra, frecuencia), y solo mantiene el N superior de esos, por lo que el uso de la memoria es O (N), que es pequeño. El tiempo de ejecución es O (numWordsInText^2), que es pobre, pero aceptable dadas las limitaciones del problema. La esencia del algoritmo es simple, para cada palabra en el texto, cuente cuántas veces ocurre, y si está en el mejor N en ejecución, entonces agréguelo a la lista y elimine la entrada mínima anterior.
Tenga en cuenta que el programa actual a continuación carga todo el texto en la memoria, simplemente por comodidad de la exposición.
#light
// some boilerplate to grab a big piece of text off the web for testing
open System.IO
open System.Net
let HttpGet (url: string) =
let req = System.Net.WebRequest.Create(url)
let resp = req.GetResponse()
let stream = resp.GetResponseStream()
let reader = new StreamReader(stream)
let data = reader.ReadToEnd()
resp.Close()
data
let text = HttpGet "http://www-static.cc.gatech.edu/classes/cs2360_98_summer/hw1"
let words = text.Split([|' ';'\r';'\n'|], System.StringSplitOptions.RemoveEmptyEntries)
// perhaps 'words' isn't actually stored in memory, but so long as we can
// 'foreach' over all the words in the text we're good
let N = 5 // how many 'top frequency' words we want to find
let FindMin map =
// key-value pair with mininum value in a map
let (Some(seed)) = Map.first (fun k v -> Some(k,v)) map
map |> Map.fold_left
(fun (mk,mv) k v -> if v > mv then (mk,mv) else (k,v))
seed
let Main() =
let mutable freqCounts = Map.of_list [ ("",0) ]
for word in words do
let mutable count = 0
for x in words do
if x = word then
count <- count + 1
let minStr,minCount = FindMin freqCounts
if count >= minCount then
freqCounts <- Map.add word count freqCounts
if Seq.length freqCounts > N then
freqCounts <- Map.remove minStr freqCounts
freqCounts
|> Seq.sort_by (fun (KeyValue(k,v)) -> -v)
|> Seq.iter (printfn "%A")
Main()
Salida:
[the, 75]
[to, 41]
[in, 34]
[a, 32]
[of, 29]
sería interesante ver su solución! – Codebrain
@Snebal: ¿podría, por favor, pegar su solución? –
Escribí el código en la entrevista.no lo tengo ahora ... lo siento – Snehal