el grafo web: implementaciones clásicas vs. estructuras...
TRANSCRIPT
DataWeb Research http://dataweb.infor.uva.es/
Miguel A. Martínez Prieto & Javier D. Fernández
Universidad de Valladolid
El grafo Web:
Implementaciones Clásicas vs.
Estructuras Compactas
La Revolución de los Datos II
Valladolid, 05/03/2013
World Wide Web
Grafo Web -> Grafo Dirigido
miblog.es
uva.es
tublog.es
periodico.es
conferencias.es
facultad.es
unileon.es
Estudio del grafo de la Web
Distancia media entre nodos es pequeña
6.83
Diámetro es pequeño (camino más largo entre nodos)
16-28 (se suele tomar 19)
Distribuciones Zipf
Enlaces fuera y enlaces que llegan a una Web
Localidad de referencia
>75% de las páginas tiene al menos 1 enlace externo (en promedio entre 5 y 15)
Pero la mayoría en el mismo dominio (servidor)
Grafo Web -> Red Libre de Escala
Topología
28% 24% 24%
9 % no conectados
¿Qué pretendemos? -> Operaciones Básicas
Conocer qué enlaces tiene una Web
Vecinos_Directos(1) = 2, 4, 5
Conocer qué enlaces llegan a una Web
Vecinos_Reversos(2) = 1, 4, 7
Conocer si una Web tiene cierto enlace
Conectados(1,2) = true;
Conectados(2,1) = false;
…
Dos implementaciones clásicas
Lista de Adyacencias
Matriz de Adyacencias
http://es.wikipedia.org/wiki/Grafo_(estructura_de_datos)
Lista de Adyacencias
Fácil implementación (list enlazada, vectores…)
A priori no ocupa demasiado espacio
NO permite vecinos reversos de manera eficiente
Ejemplo práctico GrafoDemo
Ejemplo práctico GrafoDemo. Lista Vector
http://dataweb.infor.uva.es/la-revolucion-de-los-datos-2-jugandoconlosbits/
2 4
1 3
2 4
5
1 3 5
2 4
Ejemplo práctico GrafoDemo. Lista Vector
Conocer qué enlaces tiene una Web
Vecinos_Directos(1)?
Acceso directo, listaDestinos[1]
Conocer qué enlaces llegan a una Web
Vecinos_Reversos(2)?
Recorrido Secuencial
Conocer si una Web tiene cierto enlace
Conectados(2,5) ?
Búsqueda Binaria
2 4
1 3
2 4
5
1 3 5
2 4
Ejemplo práctico GrafoDemo. Lista Vector
¿Tamaño?
Tantos punteros como nodos origen + Tantos ints como aristas
Influencia de los punteros
2 4
1 3
2 4
5
1 3 5
2 4
Demo!
¿Y si colocamos todos los enteros juntos y marcamos el final de cada lista?
Ejemplo práctico GrafoDemo. Lista Bitmap
2 4
1 3
2 4
5
1 3 5
2 4
2 4 1 3 2 4 5 1 3 5 2 4
0 1 0 0 1 0 1 0 0 1 0 1
1er Nodo 2º Nodo 3er Nodo 4º Nodo 5º Nodo
Vuelta a la teoría…
Ejemplo práctico GrafoDemo. Lista Bitmap
2 4 1 3 2 4 5 1 3 5 2 4
0 1 0 0 1 0 1 0 0 1 0 1
Conocer qué enlaces tiene una Web
Vecinos_Directos(2)?
Fin vecinos = localizar la posición del 2º bit = bitmap->select1(2)
Inicio vecinos = localizar la posición del 1er bit+1 = bitmap->select1(1) + 1
Acceder elementos[] entre las posiciones inicio y fin.
Conocer qué enlaces llegan a una Web
Vecinos_Reversos(2)?
Recorrido Secuencial
Conocer si una Web tiene cierto enlace
Conectados(2,5) ?
Obtener inicio y fin vecinos y hacer búsqueda binaria en elementos
1er Nodo 2º Nodo 3er Nodo 4º Nodo 5º Nodo
Ejemplo práctico GrafoDemo. Lista Bitmap
2 4 1 3 2 4 5 1 3 5 2 4
0 1 0 0 1 0 1 0 0 1 0 1
¿Tamaño?
Tantos punteros bits como nodos origen (+overhead) + Tantos ints como aristas
Se puede mejorar usando logBits para los elementos Ejemplo: 4 enteros se representan con 4 enteros*4 bytes/entero = 16 Bytes
Log (4) = 2 bits para representar un entero. Por tanto 4 enteros se pueden representar con 4 enteros * 2 bits/entero = 8 bits (1Byte)
0 00
1 01
2 10
3 11
1er Nodo 2º Nodo 3er Nodo 4º Nodo 5º Nodo
Demo!
¿Y cómo hacemos los vecinos reversos?
Ejemplo práctico GrafoDemo. Lista Wavelet
2 4 1 3 2 4 5 1 3 5 2 4
0 1 0 0 1 0 1 0 0 1 0 1
1er Nodo 2º Nodo 3er Nodo 4º Nodo 5º Nodo
Ej: Me gustaría saber las posiciones en donde aparece el 3
IntSequence Wavelet Tree
Vuelta a la teoría…
Ejemplo práctico GrafoDemo. Lista Wavelet
2 4 1 3 2 4 5 1 3 5 2 4
0 1 0 0 1 0 1 0 0 1 0 1
Conocer qué enlaces tiene una Web
Vecinos_Directos(2)?
Fin vecinos = localizar la posición del 2º bit = bitmap->select1(2)
Inicio vecinos = localizar la posición del 1er bit+1 = bitmap->select1(1) + 1
Acceder elementos[] entre las posiciones inicio y fin.
Conocer qué enlaces llegan a una Web
Vecinos_Reversos(2)?
int numOcurrencias = el->rank(2, el->getNumberOfElements());
for (int i = 0; i < numOcurrencias; i++) {
int pos = el->select(5, i);
cout << " Nodo Origen:" << bitmap->rank1(pos) << endl;
}
1er Nodo 2º Nodo 3er Nodo 4º Nodo 5º Nodo
Ejemplo práctico GrafoDemo. Lista Wavelet
2 4 1 3 2 4 5 1 3 5 2 4
0 1 0 0 1 0 1 0 0 1 0 1
Tamaño
Número de Aristas * Log (Número de Destinos) + overhead +
¿Tamaño?
Tantos bits como nodos origen (+overhead) + Tantos ints como aristas +número de Aristas * Log (Número de Destinos) (+overhead)
1er Nodo 2º Nodo 3er Nodo 4º Nodo 5º Nodo
Gracias!
@DataWebResearch