introalg:taller07_5
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
introalg:taller07_5 [2007/05/28 23:26] – nicolasw | introalg:taller07_5 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 106: | Línea 106: | ||
and = foldr (&& | and = foldr (&& | ||
or = foldr (||) False | or = foldr (||) False | ||
+ | |||
+ | |||
==== Ejercicios ==== | ==== Ejercicios ==== | ||
- | * Utilizando aplicaciones, | + | * Utilizando aplicaciones, |
+ | * ¿Cuáles son el // | ||
+ | |||
+ | |||
Línea 128: | Línea 134: | ||
Como 3 de los 4 casos de // | Como 3 de los 4 casos de // | ||
+ | abrochar' | ||
abrochar' | abrochar' | ||
abrochar' | abrochar' | ||
Línea 145: | Línea 152: | ||
encuentraEstafador [] _ = [] | encuentraEstafador [] _ = [] | ||
encuentraEstafador (x:xs) ys | existe (==x) ys = x : encuentraEstafador xs ys | encuentraEstafador (x:xs) ys | existe (==x) ys = x : encuentraEstafador xs ys | ||
- | | otherwise | + | | otherwise |
Esta versión es poco eficiente porque para cada elemento de la primera lista tenemos que recorrer toda la segunda lista. Sin embargo, si suponemos que las listas están ordenadas, podríamos aprovechar este hecho para recorrerlas a ambas de forma más eficiente. | Esta versión es poco eficiente porque para cada elemento de la primera lista tenemos que recorrer toda la segunda lista. Sin embargo, si suponemos que las listas están ordenadas, podríamos aprovechar este hecho para recorrerlas a ambas de forma más eficiente. | ||
- | ===Ejercicios=== | + | |
+ | ====Ejercicios==== | ||
* Definir //iguales :: Eq a => [a] -> [a] -> Bool// que decide si dos listas son iguales. | * Definir //iguales :: Eq a => [a] -> [a] -> Bool// que decide si dos listas son iguales. | ||
- | * Definir // | + | * Definir // |
* Activar con '': | * Activar con '': | ||
- | + | * Supongamos ahora que el listado | |
- | FIXME | + | < |
- | Yo sacaría todo esto o lo reduciría a ser el último ejercicio de esta sección. | + | listadoSubsidio |
- | + | listadoSubsidio = [(23763956," | |
- | Como se ve por la especificación de tipos de encuentraEstafador, | + | listadoMuni |
- | + | listadoMuni | |
- | FIXME | + | </ |
- | Pondría [(dni,Nombre)] y [(nombre,dni)] para poder usar fst y snd. | + | |
- | la:: yo quería dejar la cosa en esa forma para que ellos definieran su fst y snd para triplas, pero si quieres lo dejamos así. | + | |
- | Les daría un caso concreto definiendo dos constantes listadoSubsidio y listadoMunicipales para que prueben | + | |
- | la:: eso quiere decir que les armemos los archivos de entrada nosotros, como para el caso de webGraph? | + | |
- | También metería un ejercicio que sea esto, usar encuentraEstafador a partir de fst,snd y map. | + | |
- | + | ||
- | fst :: (a,b) -> a | + | |
- | fst (x,_) = x | + | |
- | + | ||
- | snd :: (a,b) -> b | + | |
- | snd (_,y) = y | + | |
- | + | ||
- | + | ||
- | Ahora supongamos que estas listas no están ordenadas por DNI, sino por nombre. En ese caso, una vez obtuvimos la lista de DNIs, tenemos que ordenarlas para poder aplicar en algoritmo eficiente (encuentraEstafador' | + | |
- | + | ||
- | FIXME | + | |
- | No me metería con "ordenar antes", | + | |
- | la:: pero tiene mucho más parecido con un problema real, no? vamos, por eso lo puse, pero lo podemos sacar, ningún problema. | + | |
- | + | ||
- | Teniendo en cuenta todos estos añadidos, cómo podríamos componer una función encuentraEstafador' | + | |
- | + | ||
- | Vean que la función resultante puede quedar bien sencilla de leer justamente porque estamos usando otras funciones que hemos definido antes o que se encuentran definidas en el preludio. Nuestro objetivo para problemas complejos será identificar las subpartes de un problema que se pueden aislar y tratar en una función separada, a ser posible una función que ya haya sido definida y no tengamos que volver a definir. | + | |
Línea 206: | Línea 191: | ||
< | < | ||
-- extensión para poder leer archivos en Strings | -- extensión para poder leer archivos en Strings | ||
- | import IOExts | + | import |
-- constante principal con el grafo de la web. | -- constante principal con el grafo de la web. | ||
Línea 214: | Línea 199: | ||
-- carga un archivo en un String, usa IOExts | -- carga un archivo en un String, usa IOExts | ||
leeArchivo :: String -> String | leeArchivo :: String -> String | ||
- | leeArchivo nombre = unsafePerformIO$ readFile nombre | + | leeArchivo nombre = unsafePerformIO $ readFile nombre |
-- transforma el contenido del archivo de String a lista de tuplas | -- transforma el contenido del archivo de String a lista de tuplas | ||
Línea 222: | Línea 207: | ||
where | where | ||
fuente = takeWhile (not.esSeparador) xs | fuente = takeWhile (not.esSeparador) xs | ||
- | todoMenosFuente = drop 1 (dropWhile (not.esSeparador) xs) | + | todoMenosFuente = dropWhile esSeparador |
destino = takeWhile (not.esFinLinea) todoMenosFuente | destino = takeWhile (not.esFinLinea) todoMenosFuente | ||
- | resto = drop 1 (dropWhile (not.esFinLinea) todoMenosFuente) | + | resto = dropWhile esFinLinea |
esSeparador, | esSeparador, | ||
- | esSeparador x = x=='|' | + | esSeparador x = elem x "| " |
- | esFinLinea | + | esFinLinea |
</ | </ | ||
Línea 243: | Línea 228: | ||
Main> take 32 (map fst webGraph) | Main> take 32 (map fst webGraph) | ||
[" | [" | ||
- | |||
Línea 251: | Línea 235: | ||
Vamos a desarrollar diferentes funciones para obtener información de esta lista. | Vamos a desarrollar diferentes funciones para obtener información de esta lista. | ||
- | * Antes que nada necesitamos | + | * Determinar cuales y cuantas páginas se apuntan a si mismas. |
+ | * Para los siguientes puntos necesitaremos | ||
* //primeros :: [(a,b)] -> [a]// y //segundos :: [(a,b)] -> [b]// que le toman la primera y segunda coordenada a cada elemento de la lista de pares. Sirve para obtener todas las urls fuente y destino respectivamente. Ayuda: con '' | * //primeros :: [(a,b)] -> [a]// y //segundos :: [(a,b)] -> [b]// que le toman la primera y segunda coordenada a cada elemento de la lista de pares. Sirve para obtener todas las urls fuente y destino respectivamente. Ayuda: con '' | ||
* // | * // | ||
- | * Ahora queremos saber si un determinado url está en nuestro modelo simplificado y acotado de la web. La función que nos determina si un elemento está o no está en una lista es un acumulador, ya que parte de una lista y nos devuelve un valor (booleano), más en concreto el acumulador //elemento :: a -> [a] -> Bool//. En el preámbulo hay una función que devuelve True si un elemento dado está en una lista, cuál es? Si no la encontramos podemos definirla utilizando '' | + | * Ahora queremos saber si un determinado url está en nuestro modelo simplificado y acotado de la web. La función que nos determina si un elemento está o no está en una lista es un acumulador, ya que parte de una lista y nos devuelve un valor (booleano), más en concreto el acumulador //elemento :: Eq a => a -> [a] -> Bool//. En el preámbulo hay una función que devuelve True si un elemento dado está en una lista, cuál es? Si no la encontramos podemos definirla utilizando '' |
* ¿Cómo podemos saber cuántas veces ocurre una determinada página? y cómo podemos distinguir entre cuántas veces en todo el archivo, cuántas veces apuntando, cuántas veces apuntada? Definir //cuantas :: Eq a => a -> [a] -> Int//, donde //cuantas x xs// que determina la cantidad de veces que ocurre //x// en //xs//. Utilizar esto junto a // | * ¿Cómo podemos saber cuántas veces ocurre una determinada página? y cómo podemos distinguir entre cuántas veces en todo el archivo, cuántas veces apuntando, cuántas veces apuntada? Definir //cuantas :: Eq a => a -> [a] -> Int//, donde //cuantas x xs// que determina la cantidad de veces que ocurre //x// en //xs//. Utilizar esto junto a // | ||
* ¿Cómo podemos saber a qué páginas apunta una determinada página? // | * ¿Cómo podemos saber a qué páginas apunta una determinada página? // | ||
Línea 260: | Línea 245: | ||
* ¿Cómo podemos saber cuántas páginas web distintas apuntan a una determinada página? // | * ¿Cómo podemos saber cuántas páginas web distintas apuntan a una determinada página? // | ||
- | FIXME : reescribir | ||
- | la:: reescribir cómo? con ejemplos? | ||
Por último, de cara al futuro o a la próxima clase, podemos pensar cómo aplicaríamos estas funciones (que ahora aplicamos a una sola url) a todas las urls de la lista, recursivamente, | Por último, de cara al futuro o a la próxima clase, podemos pensar cómo aplicaríamos estas funciones (que ahora aplicamos a una sola url) a todas las urls de la lista, recursivamente, |
introalg/taller07_5.1180394778.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)