el grafo web: implementaciones clásicas vs. estructuras...

Post on 03-Oct-2020

3 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

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

top related