Skip to content
This repository has been archived by the owner on Nov 2, 2024. It is now read-only.

Commit

Permalink
Merge pull request #137 from TeenBiscuits/apuntes-tema-7-y-8
Browse files Browse the repository at this point in the history
Apuntes Tema 7 y 8
  • Loading branch information
TeenBiscuits authored May 13, 2024
2 parents 2dc2e77 + e4246c8 commit 74339cd
Show file tree
Hide file tree
Showing 11 changed files with 242 additions and 11 deletions.
1 change: 1 addition & 0 deletions .reuse/dep5
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,6 @@ License: LicenseRef-UNPLASH
Files: src/Ejemplos/TAD_Rational/*
PDFs/*
docs/images/Apuntes/Pro-2/Tema-3/*
docs/images/Apuntes/Pro-2/Tema-7-y-8/*
Copyright: Facultade de Informatica de A Coruna
License: CC-BY-4.0
2 changes: 2 additions & 0 deletions docs/code/Ejemplos/Tema_7/findKey.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// EN CONSTRUCCIÓN
// COLABORA https://github.com/TeenBiscuits/Pro2324
2 changes: 2 additions & 0 deletions docs/code/Ejemplos/Tema_7/insertKey.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// EN CONSTRUCCIÓN
// COLABORA https://github.com/TeenBiscuits/Pro2324
2 changes: 2 additions & 0 deletions docs/code/Ejemplos/Tema_7/removeKey.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// EN CONSTRUCCIÓN
// COLABORA https://github.com/TeenBiscuits/Pro2324
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 0 additions & 3 deletions docs/pro.tree
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,8 @@ SPDX-License-Identifier: GPL-3.0-only
<toc-element topic="Tema-4-y-5-Colas-y-Pilas.md"
accepts-web-file-names="tema-4.html,tema-4-colas.html,tema-5-pilas.html,tema-5.html"/>
<toc-element topic="Tema-6-Arboles.md" accepts-web-file-names="tema-6.html"/>
<toc-element toc-title="Tema 7 y 8 - Árboles Binarios de Búsqueda ABB y Equilibrados AVL"/>
<!--
<toc-element topic="Tema-7-y-8-Arboles-Binarios-de-Busqueda.md"
accepts-web-file-names="tema-7.html,tema-8.html"/>
-->
</toc-element>
<toc-element topic="Bibliografia.md"/>
</toc-element>
Expand Down
3 changes: 1 addition & 2 deletions docs/topics/00-Inicio/Apuntes.topic
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@
<a href="Tema-3-Listas.md" type="network"/>
<a href="Tema-4-y-5-Colas-y-Pilas.md" type="data"/>
<a href="Tema-6-Arboles.md" type="branch"/>
<a href="Inicio.topic" type="lock" summary="¡En construcción!">Tema 7 y 8 - Árboles Binarios de Búsqueda ABB y Equilibrados AVL</a>
<!-- <a href="Tema-7-y-8-Arboles-Binarios-de-Busqueda.md" type="search"/> -->
<a href="Tema-7-y-8-Arboles-Binarios-de-Busqueda.md" type="search"/>
</secondary>

<!-- Créditos -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,13 @@ SPDX-License-Identifier: CC-BY-NC-4.0
<tldr id="tldr">

El TAD Árbol Binario de Búsqueda ABB y el TAD Árbol Binario de Búsqueda AVL, especificación informal, implementación y
descripción gráfica. Operaciones explicadas de forma gráfica e implementadas.
descripción gráfica. Operaciones explicadas de forma gráfica e implementadas. Rotaciones (LL, RR, LR y RL) y factor de
equilibrio.

</tldr>

<include from="Para-Colaboradores.md" element-id="en-construccion"></include>

## TAD Árbol Binario de Búsqueda ABB

### Definición {id=abb-definicion}
Expand All @@ -35,12 +38,231 @@ descripción gráfica. Operaciones explicadas de forma gráfica e implementadas.
---
title: Árbol binario de búsqueda (ABB)
---
flowchart
flowchart TB
k(((k))) --> A[/claves < k\] & B[/claves > k\]
```

### Pros y contras

- Eficiencia del proceso de búsqueda en árboles equilibrados
- Si los nodos se añaden en un orden aleatorio habrá que equilibrarlo
```mermaid
---
title: Árbol sin equilibrar
---
flowchart TB
k[[6]] --> 1[[1]] & 8[[8]]
1 --> 0[[0]] & 2[[2]]
2 --> NULL[[NULL]] & 4[[4]]
8 --> 7[[7]]
```
- Si los nodos se añaden en un orden determinado el árbol degenerará en una lista ordenada
```mermaid
---
title: Árbol degenerado en lista
---
flowchart TB
k[[4]] --> 3[[3]] & NULL1[[NULL]]
3 --> 2[[2]] & NULL2[[NULL]]
2 --> 1[[1]] & NULL3[[NULL]]
```

### Operaciones {id=abb-operaciones}

Basándonos en el [TAD Árbol](Tema-6-Arboles.md#operaciones) definimos las operaciones del árbol de búsqueda a cambiar.

<note>

Para más información: [TAD Árbol](Tema-6-Arboles.md#operaciones)
y [](Tema-1-Tipos-Abstractos-de-Datos-TAD.md#especificaci-n-de-un-tad)

</note>

#### Generadoras

<list>
<li>
<code-block lang="tex"> createEmptyTree \rightarrow Tree </code-block><br/>
</li>
<li>
<code-block lang="tex"> insertKey(Tree, Key) \rightarrow Tree, bool </code-block><br/>
<p>
Objetivo: Insertar un nodo con información en el árbol, en su lugar correspondiente, de acuerdo al valor de una clave<br/>
Entrada: <br/>
- Tree: Árbol a modificar<br/>
- Key: Dato a insertar<br/>
Salida: Tree: Nuevo árbol que resulta de la inserción y verdadero si se ha podido insertar o si la clave existe, falso en caso contrario.<br/>
Poscondición: El árbol incorpora un nuevo nodo con los datos si éstos no existían en el árbol
</p>
<code-block lang="mermaid">
flowchart TB
Key(Key: 25)
K[[30]] --&gt; A[[20]] &amp; B[[40]]
A --&gt; NULL[[NULL]] &amp; C[[25]]
K -. 25 &lt; 30 .-&gt; A -. 25 &gt; 20 .-&gt; C
</code-block>
<code-block lang="c" src="./Ejemplos/Tema_7/insertKey.c" collapsible="true" collapsed-title="Mostrar implementación"/>
</li>
</list>

#### Observadoras

<list>
<li>
<code-block lang="tex"> leftChild(Tree) \rightarrow Tree </code-block><br/>
</li>
<li>
<code-block lang="tex"> rightChild(Tree) \rightarrow bool </code-block><br/>
</li>
<li>
<code-block lang="tex"> root(Tree) \rightarrow Item </code-block><br/>
</li>
<li>
<code-block lang="tex"> isEmptyTree(Tree) \rightarrow bool </code-block><br/>
</li>
<li>
<code-block lang="tex"> findKey(Key, Tree) \rightarrow Tree </code-block>
<p>
Objetivo: Devuelve el subárbol cuya raíz contiene la clave<br/>
Entrada: <br/>
- Key: Dato a buscar<br/>
- Tree: Árbol a manipular<br/>
Salida: Tree: Acceso al árbol cuya raíz contiene la clave, o nulo si éste no existe (el árbol está vacío o no contiene esa clave)<br/>
</p>
<code-block lang="mermaid">
flowchart TB
key(Key: 25)
k[[30]] --&gt; A[[20]] &amp; B[[40]]
A --&gt; D[[15]] &amp; E[[25]]
B --&gt; F[[35]] &amp; G[[45]]
k -. 25 &lt; 30 .-&gt; A -. 25 &gt; 20 .-&gt; E
</code-block>
<code-block lang="c" src="./Ejemplos/Tema_7/findKey.c" collapsible="true" collapsed-title="Mostrar implementación"/>
</li>
</list>

#### Destructoras

<list>
<li>
<code-block lang="tex"> removeKey(Key, Tree) \rightarrow Tree </code-block>
<p>
Objetivo: Eliminar el nodo cuyo contenido coincide con la clave<br/>
Entrada: <br/>
- Key: Clave del nodo a eliminar<br/>
- Tree: Árbol a modificar<br/>
Salida: Tree: Nuevo árbol sin el nodo eliminado<br/>
Precondición: La clave existe en el árbol<br/>
</p>
<note>Se deben tener en cuenta los hijos del nodo a borrar, ya que deben continuar en el árbol. Si el nodo tienen dos hijos, se sustituye por el mayor de los hijos menores (subárbol izquierdo).</note>
<code-block lang="mermaid">
flowchart TB
key(A eliminar: 87)
A[[120]] --&gt; B[[87]] &amp; C[[140]]
B --&gt; D[[43]] &amp; E[[93]]
D --&gt; NULL1(NULL) &amp; F[[65]]
F --&gt; G[[56]] &amp; NULL2(NULL)
</code-block>
<code-block lang="mermaid">
flowchart TB
key(A eliminar: 87)
A[[120]] --&gt; B[[87]] &amp; C[[140]]
B --&gt; D[[43]] &amp; E[[93]]
subgraph Subárbol izquierdo
D --&gt; NULL1(NULL) &amp; F[[65]]
F --&gt; G[[56]] &amp; NULL2(NULL)
end
</code-block>
<code-block lang="mermaid">
flowchart TB
key(A eliminar: 87)
A[[120]] --&gt; B[[87]] &amp; C[[140]]
B --&gt; D[[43]] &amp; E[[93]]
subgraph Subárbol izquierdo
D --&gt; NULL1(NULL) &amp; F[[65]]
F --&gt; G[[56]] &amp; NULL2(NULL)
end
F -. el mayor .-&gt; B
</code-block>
<code-block lang="mermaid">
flowchart TB
key(A eliminar: 87)
A[[120]] --&gt; B[[65]] &amp; C[[140]]
B --&gt; D[[43]] &amp; E[[93]]
subgraph Subárbol izquierdo
D --&gt; NULL(NULL) &amp; G[[56]]
end
</code-block>
<code-block lang="c" src="./Ejemplos/Tema_7/removeKey.c" collapsible="true" collapsed-title="Mostrar implementación"/>
</li>
</list>

## Árboles Binarios de Búsqueda Equilibrados (AVL)

Un árbol binario de búsqueda equilibrado es un árbol de búsqueda (_redundante ya lo sé_) en el que, para cada
nodo, se cumple que la diferencia de altura de sus subárboles **nunca es mayor que uno** (las diferencias son en valor
absoluto, intervalo [-1, 1]).

Estos árboles hacen búsquedas **muy eficientes**, ya que mantienen **una altura mínima** evitando así los [**árboles
degenerados**](#pros-y-contras).

El **factor de equilibrio** (balance factor) de un nodo se define como la **altura de su subárbol derecho** menos
**altura de su subárbol izquierdo**. Para ser un AVL debes tener un **factor de equilibrio en cada nodo entre [-1, 1]**.

```tex
bf(N) = hNDch - hNIzq
```

```mermaid
---
title: Árbol AVL Equilibrado
---
flowchart TB
k(((_-1_))) --> A((_1_)) & B((_0_))
A --> C((_0_)) & D((_0_))
D --> F((_0_)) & G((_0_))
B --> H((_0_)) & I((_0_))
```

```mermaid
---
title: Árbol ABL No equilibrado
---
flowchart TB
k(((_-2_))) --> A((_2_)) & B((_0_))
A --> C(NULL) & D((_0_))
D --> F((_0_)) & G((_0_))
B --> H((_0_)) & I((_0_))
```

| Pros | Contras |
|------------------------------------------------------------|------------------------------------------------------------------------------------------|
| Eficiencia del proceso de búsqueda en árboles equilibrados | Si los nodos se añaden en un orden aleatorio habrá que equilibrarlo |
| | Si los nodos se añaden en un orden determinado el árbol degenerará en una lista ordenada |
<note>

Se denominan AVL en honor a Adelson, Velskii y Landis, que fueron los primeros en proponer este
TAD. [Wikipedia](https://es.wikipedia.org/wiki/Árbol_AVL)

</note>

### Operaciones {id=avl-operaciones}

Respecto a la [especificación del árbol binario de búsqueda ABB](#abb-operaciones) solo cambian las funciones de
inserción y borrados, que también deben **mantener equilibrado el árbol**.

Si el árbol está en perfecto equilibrio una inserción o un borrado no romperá el equilibrio. De no estarlo, una
inserción o un borrado podría romper el equilibrio.

![EqInserción.png](EqInserción.png)

Para solucionar estó debemos emplear [](#rotaciones-para-restaurar-el-equilibrio).

### Rotaciones para restaurar el equilibrio

- Rotaciones simples
- Son aquellas que involucran a dos nodos.
- La rotación left-left (LL) y la rotación right-right (RR).
- Rotaciones complejas
- Son aquellas que involucran a tres nodos.
- Tenemos la rotación right-left (RL) y la rotación left-right (LR).

Ejemplos gráficos:

<include from="Para-Colaboradores.md" element-id="en-construccion"></include>
2 changes: 2 additions & 0 deletions src/Ejemplos/Tema_7/findKey.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// EN CONSTRUCCIÓN
// COLABORA https://github.com/TeenBiscuits/Pro2324
2 changes: 2 additions & 0 deletions src/Ejemplos/Tema_7/insertKey.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// EN CONSTRUCCIÓN
// COLABORA https://github.com/TeenBiscuits/Pro2324
2 changes: 2 additions & 0 deletions src/Ejemplos/Tema_7/removeKey.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// EN CONSTRUCCIÓN
// COLABORA https://github.com/TeenBiscuits/Pro2324

0 comments on commit 74339cd

Please sign in to comment.