<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Estructura de Datos y Algoritmos · DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/</link><description>Blog de tecnología, programación y electrónica, para compartir conocimientos, experiencias y tutoriales con este apasionante mundo.</description><generator>Hugo</generator><language>es-CO</language><copyright>Copyright © 2026 DacaDev. All rights reserved.</copyright><lastBuildDate>Tue, 19 May 2026 00:00:00 -0500</lastBuildDate><atom:link href="https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/index.xml" rel="self" type="application/rss+xml"/><image><url>https://blog.dacadev.com/images/blog-logo.png</url><title>DacaCode &lt;/&gt;</title><link>https://blog.dacadev.com/</link></image><item><title>Tablas Hash, Pilas y Colas: Estructuras de Datos de Alto Rendimiento</title><link>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/03-hash-tables-stacks-y-queues/</link><pubDate>Tue, 19 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/03-hash-tables-stacks-y-queues/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende el funcionamiento interno de las Tablas Hash, Hashing y Colisiones. Guía práctica y visual de Stacks (Pilas) y Queues (Colas) en TypeScript.</description><media:content url="https://blog.dacadev.com/images/programming/structures-algorithms/03-hash-tables-stacks-queues/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#1-qué-es-una-tabla-hash-hash-table"&gt;1. ¿Qué es una Tabla Hash (Hash Table)?&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#cómo-funciona-el-hashing"&gt;¿Cómo funciona el Hashing?&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#colisiones-y-load-factor"&gt;Colisiones y Load Factor&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#eficiencia-de-las-operaciones-en-una-hash-table"&gt;Eficiencia de las Operaciones en una Hash Table&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#ejemplo-práctico-optimizando-código-con-tablas-hash"&gt;Ejemplo Práctico: Optimizando código con Tablas Hash&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#la-versión-lenta-on-cdot-m---bucles-anidados"&gt;La versión lenta (O(N \cdot M)) - Bucles anidados:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-versión-veloz-on--m---usando-una-tabla-hash"&gt;La versión veloz (O(N + M)) - Usando una Tabla Hash:&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#pilas-stacks"&gt;Pilas (Stacks)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#sus-3-reglas-de-oro"&gt;Sus 3 Reglas de Oro:&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#colas-queues"&gt;Colas (Queues)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#sus-3-reglas-de-oro-1"&gt;Sus 3 Reglas de Oro:&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Hasta ahora hemos visto estructuras secuenciales como los Arrays, donde buscar un elemento requiere revisar celda por celda &lt;em&gt;O(N)&lt;/em&gt; o usar búsqueda binaria &lt;em&gt;O(log N)&lt;/em&gt; si están ordenados. Pero, ¿qué pasaría si te dijera que existe una estructura capaz de buscar, insertar y borrar datos en &lt;strong&gt;un solo paso &lt;em&gt;O(1)&lt;/em&gt;&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;Hoy explicaremos las &lt;strong&gt;Tablas Hash (Hash Tables)&lt;/strong&gt;,las &lt;strong&gt;Pilas (Stacks)&lt;/strong&gt; y las &lt;strong&gt;Colas (Queues)&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-qué-es-una-tabla-hash-hash-table"&gt;1. ¿Qué es una Tabla Hash (Hash Table)?&lt;/h2&gt;
&lt;p&gt;Una &lt;strong&gt;Tabla Hash&lt;/strong&gt; (conocida en Python como &lt;em&gt;diccionario&lt;/em&gt;, en JavaScript como &lt;em&gt;objeto&lt;/em&gt; o &lt;em&gt;Map&lt;/em&gt;, y en Go como &lt;em&gt;map&lt;/em&gt;) es una estructura que asocia &lt;strong&gt;claves (keys)&lt;/strong&gt; con &lt;strong&gt;valores (values)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A diferencia de los Arrays, donde los elementos están ordenados por índices numéricos continuos, las Tablas Hash son estructuras no ordenadas. Su velocidad absurda radica en su proceso interno: el &lt;strong&gt;Hashing&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="cómo-funciona-el-hashing"&gt;¿Cómo funciona el Hashing?&lt;/h3&gt;
&lt;p&gt;Cuando guardamos un dato en una Tabla Hash (por ejemplo, &lt;code&gt;{&amp;quot;cab&amp;quot; =&amp;gt; &amp;quot;taxi&amp;quot;}&lt;/code&gt;), la computadora no busca una celda libre al azar. Utiliza una &lt;strong&gt;función hash (hash function)&lt;/strong&gt; para convertir la clave de texto en un índice numérico específico.&lt;/p&gt;
&lt;p&gt;Supongamos que inventamos una función hash súper simple que suma el valor alfabético de las letras de la clave:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;A = 1, B = 2, C = 3, D = 4, E = 5&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si guardamos la clave &lt;code&gt;&amp;quot;ACE&amp;quot;&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;A(1) + C(3) + E(5) = 9&lt;/em&gt;. El valor se almacena en el índice &lt;strong&gt;9&lt;/strong&gt; de nuestra memoria física.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si guardamos &lt;code&gt;&amp;quot;CAB&amp;quot;&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;C(3) + A(1) + B(2) = 6&lt;/em&gt;. El valor se almacena en el índice &lt;strong&gt;6&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 Key["Clave: 'ACE'"] --&gt; HashFunc["Función Hash&lt;br/&gt;(Suma de letras)"]
 HashFunc --&gt; Index["Índice: 9"]
 Index --&gt; Memory["[Celda 9] = 'star'"]
&lt;/pre&gt;

&lt;p&gt;Cuando quieres buscar el valor asociado a &lt;code&gt;&amp;quot;ACE&amp;quot;&lt;/code&gt;, la computadora no recorre toda la tabla. Simplemente calcula de nuevo &lt;code&gt;Hash(&amp;quot;ACE&amp;quot;) = 9&lt;/code&gt; y accede de forma instantánea al índice 9 en &lt;strong&gt;1 paso (O(1))&lt;/strong&gt;. ¡Es brillante!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="colisiones-y-load-factor"&gt;Colisiones y Load Factor&lt;/h2&gt;
&lt;p&gt;¿Qué pasa si intentamos insertar &lt;code&gt;&amp;quot;DAB&amp;quot;&lt;/code&gt; en nuestro ejemplo anterior?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;D(4) + A(1) + B(2) = 7&lt;/em&gt;
¿Y si intentamos insertar &lt;code&gt;&amp;quot;BAD&amp;quot;&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;&lt;em&gt;B(2) + A(1) + D(4) = 7&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ambas claves dan el mismo índice, a esto se le conoce como &lt;strong&gt;Colisión Hash&lt;/strong&gt;. Cuando esto ocurre, la celda 7 debe almacenar una sub-lista de valores, lo que degrada el rendimiento de la búsqueda.&lt;/p&gt;
&lt;p&gt;Para evitar colisiones en la vida real, las funciones hash usan matemáticas complejas y se rigen por la regla del &lt;strong&gt;Factor de Carga (Load Factor)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La proporción ideal es tener &lt;strong&gt;10 celdas de memoria por cada 7 elementos&lt;/strong&gt; almacenados (un factor de carga de 0.7). Esto mantiene un equilibrio perfecto entre uso de memoria y prevención de colisiones.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="eficiencia-de-las-operaciones-en-una-hash-table"&gt;Eficiencia de las Operaciones en una Hash Table&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operación&lt;/th&gt;
 &lt;th&gt;Por Clave (Key)&lt;/th&gt;
 &lt;th&gt;Por Valor (Value)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Búsqueda&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;O(1)&lt;/strong&gt; (Constante)&lt;/td&gt;
 &lt;td&gt;O(N) (Lineal)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Inserción&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;O(1)&lt;/strong&gt; (Constante)&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Eliminación&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;O(1)&lt;/strong&gt; (Constante)&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;La búsqueda de &lt;em&gt;O(1)&lt;/em&gt; solo funciona en &lt;strong&gt;una dirección&lt;/strong&gt;: desde la clave al valor. Si necesitas buscar una clave a partir de su valor, la computadora obligatoriamente deberá recorrer toda la estructura de forma lineal (O(N)).&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="ejemplo-práctico-optimizando-código-con-tablas-hash"&gt;Ejemplo Práctico: Optimizando código con Tablas Hash&lt;/h2&gt;
&lt;p&gt;Imagina que debes escribir una función en TypeScript que determine si un arreglo es un subconjunto de otro (es decir, si todos los elementos de un arreglo &lt;code&gt;array2&lt;/code&gt; existen en &lt;code&gt;array1&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id="la-versión-lenta-on-cdot-m---bucles-anidados"&gt;La versión lenta (O(N \cdot M)) - Bucles anidados:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;isSubsetSlow&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt;&amp;gt;(&lt;span style="color:#e06c75"&gt;arr1&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;[], &lt;span style="color:#e06c75"&gt;arr2&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;[])&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;boolean&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;// Compara cada elemento del segundo arreglo contra todos los del primero
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;val2&lt;/span&gt; &lt;span style="color:#c678dd"&gt;of&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr2&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;let&lt;/span&gt; &lt;span style="color:#e06c75"&gt;found&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;boolean&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;val1&lt;/span&gt; &lt;span style="color:#c678dd"&gt;of&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; (&lt;span style="color:#e06c75"&gt;val2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;===&lt;/span&gt; &lt;span style="color:#e06c75"&gt;val1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;found&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; (&lt;span style="color:#56b6c2"&gt;!&lt;/span&gt;&lt;span style="color:#e06c75"&gt;found&lt;/span&gt;) &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="la-versión-veloz-on--m---usando-una-tabla-hash"&gt;La versión veloz (O(N + M)) - Usando una Tabla Hash:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;function&lt;/span&gt; &lt;span style="color:#e06c75"&gt;isSubsetFast&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt; &lt;span style="color:#e06c75"&gt;extends&lt;/span&gt; &lt;span style="color:#e06c75"&gt;PropertyKey&lt;/span&gt;&amp;gt;(&lt;span style="color:#e06c75"&gt;arr1&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;[], &lt;span style="color:#e06c75"&gt;arr2&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;T&lt;/span&gt;[])&lt;span style="color:#56b6c2"&gt;:&lt;/span&gt; &lt;span style="color:#c678dd"&gt;boolean&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;hashTable&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;Record&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;boolean&lt;/span&gt;&amp;gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; {} &lt;span style="color:#c678dd"&gt;as&lt;/span&gt; &lt;span style="color:#e06c75"&gt;Record&lt;/span&gt;&amp;lt;&lt;span style="color:#e06c75"&gt;T&lt;/span&gt;, &lt;span style="color:#e06c75"&gt;boolean&lt;/span&gt;&amp;gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;// Guardamos todos los elementos de arr1 en la tabla hash en O(N)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt; &lt;span style="color:#c678dd"&gt;of&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;hashTable&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;// Comprobamos la existencia de arr2 en O(M)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; (&lt;span style="color:#c678dd"&gt;const&lt;/span&gt; &lt;span style="color:#e06c75"&gt;value&lt;/span&gt; &lt;span style="color:#c678dd"&gt;of&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr2&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; (&lt;span style="color:#56b6c2"&gt;!&lt;/span&gt;&lt;span style="color:#e06c75"&gt;hashTable&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;value&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al transformar la búsqueda lineal anidada en una búsqueda instantánea en una Tabla Hash, convertimos un algoritmo pesado de complejidad multiplicativa a uno de complejidad sumatoria. ¡Es la diferencia entre que un proceso tarde horas o milisegundos!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="pilas-stacks"&gt;Pilas (Stacks)&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;Pilas (Stacks)&lt;/strong&gt; son una estructura de datos abstracta y altamente restrictiva. A diferencia de un Array normal donde puedes leer o insertar en cualquier parte, en un Stack las reglas son estrictas.&lt;/p&gt;
&lt;p&gt;Se rigen bajo el principio &lt;strong&gt;LIFO (Last In, First Out)&lt;/strong&gt;: el último elemento en entrar es el primero en salir. Imagínalo como una pila de platos en un restaurante, solo puedes interactuar con el plato de arriba.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 subgraph Pila Stack - LIFO
 direction TB
 E3["[Plato 3] &lt;-- Cima (Peek/Pop)"]
 E2["[Plato 2]"]
 E1["[Plato 1] &lt;-- Base"]
 end
&lt;/pre&gt;

&lt;h3 id="sus-3-reglas-de-oro"&gt;Sus 3 Reglas de Oro:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Los datos solo se pueden insertar al final (&lt;strong&gt;Push&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Los datos solo se pueden eliminar del final (&lt;strong&gt;Pop&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Solo se puede leer el último elemento (&lt;strong&gt;Peek&lt;/strong&gt; o Cima).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;¿Por qué usar una estructura tan restrictiva?&lt;/strong&gt;
Porque nos da seguridad. Al restringir las operaciones de acceso, garantizamos que nadie pueda corromper el orden de los datos intermedios. Es el motor detrás del botón &amp;ldquo;Deshacer&amp;rdquo; (Ctrl+Z) de tu editor de texto y del &lt;strong&gt;Call Stack&lt;/strong&gt; de tu procesador.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="colas-queues"&gt;Colas (Queues)&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;Colas (Queues)&lt;/strong&gt; son la contraparte directa del Stack. Representan fielmente la fila de un banco o supermercado.&lt;/p&gt;
&lt;p&gt;Se rigen por el principio &lt;strong&gt;FIFO (First In, First Out)&lt;/strong&gt;: el primer elemento en llegar es el primero en ser atendido.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 subgraph Cola Queue - FIFO
 direction LR
 S1["[Cliente 1] En cabeza (Atender/Dequeue)"] --&gt; S2["[Cliente 2]"] --&gt; S3["[Cliente 3] En cola (Llegada/Enqueue)"]
 end
&lt;/pre&gt;

&lt;h3 id="sus-3-reglas-de-oro-1"&gt;Sus 3 Reglas de Oro:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Los datos solo se insertan al final (&lt;strong&gt;Enqueue&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Los datos solo se eliminan del inicio (&lt;strong&gt;Dequeue&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Solo se puede leer el elemento del inicio.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Casos de uso comunes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Colas de impresión: los documentos se imprimen exactamente en el orden en que fueron enviados.&lt;/li&gt;
&lt;li&gt;Gestión de tareas asíncronas en servidores web (Message Queues).&lt;/li&gt;
&lt;li&gt;Procesos de background en sistemas operativos.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Entendiendo la Notación Big O y los Algoritmos de Ordenamiento Básicos</title><link>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/02-big-o-notation-y-algoritmos-de-ordenamiento/</link><pubDate>Mon, 18 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/02-big-o-notation-y-algoritmos-de-ordenamiento/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Aprende a analizar la complejidad temporal de tu código con Big O. Explicación paso a paso de Bubble Sort, Selection Sort e Insertion Sort con ejemplos en Python.</description><media:content url="https://blog.dacadev.com/images/programming/structures-algorithms/02-big-o-and-sorting-algorithms/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#qué-es-la-notación-big-o"&gt;¿Qué es la Notación Big O?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#1-ordenamiento-burbuja-bubble-sort"&gt;1. Ordenamiento Burbuja (Bubble Sort)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#el-proceso-paso-a-paso"&gt;El proceso paso a paso:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#implementación-en-python"&gt;Implementación en Python:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#eficiencia-de-bubble-sort"&gt;Eficiencia de Bubble Sort&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#2-ordenamiento-por-selección-selection-sort"&gt;2. Ordenamiento por Selección (Selection Sort)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#el-proceso-paso-a-paso-1"&gt;El proceso paso a paso:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#implementación-en-python-1"&gt;Implementación en Python:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#eficiencia-de-selection-sort"&gt;Eficiencia de Selection Sort&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#3-optimizando-para-escenarios-optimistas-insertion-sort"&gt;3. Optimizando para Escenarios Optimistas (Insertion Sort)&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#el-proceso-paso-a-paso-2"&gt;El proceso paso a paso:&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#implementación-en-python-2"&gt;Implementación en Python:&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#la-gran-revelación-el-impacto-de-los-escenarios"&gt;La gran revelación: El impacto de los escenarios&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#por-qué-insertion-sort-es-tan-especial"&gt;¿Por qué Insertion Sort es tan especial?&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;¿Cómo podemos comparar dos algoritmos de manera formal? En el &lt;a href="https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/01-estructuras-de-datos-y-algoritmos-fundamentos"



 


&gt;post anterior&lt;/a&gt;, vimos que contar los segundos es una mala idea porque depende del hardware. Aprendimos que contar los &lt;strong&gt;pasos&lt;/strong&gt; es el camino correcto.&lt;/p&gt;
&lt;p&gt;Hoy aprenderemos a usar la &lt;strong&gt;Notación Big O&lt;/strong&gt;, el estándar que usamos en la industria para catalogar la eficiencia del software, y la aplicaremos analizando tres algoritmos de ordenamiento clásicos: &lt;strong&gt;Bubble Sort&lt;/strong&gt;, &lt;strong&gt;Selection Sort&lt;/strong&gt; e &lt;strong&gt;Insertion Sort&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="qué-es-la-notación-big-o"&gt;¿Qué es la Notación Big O?&lt;/h2&gt;
&lt;p&gt;La &lt;strong&gt;Notación Big O&lt;/strong&gt; es una herramienta matemática que describe la eficiencia de un algoritmo en función de cómo crece su número de pasos a medida que el tamaño de los datos de entrada (denotado como &lt;strong&gt;N&lt;/strong&gt;) aumenta.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No nos dice la cantidad exacta de milisegundos que tardará un programa, sino &lt;strong&gt;la relación de crecimiento&lt;/strong&gt; entre el volumen de datos y el esfuerzo del procesador.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Los tres perfiles más comunes que hemos visto hasta ahora son:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;O(1) - Tiempo Constante&lt;/strong&gt;: El algoritmo siempre requiere la misma cantidad de pasos, sin importar si N es 10 o 10 millones (por ejemplo, leer un índice en un Array).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O(N) - Tiempo Lineal&lt;/strong&gt;: El número de pasos crece en proporción directa a los datos (por ejemplo, buscar un elemento mediante Búsqueda Lineal).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O(log N) - Tiempo Logarítmico&lt;/strong&gt;: El algoritmo es sumamente eficiente. Cada vez que duplicamos los datos, solo se agrega &lt;strong&gt;un paso&lt;/strong&gt; más al total (por ejemplo, la Búsqueda Binaria).&lt;/li&gt;
&lt;/ol&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;strong&gt;Nota matemática:&lt;/strong&gt; El logaritmo usado en Big O es en &lt;strong&gt;base 2&lt;/strong&gt; (log₂ N), no en base 10. Representa cuántas veces puedes dividir N a la mitad antes de llegar a 1.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Veamos gráficamente cómo se comparan estas curvas de crecimiento:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 subgraph Eficiencia de Algoritmos
 direction TB
 C1["Excelente: O(1)"]
 C2["Muy Bueno: O(log N)"]
 C3["Aceptable: O(N)"]
 C4["Ineficiente: O(N²)"]
 end
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Curvas de crecimiento de Big O&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-ordenamiento-burbuja-bubble-sort"&gt;1. Ordenamiento Burbuja (Bubble Sort)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Bubble Sort&lt;/strong&gt; es uno de los algoritmos de ordenamiento más simples e intuitivos. Se llama &amp;ldquo;Burbuja&amp;rdquo; porque los valores más altos van &amp;ldquo;flotando&amp;rdquo; gradualmente hacia el final del arreglo, como burbujas en el agua.&lt;/p&gt;
&lt;h3 id="el-proceso-paso-a-paso"&gt;El proceso paso a paso:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Apuntas a los dos primeros elementos consecutivos del arreglo.&lt;/li&gt;
&lt;li&gt;Si el de la izquierda es mayor que el de la derecha, los &lt;strong&gt;intercambias (swap)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Mueves los punteros una celda a la derecha y repites la comparación.&lt;/li&gt;
&lt;li&gt;Repites el proceso hasta llegar al final del arreglo. Al terminar esta primera pasada, el número más alto está garantizado a estar en la última celda.&lt;/li&gt;
&lt;li&gt;Regresas al inicio y realizas otra pasada completa.&lt;/li&gt;
&lt;li&gt;El proceso termina cuando completas una pasada entera &lt;strong&gt;sin realizar ningún intercambio&lt;/strong&gt;, lo que significa que todo está perfectamente ordenado.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 Start["[4, 2, 7, 1]"] --&gt; Step1["Comparar 4 y 2 -&gt; ¡Intercambiar!"]
 Step1 --&gt; Step2["[2, 4, 7, 1]"]
 Step2 --&gt; Step3["Comparar 4 y 7 -&gt; No intercambiar"]
 Step3 --&gt; Step4["[2, 4, 7, 1]"]
 Step4 --&gt; Step5["Comparar 7 y 1 -&gt; ¡Intercambiar!"]
 Step5 --&gt; EndPass["[2, 4, 1, 7] -&gt; Primera pasada completada (7 está ordenado)"]
&lt;/pre&gt;

&lt;h3 id="implementación-en-python"&gt;Implementación en Python:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;bubble_sort&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;unsorted_until_index&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;is_sorted&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;bool&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;while&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;not&lt;/span&gt; &lt;span style="color:#e06c75"&gt;is_sorted&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;is_sorted&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;unsorted_until_index&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;# Intercambio rápido en Python:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;], &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;&lt;span style="color:#56b6c2"&gt;+&lt;/span&gt;&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;], &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;is_sorted&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;unsorted_until_index&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;-=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="eficiencia-de-bubble-sort"&gt;Eficiencia de Bubble Sort&lt;/h3&gt;
&lt;p&gt;Para ordenar un arreglo de tamaño &lt;strong&gt;N&lt;/strong&gt;, en el peor de los casos realizamos aproximadamente &lt;strong&gt;N²&lt;/strong&gt; comparaciones e intercambios.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complejidad&lt;/strong&gt;: &lt;strong&gt;O(N²)&lt;/strong&gt; o &lt;strong&gt;Tiempo Cuadrático&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Veredicto&lt;/strong&gt;: Altamente ineficiente para grandes conjuntos de datos. A medida que &lt;strong&gt;N&lt;/strong&gt; se duplica, el número de pasos se multiplica por &lt;strong&gt;cuatro&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-ordenamiento-por-selección-selection-sort"&gt;2. Ordenamiento por Selección (Selection Sort)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Selection Sort&lt;/strong&gt; toma un camino diferente: en lugar de ir comparando parejas consecutivas, realiza una pasada completa para &amp;ldquo;seleccionar&amp;rdquo; el elemento más pequeño del arreglo y colocarlo en su posición final.&lt;/p&gt;
&lt;h3 id="el-proceso-paso-a-paso-1"&gt;El proceso paso a paso:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Comienzas en el índice &lt;code&gt;0&lt;/code&gt;. Recorres todo el arreglo buscando el valor más pequeño.&lt;/li&gt;
&lt;li&gt;Al terminar la pasada, intercambias el valor más pequeño con el elemento en el índice &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Te mueves al índice &lt;code&gt;1&lt;/code&gt; y repites el proceso buscando el menor valor del resto del arreglo.&lt;/li&gt;
&lt;li&gt;Repites esto aumentando el índice de inicio en &lt;code&gt;1&lt;/code&gt; cada vez, hasta llegar al final.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 Start["[4, 2, 7, 1]"] --&gt; Step1["Buscar el menor desde índice 0 -&gt; Es 1"]
 Step1 --&gt; Swap1["Intercambiar 1 (menor) con 4 (índice 0)"]
 Swap1 --&gt; Step2["[1, 2, 7, 4]"]
 Step2 --&gt; Step3["Buscar el menor desde índice 1 -&gt; Es 2"]
 Step3 --&gt; Swap2["2 ya está en su lugar -&gt; No hay cambios"]
 Swap2 --&gt; Step4["[1, 2, 7, 4]"]
 Step4 --&gt; Step5["Buscar el menor desde índice 2 -&gt; Es 4"]
 Step5 --&gt; Swap3["Intercambiar 4 con 7 (índice 2)"]
 Swap3 --&gt; End["[1, 2, 4, 7] -&gt; ¡Completamente Ordenado! 🎉"]
&lt;/pre&gt;

&lt;h3 id="implementación-en-python-1"&gt;Implementación en Python:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;selection_sort&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;(&lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;) &lt;span style="color:#56b6c2"&gt;-&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#e06c75"&gt;j&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;i&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;)):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;j&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;j&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;!=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;i&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;], &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;lowest_number_index&lt;/span&gt;], &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;i&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="eficiencia-de-selection-sort"&gt;Eficiencia de Selection Sort&lt;/h3&gt;
&lt;p&gt;Si contamos los pasos de Selection Sort, en promedio realiza unas N²/2 comparaciones. Sin embargo, dado que &lt;strong&gt;Big O elimina las constantes&lt;/strong&gt; (las fracciones y multiplicaciones por números fijos), su complejidad teórica también queda como &lt;strong&gt;O(N²)&lt;/strong&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice tip"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" width="22" height="22"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M15.362 5.214A8.252 8.252 0 0 1 12 21 8.25 8.25 0 0 1 6.038 7.047 8.287 8.287 0 0 0 9 9.601a8.983 8.983 0 0 1 3.361-6.867 8.21 8.21 0 0 0 3 2.48Z" /&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 18a3.75 3.75 0 0 0 .495-7.468 5.99 5.99 0 0 0-1.925 3.547 5.975 5.975 0 0 1-2.133-1.001A3.75 3.75 0 0 0 12 18Z" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Tip&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;&lt;strong&gt;¿Selection Sort o Bubble Sort?&lt;/strong&gt; Aunque ambos son categorizados bajo el mismo grupo O(N²), Selection Sort es aproximadamente &lt;strong&gt;el doble de rápido&lt;/strong&gt; en la vida real porque realiza un máximo de N intercambios, mientras que Bubble Sort puede realizar hasta N² intercambios.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="3-optimizando-para-escenarios-optimistas-insertion-sort"&gt;3. Optimizando para Escenarios Optimistas (Insertion Sort)&lt;/h2&gt;
&lt;p&gt;Hasta ahora hemos analizado el rendimiento basándonos en el &lt;strong&gt;peor caso posible&lt;/strong&gt;. Pero en el desarrollo real, muchas veces nos encontramos con arreglos que ya están parcialmente ordenados. Aquí es donde brilla &lt;strong&gt;Insertion Sort&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Insertion Sort&lt;/strong&gt; funciona de manera similar a como ordenarías un mazo de cartas en tu mano.&lt;/p&gt;
&lt;h3 id="el-proceso-paso-a-paso-2"&gt;El proceso paso a paso:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Comienzas en el índice &lt;code&gt;1&lt;/code&gt; (la segunda celda). Remueves temporalmente el valor y lo guardas en una variable temporal (&lt;code&gt;temp&lt;/code&gt;), dejando un &amp;ldquo;hueco&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Comparas cada elemento a la izquierda del hueco con el valor en &lt;code&gt;temp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Si el elemento de la izquierda es mayor que &lt;code&gt;temp&lt;/code&gt;, lo desplazas una posición hacia la derecha (el hueco se mueve hacia la izquierda).&lt;/li&gt;
&lt;li&gt;Repites el paso 3 hasta encontrar un elemento menor o igual a &lt;code&gt;temp&lt;/code&gt;, o llegar al inicio del arreglo.&lt;/li&gt;
&lt;li&gt;Colocas el valor de &lt;code&gt;temp&lt;/code&gt; en el hueco actual.&lt;/li&gt;
&lt;li&gt;Repites el ciclo avanzando al siguiente índice.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="implementación-en-python-2"&gt;Implementación en Python:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;insertion_sort&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]) &lt;span style="color:#56b6c2"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;list&lt;/span&gt;[&lt;span style="color:#e5c07b"&gt;int&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;for&lt;/span&gt; &lt;span style="color:#e06c75"&gt;index&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;in&lt;/span&gt; &lt;span style="color:#e5c07b"&gt;range&lt;/span&gt;(&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;, &lt;span style="color:#e5c07b"&gt;len&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;)):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;temp_value&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;index&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;position&lt;/span&gt;: &lt;span style="color:#e5c07b"&gt;int&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;index&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;-&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;while&lt;/span&gt; &lt;span style="color:#e06c75"&gt;position&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;position&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e06c75"&gt;temp_value&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;position&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;position&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;position&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;-=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;[&lt;span style="color:#e06c75"&gt;position&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#e06c75"&gt;temp_value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;return&lt;/span&gt; &lt;span style="color:#e06c75"&gt;arr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="la-gran-revelación-el-impacto-de-los-escenarios"&gt;La gran revelación: El impacto de los escenarios&lt;/h2&gt;
&lt;p&gt;Analicemos la eficiencia de los tres algoritmos comparando sus mejores, peores y promedio casos:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Algoritmo&lt;/th&gt;
 &lt;th&gt;Peor Caso (Worst Case)&lt;/th&gt;
 &lt;th&gt;Caso Promedio (Average)&lt;/th&gt;
 &lt;th&gt;Mejor Caso (Best Case)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Bubble Sort&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;O(N) (si ya está ordenado)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Selection Sort&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Insertion Sort&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;O(N²)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;O(N)&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="por-qué-insertion-sort-es-tan-especial"&gt;¿Por qué Insertion Sort es tan especial?&lt;/h3&gt;
&lt;p&gt;Si le pasamos un arreglo que &lt;strong&gt;ya está ordenado&lt;/strong&gt; a Insertion Sort, el bucle &lt;code&gt;while&lt;/code&gt; interno se rompe inmediatamente en el primer paso (&lt;code&gt;break&lt;/code&gt;). No hace ningún desplazamiento de datos. Por lo tanto, se ejecuta en un espectacular &lt;strong&gt;tiempo lineal O(N)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si tus datos están mayoritariamente ordenados, &lt;strong&gt;Insertion Sort es por mucho la mejor opción&lt;/strong&gt; entre los ordenamientos básicos.&lt;/p&gt;</content:encoded></item><item><title>Estructuras de Datos y Algoritmos: Los Fundamentos que Todo Dev Debe Saber</title><link>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/01-estructuras-de-datos-y-algoritmos-fundamentos/</link><pubDate>Sun, 17 May 2026 00:00:00 -0500</pubDate><guid>https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/01-estructuras-de-datos-y-algoritmos-fundamentos/</guid><dc:creator>Dacadev</dc:creator><category>programación</category><description>Descubre por qué importan las estructuras de datos y cómo medir su eficiencia en pasos en lugar de segundos. Guía completa de Arrays, Sets y Búsqueda Binaria.</description><media:content url="https://blog.dacadev.com/images/programming/structures-algorithms/01-structures-algorithms-fundamentals/banner.png" medium="image" type="image/png"/><content:encoded>
&lt;details class="table-of-content "&gt;
 &lt;summary&gt;
 
 Tabla de Contenido
 
 &lt;/summary&gt;
 &lt;nav id="TableOfContents"&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#por-qué-importa-la-estructura"&gt;¿Por qué importa la estructura?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#qué-es-una-estructura-de-datos"&gt;¿Qué es una Estructura de Datos?&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#midiendo-la-velocidad-del-código"&gt;Midiendo la velocidad del código&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#el-array"&gt;El Array&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#las-4-operaciones-fundamentales-en-un-array"&gt;Las 4 Operaciones Fundamentales en un Array&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#1-lectura-read--get"&gt;1. Lectura (Read / Get)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#2-búsqueda-search"&gt;2. Búsqueda (Search)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#3-inserción-insert"&gt;3. Inserción (Insert)&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#4-eliminación-delete"&gt;4. Eliminación (Delete)&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#sets-cómo-una-sola-regla-cambia-toda-la-eficiencia"&gt;Sets: Cómo una sola regla cambia toda la eficiencia&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="#arreglos-ordenados"&gt;Arreglos Ordenados&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#inserción-en-arreglos-ordenados"&gt;Inserción en Arreglos Ordenados&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;li&gt;&lt;a href="#búsqueda-binaria"&gt;Búsqueda Binaria&lt;/a&gt;
 &lt;ol&gt;
 &lt;li&gt;&lt;a href="#búsqueda-binaria-vs-búsqueda-lineal"&gt;Búsqueda Binaria vs. Búsqueda Lineal&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;
 &lt;/li&gt;
 &lt;/ol&gt;
&lt;/nav&gt;
&lt;/details&gt;

&lt;p&gt;Si estás dando tus primeros pasos en el desarrollo de software, es muy común que midas el éxito de tu código con una única pregunta: &lt;strong&gt;¿funciona y hace lo que se supone que debe hacer?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sin embargo, a medida que avanzas en tu carrera, te das cuenta de que existe un mundo entero de otras métricas críticas, como por ejemplo: &lt;em&gt;¿Qué tan rápido se ejecuta?&lt;/em&gt; &lt;em&gt;¿Cuánta memoria consume?&lt;/em&gt; &lt;em&gt;¿Es escalable si el volumen de datos crece por mil?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Para escribir código que no solo funcione sino que sea verdaderamente profesional, debes dominar dos pilares fundamentales: las &lt;strong&gt;estructuras de datos&lt;/strong&gt; y los &lt;strong&gt;algoritmos&lt;/strong&gt;. Empecemos por lo básico: ¿qué son y por qué importan?&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="por-qué-importa-la-estructura"&gt;¿Por qué importa la estructura?&lt;/h2&gt;
&lt;p&gt;Consideremos una tarea sencilla: escribir una función en Python que imprima todos los números pares del 2 al 100.&lt;/p&gt;
&lt;p&gt;Aquí tienes la &lt;strong&gt;versión uno&lt;/strong&gt; (menos eficiente):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;print_numbers_version_one&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;while&lt;/span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;# Si el número es par, lo imprimimos:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;if&lt;/span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;%&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;==&lt;/span&gt; &lt;span style="color:#d19a66"&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;number&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y aquí tienes la &lt;strong&gt;versión dos&lt;/strong&gt; (más eficiente):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c678dd"&gt;def&lt;/span&gt; &lt;span style="color:#61afef;font-weight:bold"&gt;print_numbers_version_two&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#c678dd"&gt;while&lt;/span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;100&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;number&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#7f848e"&gt;# Incrementamos por 2 directo al siguiente número par:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e06c75"&gt;number&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+=&lt;/span&gt; &lt;span style="color:#d19a66"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ambos programas producen exactamente el mismo resultado. Pero la versión uno realiza &lt;strong&gt;100 iteraciones&lt;/strong&gt; y comprueba la paridad en cada paso. La versión dos solo hace &lt;strong&gt;50 iteraciones&lt;/strong&gt; y no realiza comprobaciones matemáticas innecesarias. Es el doble de eficiente.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="qué-es-una-estructura-de-datos"&gt;¿Qué es una Estructura de Datos?&lt;/h2&gt;
&lt;p&gt;Una &lt;strong&gt;estructura de datos&lt;/strong&gt; es la manera física y lógica en la que &lt;strong&gt;organizamos&lt;/strong&gt;, &lt;strong&gt;gestionamos&lt;/strong&gt; y &lt;strong&gt;almacenamos&lt;/strong&gt; los datos en nuestro código. La forma en que eliges organizar tus datos afecta directamente la rapidez con la que tu programa puede operar con ellos.&lt;/p&gt;
&lt;p&gt;Para un mismo propósito, puedes usar diferentes estructuras. Por ejemplo, si deseas unir tres palabras:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Usando variables simples&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;x&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;¡Hola! &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;y&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;¿Cómo estás &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;z&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; &lt;span style="color:#98c379"&gt;&amp;#34;hoy?&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;x&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;y&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;z&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#7f848e"&gt;# Usando un Array (o Lista en Python)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;array&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#34;¡Hola! &amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;¿Cómo estás &amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;hoy?&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e5c07b"&gt;print&lt;/span&gt;(&lt;span style="color:#e06c75"&gt;array&lt;/span&gt;[&lt;span style="color:#d19a66"&gt;0&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;array&lt;/span&gt;[&lt;span style="color:#d19a66"&gt;1&lt;/span&gt;] &lt;span style="color:#56b6c2"&gt;+&lt;/span&gt; &lt;span style="color:#e06c75"&gt;array&lt;/span&gt;[&lt;span style="color:#d19a66"&gt;2&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="midiendo-la-velocidad-del-código"&gt;Midiendo la velocidad del código&lt;/h2&gt;
&lt;p&gt;Un error clásico es medir la velocidad de un programa cronometrando los segundos que tarda en completarse. &lt;strong&gt;No es la mejor manera&lt;/strong&gt;, El tiempo de ejecución en segundos varía según:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El procesador y hardware de la máquina.&lt;/li&gt;
&lt;li&gt;Qué otros programas se están ejecutando en segundo plano.&lt;/li&gt;
&lt;li&gt;El lenguaje de programación y su compilador o intérprete.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para medir la velocidad de manera científica y objetiva, contamos &lt;strong&gt;la cantidad de pasos físicos&lt;/strong&gt; que requiere un algoritmo para completarse.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="el-array"&gt;El Array&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;Array&lt;/strong&gt; (o arreglo) es la estructura de datos más básica y el punto de partida de casi todo en computación. Físicamente, un array es un bloque &lt;strong&gt;continuo&lt;/strong&gt; de memoria.&lt;/p&gt;
&lt;p&gt;Un array tiene dos características clave:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Tamaño (Size)&lt;/strong&gt;: El número total de elementos que contiene.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Índice (Index)&lt;/strong&gt;: La posición numérica de cada celda. En la gran mayoría de lenguajes de programación, empezamos a contar desde &lt;strong&gt;0&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e06c75"&gt;array&lt;/span&gt; &lt;span style="color:#56b6c2"&gt;=&lt;/span&gt; [&lt;span style="color:#98c379"&gt;&amp;#34;manzanas&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;bananas&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;pepinos&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;dátiles&amp;#34;&lt;/span&gt;, &lt;span style="color:#98c379"&gt;&amp;#34;arándanos&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podemos representar la memoria de un array así:&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 a0["[0] manzanas&lt;br/&gt;Mem: 1000"]
 a1["[1] bananas&lt;br/&gt;Mem: 1001"]
 a2["[2] pepinos&lt;br/&gt;Mem: 1002"]
 a3["[3] dátiles&lt;br/&gt;Mem: 1003"]
 a4["[4] arándanos&lt;br/&gt;Mem: 1004"]
 a0 --- a1 --- a2 --- a3 --- a4
&lt;/pre&gt;

&lt;h3 id="las-4-operaciones-fundamentales-en-un-array"&gt;Las 4 Operaciones Fundamentales en un Array&lt;/h3&gt;
&lt;p&gt;Para evaluar qué tan eficiente es una estructura de datos, analizamos cuántos pasos le toma realizar las cuatro operaciones básicas:&lt;/p&gt;
&lt;h4 id="1-lectura-read--get"&gt;1. Lectura (Read / Get)&lt;/h4&gt;
&lt;p&gt;Consiste en obtener el valor que está en un índice específico (por ejemplo, &amp;ldquo;¿qué hay en la posición 3?&amp;rdquo;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;¿Cómo lo hace la computadora?&lt;/strong&gt; Al estar guardados en memoria de manera continua, la computadora hace un cálculo matemático simple: &lt;code&gt;DirecciónInicio + (Índice * TamañoCelda)&lt;/code&gt;. Va directo a la celda en &lt;strong&gt;1 paso&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eficiencia&lt;/strong&gt;: 1 paso (constante).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-búsqueda-search"&gt;2. Búsqueda (Search)&lt;/h4&gt;
&lt;p&gt;Consiste en encontrar el índice de un elemento sabiendo únicamente su valor (por ejemplo, &amp;ldquo;¿en qué posición están los &amp;lsquo;pepinos&amp;rsquo;?&amp;rdquo;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;¿Cómo lo hace?&lt;/strong&gt; La computadora no puede ver el contenido de todo el array a la vez. Debe ir celda por celda, de izquierda a derecha, comprobando si el valor coincide. A esto se le llama &lt;strong&gt;Búsqueda Lineal&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eficiencia&lt;/strong&gt;: Si el elemento está al principio, toma 1 paso. Si está al final o no existe, toma &lt;strong&gt;N pasos&lt;/strong&gt; (siendo N el tamaño del array). En el peor de los casos, la eficiencia es de &lt;strong&gt;N pasos&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-inserción-insert"&gt;3. Inserción (Insert)&lt;/h4&gt;
&lt;p&gt;Consiste en agregar un nuevo elemento al array. Aquí tenemos dos escenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Insertar al final&lt;/strong&gt;: Es súper sencillo. La computadora simplemente coloca el valor en la siguiente celda libre. Toma &lt;strong&gt;1 paso&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Insertar al inicio o en medio&lt;/strong&gt;: ¡Aquí viene el dolor de cabeza! Para meter un valor al inicio (índice 0), primero debemos mover &lt;strong&gt;todos&lt;/strong&gt; los elementos existentes una celda hacia la derecha para abrir espacio.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 subgraph Antes de Insertar
 A0["[0] A"] --&gt; A1["[1] B"] --&gt; A2["[2] C"]
 end
 subgraph Proceso de Desplazamiento
 D0["Desplazar C a [3]"] --&gt; D1["Desplazar B a [2]"] --&gt; D2["Desplazar A a [1]"]
 end
 subgraph Resultado Final
 R0["[0] NUEVO"] --&gt; R1["[1] A"] --&gt; R2["[2] B"] --&gt; R3["[3] C"]
 end
&lt;/pre&gt;

&lt;p&gt;Si el array tiene tamaño N, insertar al principio toma &lt;strong&gt;N desplazamientos + 1 inserción = N + 1 pasos&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id="4-eliminación-delete"&gt;4. Eliminación (Delete)&lt;/h4&gt;
&lt;p&gt;Consiste en borrar un elemento de un índice específico. Al igual que con la inserción, si borramos el elemento del inicio, dejamos un &amp;ldquo;hueco vacío&amp;rdquo;. Las reglas de los arrays exigen que no haya espacios vacíos intermedios, por lo que debemos desplazar &lt;strong&gt;todos&lt;/strong&gt; los elementos de la derecha una posición hacia la izquierda.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eficiencia&lt;/strong&gt;: En el peor de los casos (eliminar el primer elemento), toma &lt;strong&gt;N - 1 pasos&lt;/strong&gt; de desplazamiento.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="sets-cómo-una-sola-regla-cambia-toda-la-eficiencia"&gt;Sets: Cómo una sola regla cambia toda la eficiencia&lt;/h2&gt;
&lt;p&gt;Un &lt;strong&gt;Set&lt;/strong&gt; (conjunto) es un tipo especial de arreglo con una regla estricta: &lt;strong&gt;no se permiten valores duplicados&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Esta pequeña regla de negocio transforma drásticamente la eficiencia de la operación de &lt;strong&gt;inserción&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En un Array común, insertar al final toma &lt;strong&gt;1 paso&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;En un Set, antes de insertar un elemento al final, la computadora debe hacer una &lt;strong&gt;búsqueda lineal completa&lt;/strong&gt; para asegurar que el elemento no exista previamente en el Set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por lo tanto, la inserción al final en un Set toma &lt;strong&gt;N pasos de búsqueda + 1 paso de inserción = N + 1 pasos&lt;/strong&gt;.&lt;/p&gt;




 
 





 


&lt;div class="notice note"&gt;
 &lt;div class="notice-head"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="22" height="22" stroke-width="1.5" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125" /&gt;
 &lt;/svg&gt;
 &lt;p&gt;Note&lt;/p&gt;
 
 &lt;/div&gt;
 &lt;div class="notice-body"&gt;&lt;p&gt;Aunque los Sets protegen la integridad de tus datos previniendo duplicados, debes tener en cuenta que su inserción es mucho más lenta en arreglos de gran tamaño.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="arreglos-ordenados"&gt;Arreglos Ordenados&lt;/h2&gt;
&lt;p&gt;Un &lt;strong&gt;Arreglo Ordenado&lt;/strong&gt; es un array cuyos valores se mantienen de forma ascendente o descendente de forma obligatoria.&lt;/p&gt;
&lt;h3 id="inserción-en-arreglos-ordenados"&gt;Inserción en Arreglos Ordenados&lt;/h3&gt;
&lt;p&gt;Para insertar un valor en un arreglo ordenado (por ejemplo, meter el número &lt;code&gt;4&lt;/code&gt; en &lt;code&gt;[1, 3, 5, 8]&lt;/code&gt;), no podemos simplemente agregarlo al final. Debemos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buscar el lugar exacto donde corresponde el elemento para mantener el orden (después del &lt;code&gt;3&lt;/code&gt; y antes del &lt;code&gt;5&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Desplazar los elementos mayores hacia la derecha (&lt;code&gt;5&lt;/code&gt; y &lt;code&gt;8&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Insertar el nuevo valor.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esto hace que la inserción sea ligeramente más costosa en pasos que en un array normal, pero abre la puerta a un algoritmo de búsqueda revolucionario.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="búsqueda-binaria"&gt;Búsqueda Binaria&lt;/h2&gt;
&lt;p&gt;Si tu arreglo &lt;strong&gt;no está ordenado&lt;/strong&gt;, la única forma de buscar es la búsqueda lineal (celda por celda), lo que toma hasta &lt;strong&gt;N&lt;/strong&gt; pasos.&lt;/p&gt;
&lt;p&gt;Pero si tu arreglo &lt;strong&gt;sí está ordenado&lt;/strong&gt;, puedes usar la &lt;strong&gt;Búsqueda Binaria&lt;/strong&gt;. Este algoritmo consiste en:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ir directo al elemento del medio del arreglo.&lt;/li&gt;
&lt;li&gt;Si el valor buscado es menor, descartas toda la mitad derecha.&lt;/li&gt;
&lt;li&gt;Si es mayor, descartas toda la mitad izquierda.&lt;/li&gt;
&lt;li&gt;Repites el proceso en la mitad restante hasta encontrarlo o quedarte sin elementos.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid"&gt;flowchart TD
 Start["Buscar 11 en [2, 4, 6, 8, 11, 14, 18, 22]"] --&gt; Step1["Valor central: 8 (índice 3)"]
 Step1 --&gt; Check{"¿Es 11 == 8?"}
 Check -- No, es mayor --&gt; DescartarIzq["Descartar [2, 4, 6, 8]"]
 DescartarIzq --&gt; SubSearch["Buscar en [11, 14, 18, 22]"]
 SubSearch --&gt; Step2["Valor central: 14 (índice 5)"]
 Step2 --&gt; Check2{"¿Es 11 == 14?"}
 Check2 -- No, es menor --&gt; DescartarDer["Descartar [14, 18, 22]"]
 DescartarDer --&gt; Final["Buscar en [11] -&gt; ¡Encontrado! 🎉"]
&lt;/pre&gt;

&lt;h3 id="búsqueda-binaria-vs-búsqueda-lineal"&gt;Búsqueda Binaria vs. Búsqueda Lineal&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tamaño del Arreglo (N)&lt;/th&gt;
 &lt;th&gt;Pasos Máximos (Lineal)&lt;/th&gt;
 &lt;th&gt;Pasos Máximos (Binaria)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;8&lt;/td&gt;
 &lt;td&gt;8&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;7&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10,000&lt;/td&gt;
 &lt;td&gt;10,000&lt;/td&gt;
 &lt;td&gt;14&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;1,000,000&lt;/td&gt;
 &lt;td&gt;1,000,000&lt;/td&gt;
 &lt;td&gt;20&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La diferencia es notable. Buscar en una base de datos de un millón de registros toma &lt;strong&gt;un millón de pasos&lt;/strong&gt; con búsqueda lineal, pero solo &lt;strong&gt;20 pasos&lt;/strong&gt; usando búsqueda binaria. Por eso, elegir el algoritmo correcto de acuerdo a la estructura de tus datos marca toda la diferencia del mundo.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;En el siguiente &lt;a href="https://blog.dacadev.com/programacion/estructura-datos-y-algoritmos/02-big-o-notation-y-algoritmos-de-ordenamiento"



 


&gt;&lt;strong&gt;post&lt;/strong&gt;&lt;/a&gt;, aprenderemos la forma matemática formal en la que los desarrolladores expresamos estas diferencias de eficiencia: la &lt;strong&gt;Notación Big O&lt;/strong&gt;, y cómo usarla para analizar nuestros primeros algoritmos de ordenamiento. ¡No te lo pierdas! 🚀&lt;/p&gt;</content:encoded></item></channel></rss>