Conjuntos disjuntos (Relaciones de equivalencia)

Conjuntos disjuntos (Relaciones de equivalencia) Una relación R se define en un conjunto C si para todo par de elementos (a, b), a, b ∈ C, a R b es ve

2 downloads 144 Views 36KB Size

Recommend Stories


Estructuras de datos: Conjuntos disjuntos
Primer enfoque Segundo enfoque Estructuras de datos: Conjuntos disjuntos Algoritmos ´ - Fac. de Informatica ´ Dep. de Computacion ˜ Universidad de A

4.2. Relaciones de equivalencia
142 Cap´ıtulo 4. Representaci´on de conjuntos mediante a´rboles Es m´as, en la aplicaci´on del corrector ortogr´afico interactivo los tries resultan

Conjuntos relaciones y grupos
Matem´ aticas NS Conjuntos relaciones y grupos Tema opcional 2 ´Indice 1. Conjuntos y relaciones 1.1. Introducci´on . . . . . . . . . . . . . .

Tema 3 Conjuntos, Relaciones y Funciones
Tema 3 Conjuntos, Relaciones y Funciones. Conjuntos Los conjuntos se representan con letras mayúsculas, A, B,C ,… Los elementos se representas con min

50 CAP. I. CONJUNTOS, APLICACIONES Y RELACIONES. Ejercicio Dados los conjuntos: Determinar los siguientes conjuntos: Se tiene:
C AP. I. C ONJUNTOS , APLICACIONES Y RELACIONES 50 Ejercicio. 8.1. Dados los conjuntos: A = {a, b, c, d, e}, B = {e, f , g , h}, C = {a, e, i, o, u}

Story Transcript

Conjuntos disjuntos (Relaciones de equivalencia) Una relación R se define en un conjunto C si para todo par de elementos (a, b), a, b ∈ C, a R b es verdadera o falsa. Una relación de equivalencia es una relación que satisface tres propiedades: reflexiva, simétrica y transitiva. Dada una relación de equivalencia ∼, el problema natural es decidir si a ∼ b, para cualesquiera a y b. La clase de equivalencia de un elemento a ∈ C es el subconjunto de C que contiene todos los elementos relacionados con a. • Las clases de equivalencia forman una partición de C: todo elemento de C aparece en exactamente una clase de equivalencia. • Para decidir si a ∼ b, sólo necesitamos comprobar si a y b están en la misma clase de equivalencia.

Representación de conjuntos disjuntos La representación inicial es una colección con n conjuntos, cada uno con un elemento (todas las relaciones son falsas excepto las reflexivas). Cada conjunto tiene un elemento diferente, así que Ci ∩C j = 0/ Mantenemos en un vector el nombre de la clase de equivalencia de cada elemento. Todos los elementos se numeran de 1 a n. Así, al principio se tiene Ci = {i} para i = 1 hasta n. Hay dos operaciones válidas. • La búsqueda devuelve el nombre del conjunto (es decir, la clase de equivalencia) de un elemento dado. • La unión combina dos clases de equivalencia que contienen a y b en una clase de equivalencia nueva, destruyéndose las originales. tipo Elemento = entero; Conj = entero; ConjDisj = vector [1..N] de entero función Buscar1 (C, x) : Conj devolver C[x] fin función

procedimiento Unir1 (C, a, b) i := min (C[a], C[b]); j := max (C[a], C[b]); para k := 1 hasta N hacer si C[k] = j entonces C[k] := i fin para fin procedimiento

La búsqueda es una simple consulta O(1). El nombre del conjunto devuelto por búsqueda es arbitrario. Todo lo que importa es que búsqueda(x)=búsqueda(y) si y sólo si x e y están en el mismo conjunto. La unión toma O(n). No importa, en lo que concierne a corrección qué conjunto retiene su nombre. • Una secuencia de n − 1 uniones (la máxima, ya que entonces todo estaría en un conjunto) tomaría un tiempo O(n2). • Si también hubiese O(n2) operaciones búsqueda, el rendimiento sería bueno porque el tiempo de ejecución total sería O(1) para cada operación unión o búsqueda en el curso del algoritmo. • Si hay menos búsquedas esta cota no es aceptable.

Segundo enfoque Examinaremos una solución al problema que hace fácil la unión, pero difícil la búsqueda. Se utiliza un árbol para representar cada conjunto, pues cada elemento en un árbol tiene la misma raíz. • La raíz se utiliza para nombrar el conjunto. • La representación de los árboles es fácil porque la única información que necesitaremos es un apuntador al padre. • Cada entrada p[i] en el vector representa el padre del elemento i. Si i es una raíz, entonces p[i]=i Una búsqueda sobre el elemento x se efectúa devolviendo la raíz del árbol que contiene x. Para ejecutar una unión de dos conjuntos se combinan ambos árboles haciendo que la raíz de un árbol apunte a la raíz del otro. función Buscar2 (C, x) : Conj r := x; mientras C[r] r hacer r := C[r] fin mientras; devolver r fin función

procedimiento Unir2 (C, raíz1, raíz2) { supone que raíz1 y raíz2 son raíces } si raíz1 < raíz2 entonces C[raíz2] := raíz1 sino C[raíz1] := raíz2 fin procedimiento

La unión toma O(1). Y la búsqueda de un elemento x es proporcional a la profundidad del nodo que representa a x; en el peor caso es O(n) • Una secuencia de m búsquedas y n−1 uniones, toma O(m n) en el peor caso.

Unión por altura

Las uniones anteriores se efectuaban de un modo más bien arbitrario. Una mejora sencilla es realizar uniones haciendo del árbol menos profundo un subárbol del árbol más profundo. La altura de un árbol se incrementa sólo cuando se unen dos árboles de igual profundidad. procedimiento Unir3 (C, A, raíz1, raíz2) { supone que raíz1 y raíz2 son raíces } si A[raíz1] = A[raíz2] entonces A[raíz1] := A[raíz1] + 1; C[raíz2] := raíz1 sino si A[raíz1] > A[raíz2] entonces C[raíz2] := raíz1 sino C[raíz1] := raíz2 fin procedimiento Se demuestra que si las uniones se hacen por altura, la profundidad de cualquier nodo nunca es mayor que log n. • Un nodo está inicialmente a la profundidad 0. Cuando su profundidad se incrementa como resultado de una unión, se coloca en un árbol que es al menos el doble de grande que antes. Así, su profundidad se puede incrementar a lo más, log n veces Eso implica que el tiempo de ejecución de una operación búsqueda es O(log n) y una secuencia de m búsquedas y n − 1 uniones tarda O(m log n + n)

Compresión de caminos

La compresión de caminos se ejecuta durante una operación búsqueda y es independiente de la estrategia con que se efectúen las uniones. En la búsqueda de un elemento x, todo nodo en el camino de x a la raíz cambia su padre por la raíz. • Así, los accesos futuros sobre esos nodos compensarán el trabajo adicional de hacer la compresión de caminos. función Buscar3 (C, x) : Conj r := x; mientras C[r] r hacer r := C[r] fin mientras; i := x; mientras i r hacer j := C[i]; C[i]:= r; i := j fin mientras; devolver r fin función

La compresión de caminos no es del todo compatible con la unión por altura, porque se pueden cambiar las alturas de los árboles.

• Las alturas almacenadas para cada árbol se convierten en alturas estimadas (llamadas rangos), pero ocurre que la unión por rango es tan eficiente en teoría como la unión por altura.

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.