1 00:00:00,000 --> 00:00:10,416 [MÚSICA DE FONDO] 2 00:00:10,416 --> 00:00:11,420 DAVID: Muy bien. 3 00:00:11,420 --> 00:00:14,760 Esto es CS50 y vamos a iniciar la lección 3. 4 00:00:14,760 --> 00:00:19,605 Hoy, la meta será mucho más algorítmica que enfocada en códigos 5 00:00:19,605 --> 00:00:22,510 y en cierto modo volveremos al inicio, a la lección cero, 6 00:00:22,510 --> 00:00:25,120 cuando hablamos sobre pensamiento computacional y algoritmos. 7 00:00:25,120 --> 00:00:26,980 Ahora ya tienen un par de semanas de experiencia 8 00:00:26,980 --> 00:00:29,830 y cuentan con nuevas herramientas y habilidades bajo la manga, 9 00:00:29,830 --> 00:00:31,270 aun cuando es probable que todavía estén tratando 10 00:00:31,270 --> 00:00:33,130 de sentirse cómodos con algunas de esas habilidades. 11 00:00:33,130 --> 00:00:36,190 Para comenzar, echemos un vistazo a este dispositivo de hardware 12 00:00:36,190 --> 00:00:37,690 del que ya hablamos un par de veces. 13 00:00:37,690 --> 00:00:39,034 ¿Y este es un ejemplo de qué? 14 00:00:39,034 --> 00:00:39,742 PÚBLICO: De memoria. 15 00:00:39,742 --> 00:00:42,280 DAVID: Sí, de memoria o RAM, Random Access Memory. 16 00:00:42,280 --> 00:00:44,290 Y al parecer se ve bastante grande en la pantalla, 17 00:00:44,290 --> 00:00:46,081 pero de hecho se vería realmente pequeña si tuvieran 18 00:00:46,081 --> 00:00:49,000 que encontrarla en su Mac, PC, laptop, o cualquier otro dispositivo. 19 00:00:49,000 --> 00:00:50,260 Y esto es solo memoria. 20 00:00:50,260 --> 00:00:54,010 Y la memoria son sitios donde pueden almacenar información, números, caracteres, 21 00:00:54,010 --> 00:00:55,990 cadenas y cosas aún más grandes. 22 00:00:55,990 --> 00:01:00,910 Y recuerden que si desean usar esta memoria, deben direccionarla 23 00:01:00,910 --> 00:01:03,060 y colocar cosas en ubicaciones específicas. 24 00:01:03,060 --> 00:01:05,560 Y hoy comenzaremos a hacerlo. Entonces, en particular, 25 00:01:05,560 --> 00:01:06,640 tenemos aquí por lo menos cinco... 26 00:01:06,640 --> 00:01:10,210 cuatro chips negros, que es donde se almacenan los ceros y los unos 27 00:01:10,210 --> 00:01:11,979 en el tablero de circuitos verde. 28 00:01:11,979 --> 00:01:14,020 Y los pequeños conectores dorados que también se ven en la pantalla, 29 00:01:14,020 --> 00:01:16,300 permiten que todos esos chips negros 30 00:01:16,300 --> 00:01:19,880 se comuniquen, básicamente, y que los ceros y los unos se muevan. 31 00:01:19,880 --> 00:01:22,720 Pero si hacemos un acercamiento a uno de estos chips de memoria, 32 00:01:22,720 --> 00:01:26,780 arbitrariamente, y luego hacemos un acercamiento acá, podríamos pensar 33 00:01:26,780 --> 00:01:27,712 en un rectángulo. 34 00:01:27,712 --> 00:01:30,670 Podría ser cualquier forma, sin duda, pero si lo pensamos como un rectángulo, 35 00:01:30,670 --> 00:01:34,720 podemos dividir este chip de memoria en una cuadrícula como esta. 36 00:01:34,720 --> 00:01:37,231 El modo en que lo he dibujado es completamente arbitrario, pero el hecho 37 00:01:37,231 --> 00:01:38,980 es que tengo muchos recuadros pequeños, 38 00:01:38,980 --> 00:01:41,410 y pueden pensar en esto como si fuera un byte, y después 39 00:01:41,410 --> 00:01:42,910 otro byte y después otro byte. 40 00:01:42,910 --> 00:01:47,080 Y casualmente puse ocho bytes, pero podría ser cualquier número. 41 00:01:47,080 --> 00:01:48,440 Realmente no importa. 42 00:01:48,440 --> 00:01:51,430 Entonces, pueden imaginar que estos bytes 43 00:01:51,430 --> 00:01:55,349 son como ubicaciones específicas, números o direcciones, 44 00:01:55,349 --> 00:01:56,890 a la par que empezamos a nombrarlos. 45 00:01:56,890 --> 00:01:58,960 Entonces, si hago zoom en la parte superior de esto, podrían 46 00:01:58,960 --> 00:02:02,059 pensar que en la parte superior izquierda estaría el byte número 0, 47 00:02:02,059 --> 00:02:03,850 porque los especialistas en sistemas por lo general comienzan 48 00:02:03,850 --> 00:02:07,840 a contar desde cero, y luego el byte 1, y el 2, y el 3, y el 4, etcétera, etcétera. 49 00:02:07,840 --> 00:02:12,820 Entonces, a modo de repaso, en una Mac o PC típica en estos días, 50 00:02:12,820 --> 00:02:16,894 por lo general, ¿cuánta RAM o memoria, tenemos? 51 00:02:16,894 --> 00:02:17,710 PÚBLICO: Cuatro 52 00:02:17,710 --> 00:02:18,700 DAVID: ¿Cuatro qué? 53 00:02:18,700 --> 00:02:19,420 PÚBLICO: Cuatro gigabytes. 54 00:02:19,420 --> 00:02:20,586 DAVID: Cuatro gigabytes. 55 00:02:20,586 --> 00:02:23,095 Y giga significa mil millones, entonces serían 4 mil millones de bytes. 56 00:02:23,095 --> 00:02:25,720 Tal vez sería un poco menos, o quizás tendrían un poco más, 57 00:02:25,720 --> 00:02:27,303 pero hablamos en términos de miles de millones de bytes. 58 00:02:27,303 --> 00:02:30,460 Solo estamos explorando superficialmente la cantidad de almacenamiento que tenemos 59 00:02:30,460 --> 00:02:32,590 y cuántos números y caracteres podemos almacenar. 60 00:02:32,590 --> 00:02:37,550 El punto es que podríamos direccionarlos de alguna forma... cero, uno, dos, 61 00:02:37,550 --> 00:02:38,420 y así sucesivamente. 62 00:02:38,420 --> 00:02:41,377 Así es como almacenamos el nombre de Stelios en la memoria. 63 00:02:41,377 --> 00:02:43,210 Recuerden que este fue un ejemplo de la vez pasada, en donde 64 00:02:43,210 --> 00:02:46,310 teníamos que poner los caracteres de este nombre en algún sitio. 65 00:02:46,310 --> 00:02:48,400 Y entonces pusimos la S y luego la T, 66 00:02:48,400 --> 00:02:52,090 y así sucesivamente, desde la ubicación más a la izquierda y hacia adelante. 67 00:02:52,090 --> 00:02:54,150 Pero también pusimos algo más. 68 00:02:54,150 --> 00:02:56,900 No es suficiente con solo poner las letras del nombre en la memoria. 69 00:02:56,900 --> 00:02:58,270 ¿Qué más tuvimos que hacer? 70 00:02:58,270 --> 00:02:59,680 PÚBLICO: ¿Poner un cero ahí? 71 00:02:59,680 --> 00:03:02,920 DAVID: Sí, el comando cero, o más específicamente, el byte cero, 72 00:03:02,920 --> 00:03:04,810 también conocido como el byte nulo. 73 00:03:04,810 --> 00:03:08,060 N-U-L-O, e cual se representa con la diagonal inversa y el 0. 74 00:03:08,060 --> 00:03:10,270 Porque si solamente escribieran un cero normal, 75 00:03:10,270 --> 00:03:12,820 técnicamente se referiría a un carácter del teclado. 76 00:03:12,820 --> 00:03:15,880 Parece un número, pero técnicamente hablando es un carácter. 77 00:03:15,880 --> 00:03:21,620 Entonces, la diagonal inversa más cero significa 8-0 bits en la ubicación de ese byte. 78 00:03:21,620 --> 00:03:22,120 Bien. 79 00:03:22,120 --> 00:03:25,240 Entonces, ahora que tenemos esta habilidad para representar a Stelios 80 00:03:25,240 --> 00:03:28,315 con una secuencia de caracteres que al final termina en nulo, 81 00:03:28,315 --> 00:03:30,690 realmente ya no necesitamos preocuparnos por el hardware. 82 00:03:30,690 --> 00:03:30,850 ¿Correcto? 83 00:03:30,850 --> 00:03:33,610 Podemos abstraernos de ello tal como lo hicimos en la semana cero, 84 00:03:33,610 --> 00:03:36,110 y no preocuparnos más por cómo se almacenan los ceros y los unos. 85 00:03:36,110 --> 00:03:37,849 Podemos tan solo confiar en que están allí, de alguna manera, 86 00:03:37,849 --> 00:03:39,640 y entonces, podemos abstraernos y solo empezar 87 00:03:39,640 --> 00:03:43,420 a pensar en ello como una secuencia, o una cuadrícula, de letras como esta. 88 00:03:43,420 --> 00:03:46,510 Pero esa diagonal inversa más cero es importante, porque 89 00:03:46,510 --> 00:03:49,360 es la única forma en que este lenguaje que estamos utilizando actualmente, 90 00:03:49,360 --> 00:03:51,490 el C, sabe donde terminan las cadenas. 91 00:03:51,490 --> 00:03:53,960 Si no fuera así, entonces printf, por ejemplo, 92 00:03:53,960 --> 00:03:57,640 podría seguir imprimiendo todo el contenido, los cuatro gigabytes de memoria 93 00:03:57,640 --> 00:04:00,910 que la computadora tiene, sin importar lo que fueran esos caracteres. 94 00:04:00,910 --> 00:04:04,420 Y entonces no podríamos distinguir entre los nombres de Stelios y María, 95 00:04:04,420 --> 00:04:07,130 o en general, el de alguien más que se encuentre en la memoria. 96 00:04:07,130 --> 00:04:10,325 A continuación abriré el IDE, solo para demostrar 97 00:04:10,325 --> 00:04:11,950 lo que pueden hacer con este tipo de conocimiento. 98 00:04:11,950 --> 00:04:14,740 Supongan que deseo escribir un programa que permita 99 00:04:14,740 --> 00:04:17,209 que un usuario escriba su nombre, 100 00:04:17,209 --> 00:04:19,459 y que luego solo quiero imprimir sus iniciales. 101 00:04:19,459 --> 00:04:22,780 Por simplicidad, voy a suponer que las iniciales de la persona, 102 00:04:22,780 --> 00:04:25,930 o cualesquiera que sean las letras en mayúscula, se escriban en la entrada. 103 00:04:25,930 --> 00:04:29,020 Entonces, seré un poco quisquilloso, y escribiré mi nombre correctamente. 104 00:04:29,020 --> 00:04:31,430 Pero una vez dicho esto, seguiré adelante y voy a improvisar. 105 00:04:31,430 --> 00:04:34,682 Entonces, voy a guardar esto como initials.c. 106 00:04:34,682 --> 00:04:37,877 Solo por costumbre, voy a incluir la biblioteca CS50, 107 00:04:37,877 --> 00:04:40,210 porque quiero obtener una cadena del usuario. 108 00:04:40,210 --> 00:04:42,670 Después voy a incluir el estándar io.h, 109 00:04:42,670 --> 00:04:44,140 para que pueda imprimir algo en la pantalla 110 00:04:44,140 --> 00:04:46,240 y posteriormente decidiremos si necesitamos algo más. 111 00:04:46,240 --> 00:04:49,240 Para este programa no necesito ningún argumento de línea de comandos 112 00:04:49,240 --> 00:04:52,270 y luego volveré a nuestra antigua versión principal, donde solo 113 00:04:52,270 --> 00:04:55,030 especifico void, no argc ni argv. 114 00:04:55,030 --> 00:04:58,600 Y entonces, aquí, voy a declarar una cadena llamada s, 115 00:04:58,600 --> 00:05:04,490 y obtendré un nombre de usuario, con "name: " y get_string, 116 00:05:04,490 --> 00:05:07,030 Y luego, ¿qué quiero hacer después de esto? 117 00:05:07,030 --> 00:05:11,820 Quiero iterar sobre los caracteres en el nombre del usuario, 118 00:05:11,820 --> 00:05:13,720 e imprimirlos solo si están en mayúsculas. 119 00:05:13,720 --> 00:05:15,750 Pero, ¿saben qué?, en vez de simplemente imprimirlos, 120 00:05:15,750 --> 00:05:16,875 ¿saben lo que quiero hacer? 121 00:05:16,875 --> 00:05:21,390 Quiero crear una nueva cadena que contenga las iniciales del usuario. 122 00:05:21,390 --> 00:05:24,510 Por lo tanto, no solo imprimir, con %c, 123 00:05:24,510 --> 00:05:26,790 un carácter tras otro, más bien 124 00:05:26,790 --> 00:05:30,279 deseo almacenar las iniciales del usuario en una nueva cadena, 125 00:05:30,279 --> 00:05:32,070 entonces tengo una cadena para su nombre, 126 00:05:32,070 --> 00:05:34,010 y una cadena para sus iniciales. 127 00:05:34,010 --> 00:05:36,254 Y, damas y caballeros, Ian. 128 00:05:36,254 --> 00:05:37,920 IAN: Perdón por las fallas de video. 129 00:05:37,920 --> 00:05:40,540 DAVID: Gracias. 130 00:05:40,540 --> 00:05:41,040 Bien. 131 00:05:41,040 --> 00:05:43,456 Entonces, para ser más claro, déjenme renombrar 132 00:05:43,456 --> 00:05:48,270 esto a "Name: ", y luego quiero tener una cadena para sus iniciales. 133 00:05:48,270 --> 00:05:51,480 Pero sabemos que una cadena es, tal como lo vimos la vez pasada, 134 00:05:51,480 --> 00:05:53,640 solo una secuencia de caracteres. 135 00:05:53,640 --> 00:05:57,900 Y una secuencia, en realidad, tiene otro nombre en programación. 136 00:05:57,900 --> 00:06:00,540 ¿Cuál es otro sinónimo que hemos usado para nombrar una secuencia de algo? 137 00:06:00,540 --> 00:06:01,420 PÚBLICO: [INAUDIBLE] 138 00:06:01,420 --> 00:06:02,080 DAVID: Un arreglo. 139 00:06:02,080 --> 00:06:04,050 Y un arreglo es esa estructura de datos que teníamos cuando 140 00:06:04,050 --> 00:06:06,670 comenzamos a utilizar la notación de corchetes. 141 00:06:06,670 --> 00:06:10,282 Entonces, si retrocedo y rompo esta abstracción, 142 00:06:10,282 --> 00:06:12,240 si también lo hacen ustedes, no piensen en esto como una cadena. 143 00:06:12,240 --> 00:06:12,948 ¿Qué es una cadena? 144 00:06:12,948 --> 00:06:14,340 Es una secuencia de caracteres. 145 00:06:14,340 --> 00:06:18,480 Técnicamente podría poner char, y luego podría poner initials, 146 00:06:18,480 --> 00:06:21,240 y luego podría especificar tantas letras 147 00:06:21,240 --> 00:06:23,100 como yo quiera para las iniciales de un nombre. 148 00:06:23,100 --> 00:06:26,880 Suponiendo que tenemos un primer nombre, tal vez un segundo nombre y un apellido, 149 00:06:26,880 --> 00:06:28,500 tres caracteres deberían bastar. 150 00:06:28,500 --> 00:06:31,260 151 00:06:31,260 --> 00:06:32,680 Tres caracteres. 152 00:06:32,680 --> 00:06:35,400 Por lo tanto, para David J. Malan, los tres caracteres serían DJM. 153 00:06:35,400 --> 00:06:36,721 ¿Son suficientes? 154 00:06:36,721 --> 00:06:38,429 PÚBLICO: [INAUDIBLE] 155 00:06:38,429 --> 00:06:40,470 DAVID: Lo dudo, porque no... 156 00:06:40,470 --> 00:06:40,810 PÚBLICO: [INAUDIBLE] 157 00:06:40,810 --> 00:06:42,060 DAVID: No es así, pero ¿por qué? 158 00:06:42,060 --> 00:06:43,420 PÚBLICO: Se necesita el carácter nulo. 159 00:06:43,420 --> 00:06:43,840 DAVID: Sí. 160 00:06:43,840 --> 00:06:46,840 Entonces, si queremos completar mis iniciales, lo cual técnicamente no es 161 00:06:46,840 --> 00:06:48,640 una palabra, aunque sin duda alguna es una cadena, 162 00:06:48,640 --> 00:06:51,830 una secuencia de caracteres, necesitamos un cuarto carácter, 163 00:06:51,830 --> 00:06:53,894 o necesitamos anticipar un cuarto carácter, 164 00:06:53,894 --> 00:06:56,560 de modo que lo que pongamos en la memoria de la computadora sea, 165 00:06:56,560 --> 00:06:59,770 en mi caso, algo como, D-J-M diagonal inversa 0. 166 00:06:59,770 --> 00:07:01,120 Necesitamos ese cuarto byte. 167 00:07:01,120 --> 00:07:04,880 De otro modo, no tendremos espacio para completar la cadena. 168 00:07:04,880 --> 00:07:08,650 Entonces, aunque esto no parece una cadena, 169 00:07:08,650 --> 00:07:11,290 en la medida en que no digo la palabra cadena, en realidad lo es. 170 00:07:11,290 --> 00:07:15,100 Es una secuencia de caracteres de tamaño cuatro en la que puedo poner caracteres. 171 00:07:15,100 --> 00:07:20,410 Ahora, de modo predeterminado, ¿cuáles son los caracteres en este arreglo? 172 00:07:20,410 --> 00:07:24,660 Cuando declaramos una variable de algún tamaño, ¿qué valores tiene? 173 00:07:24,660 --> 00:07:25,800 PÚBLICO: [INAUDIBLE] 174 00:07:25,800 --> 00:07:28,090 DAVID: A veces ceros, pero en general, 175 00:07:28,090 --> 00:07:29,500 ¿cuál es la regla de oro? 176 00:07:29,500 --> 00:07:30,541 PÚBLICO: No se sabe. 177 00:07:30,541 --> 00:07:31,957 DAVID: Así es, no se sabe. 178 00:07:31,957 --> 00:07:33,360 Son los llamados valores basura. 179 00:07:33,360 --> 00:07:36,970 Nada. En general no deberíamos confiar en el valor de una variable, 180 00:07:36,970 --> 00:07:41,170 a menos que nosotros mismos pusiéramos el valor allí, como si lo almacenáramos, 181 00:07:41,170 --> 00:07:44,240 con el operador de asignación, o escribiéndolo manualmente nosotros mismos. 182 00:07:44,240 --> 00:07:46,750 Entonces, solo para ser claro, si quisiera que este programa 183 00:07:46,750 --> 00:07:50,890 fuera inútil para cualquiera, excepto para mí mismo, podría hacer esto, 184 00:07:50,890 --> 00:07:52,285 podría escribir 185 00:07:52,285 --> 00:07:54,880 186 00:07:54,880 --> 00:08:06,310 initials [0] = 'D'; initials [1] = 'J'; initials [2] = 'J'; 187 00:08:06,310 --> 00:08:13,030 y finalmente, initials [2] = 'M'; 188 00:08:13,030 --> 00:08:16,330 Y por último, y este es el que se me olvida a veces, 189 00:08:16,330 --> 00:08:18,790 initials [3] = '\0'; necesito poner diagonal inversa 0. 190 00:08:18,790 --> 00:08:20,620 Por supuesto que esto no es en absoluto dinámico, 191 00:08:20,620 --> 00:08:23,350 pero ahora, en estas líneas de código, 192 00:08:23,350 --> 00:08:25,270 creé una nueva cadena llamada iniciales. 193 00:08:25,270 --> 00:08:28,750 Es de longitud... es de longitud humana tres, DJM, 194 00:08:28,750 --> 00:08:31,230 pero la computadora en realidad está usando 4 bytes para almacenarlo. 195 00:08:31,230 --> 00:08:32,590 Pero este no es el punto del ejercicio, 196 00:08:32,590 --> 00:08:34,839 porque ya le preguntamos al usuario por su nombre. 197 00:08:34,839 --> 00:08:36,520 Ahora necesito imaginar qué es eso. 198 00:08:36,520 --> 00:08:39,250 Entonces, lógicamente, o algorítmicamente, si quieren verlo así, 199 00:08:39,250 --> 00:08:45,790 qué proceso podríamos usar, dado un nombre como David J. Malan, o Brian Yu, 200 00:08:45,790 --> 00:08:47,680 o cualquier otro nombre, 201 00:08:47,680 --> 00:08:50,170 ¿Cómo podríamos ver esa entrada y averiguar 202 00:08:50,170 --> 00:08:53,000 cuáles son las iniciales del usuario? 203 00:08:53,000 --> 00:08:54,170 ¿Cuál es el proceso de pensamiento? 204 00:08:54,170 --> 00:08:56,980 Vamos a regresarnos un poco. 205 00:08:56,980 --> 00:09:00,789 Entonces, para David J. Malan, o cualquier otro nombre, 206 00:09:00,789 --> 00:09:01,580 ¿cuál es el proceso? 207 00:09:01,580 --> 00:09:02,330 ¿Qué opinan? 208 00:09:02,330 --> 00:09:09,444 PÚBLICO: [INAUDIBLE] 209 00:09:09,444 --> 00:09:10,360 DAVID: ¡OK, bien! 210 00:09:10,360 --> 00:09:12,970 Iterar con un bucle for las letras en el nombre, 211 00:09:12,970 --> 00:09:14,880 ya han hecho eso antes, o el proceso de hacer eso, 212 00:09:14,880 --> 00:09:17,380 para algo como [INAUDIBLE] o [INAUDIBLE] muy probablemente. 213 00:09:17,380 --> 00:09:19,780 Entonces pueden usar algo como "isupper", 214 00:09:19,780 --> 00:09:23,590 o incluso pueden usar asciimath, como lo hicimos antes, para determinar 215 00:09:23,590 --> 00:09:26,769 si está en el rango de A a Z mayúsculas en ambos extremos. 216 00:09:26,769 --> 00:09:28,060 Entonces tenemos un par de opciones. 217 00:09:28,060 --> 00:09:29,710 Voy a tratar de convertir eso en código. 218 00:09:29,710 --> 00:09:31,543 Dejen me deshago del nombre hardcoded que 219 00:09:31,543 --> 00:09:34,000 es un poco absurdo, pero demuestra cómo 220 00:09:34,000 --> 00:09:36,102 podemos almacenar caracteres arbitrarios, 221 00:09:36,102 --> 00:09:37,060 y luego haré lo siguiente. 222 00:09:37,060 --> 00:09:44,665 for (int i = 0; < strlen(name); i++) 223 00:09:44,665 --> 00:09:46,540 y luego pondré algo como esto. 224 00:09:46,540 --> 00:09:53,614 Si el i-ésimo carácter del nombre es una letra mayúscula: if (isupper(name[i])) 225 00:09:53,614 --> 00:09:56,530 y voy a usar una función que es posible que no hayan utilizado, 226 00:09:56,530 --> 00:09:57,910 pero les recuerdo que existe, 227 00:09:57,910 --> 00:10:02,350 isupper volverá verdadero o falso, esta es una letra mayúscula, 228 00:10:02,350 --> 00:10:07,967 entonces, si esto es mayúscula, ¿qué haré después? 229 00:10:07,967 --> 00:10:09,550 Bueno, la historia aún no termina. 230 00:10:09,550 --> 00:10:12,160 No basta solamente con iterar sobre los nombres y 231 00:10:12,160 --> 00:10:13,690 las letras en el nombre, 232 00:10:13,690 --> 00:10:18,250 debemos decidir dónde colocar la primera letra en mayúscula que encontremos. 233 00:10:18,250 --> 00:10:21,850 Obviamente va a ir en el arreglo de las iniciales, 234 00:10:21,850 --> 00:10:24,690 pero, ¿qué más necesito añadir a mi código para saber en qué parte 235 00:10:24,690 --> 00:10:29,710 de este bloque de cuatro caracteres irá el primer carácter D, 236 00:10:29,710 --> 00:10:31,460 en el caso de mi nombre? 237 00:10:31,460 --> 00:10:31,960 Sí. 238 00:10:31,960 --> 00:10:33,940 PÚBLICO: [INAUDIBLE] initials i 239 00:10:33,940 --> 00:10:34,940 DAVID: Initials i. 240 00:10:34,940 --> 00:10:36,350 OK, entonces si hago eso... 241 00:10:36,350 --> 00:10:36,990 buena sugerencia. 242 00:10:36,990 --> 00:10:41,030 Entonces pongamos initials[i] = name[i]; 243 00:10:41,030 --> 00:10:43,400 parece que esto pondría el i-ésimo carácter del nombre 244 00:10:43,400 --> 00:10:46,730 en la i-ésima ubicación en initials, lo cual es perfectamente correcto 245 00:10:46,730 --> 00:10:48,510 porque i es 0. 246 00:10:48,510 --> 00:10:52,560 Y si escribiera David J. Malan, D estaría en la ubicación cero. 247 00:10:52,560 --> 00:10:53,220 Entonces, estamos bien. 248 00:10:53,220 --> 00:10:54,678 Pero va a haber un error aquí. 249 00:10:54,678 --> 00:10:57,870 PÚBLICO: [INAUDIBLE] continúa hasta el nombre, entonces habrá menos espacios. 250 00:10:57,870 --> 00:10:58,745 DAVID: Exacto. 251 00:10:58,745 --> 00:11:02,280 i se moverá hacia adelante, un carácter a la vez, 252 00:11:02,280 --> 00:11:07,410 por todo el nombre del usuario, pero solo queremos indexar, 253 00:11:07,410 --> 00:11:10,410 no queremos hacer lo mismo que en el arreglo de iniciales 254 00:11:10,410 --> 00:11:12,369 porque el número de iniciales es mucho más pequeño. 255 00:11:12,369 --> 00:11:14,160 Así que, aunque se mueva por el nombre del usuario, 256 00:11:14,160 --> 00:11:17,070 queremos dar pequeños pasos, por así decirlo, a través de las iniciales. 257 00:11:17,070 --> 00:11:18,212 Entonces, ¿cómo podemos resolver esto? 258 00:11:18,212 --> 00:11:19,420 Parece que no puedo usar i. 259 00:11:19,420 --> 00:11:22,992 PÚBLICO: Se puede usar una variable que sea como [INAUDIBLE] 260 00:11:22,992 --> 00:11:23,950 DAVID: OK, genial. 261 00:11:23,950 --> 00:11:24,430 Hagamos eso. 262 00:11:24,430 --> 00:11:25,490 Necesitamos otra variable. 263 00:11:25,490 --> 00:11:27,100 Entonces podría poner esto en lugares diferentes, 264 00:11:27,100 --> 00:11:29,450 pero para continuar lo pondré aquí por el momento. 265 00:11:29,450 --> 00:11:31,580 Entonces, int counter = 0; 266 00:11:31,580 --> 00:11:33,730 Solo estoy inicializando mi contador en cero 267 00:11:33,730 --> 00:11:37,420 y tan pronto como no encuentre una letra mayúscula, 268 00:11:37,420 --> 00:11:39,220 ¿Creo que haría esto? 269 00:11:39,220 --> 00:11:41,890 ¿Ponerlo en cualquiera que sea el valor del contador? 270 00:11:41,890 --> 00:11:44,390 Y luego necesitamos aplicar un paso más. 271 00:11:44,390 --> 00:11:47,812 ¿Qué debo hacer una vez que lo ponga en la ubicación del contador? 272 00:11:47,812 --> 00:11:49,420 PÚBLICO: Incrementar el contador en uno. 273 00:11:49,420 --> 00:11:49,930 DAVID: Exacto. 274 00:11:49,930 --> 00:11:51,010 Incrementar el contador en uno. 275 00:11:51,010 --> 00:11:52,343 Y puedo hacerlo de varias formas. 276 00:11:52,343 --> 00:11:56,490 Lo puedo hacer muy literalmente, counter = counter + 1; 277 00:11:56,490 --> 00:11:58,030 Es un poco latoso escribirlo. 278 00:11:58,030 --> 00:12:02,370 Podríamos escribirlo counter += 1; lo cual es un poco más breve, 279 00:12:02,370 --> 00:12:06,800 o usar la forma más bonita, counter++; la cual logra el mismo resultado. 280 00:12:06,800 --> 00:12:09,520 Menos caracteres, mismo resultado exacto, en este caso. 281 00:12:09,520 --> 00:12:14,500 OK, ahora, creo que tenemos un bucle for que hace iteraciones 282 00:12:14,500 --> 00:12:17,560 sobre todas las letras del nombre. 283 00:12:17,560 --> 00:12:21,790 Si es una letra mayúscula, almacena esa letra, y solo esa letra, 284 00:12:21,790 --> 00:12:24,220 en el arreglo de iniciales y luego incrementa 285 00:12:24,220 --> 00:12:26,960 el contador para que la próxima letra quede 286 00:12:26,960 --> 00:12:30,230 en la siguiente ubicación del arreglo de iniciales. 287 00:12:30,230 --> 00:12:33,520 Entonces, si todo parece correcto, 288 00:12:33,520 --> 00:12:35,020 quisiera hacer lo siguiente, 289 00:12:35,020 --> 00:12:39,520 escribiré printf(%s\ n, initials); 290 00:12:39,520 --> 00:12:41,440 Solo quiero imprimir las iniciales del usuario. 291 00:12:41,440 --> 00:12:46,780 Pero hay un paso clave en esta línea en blanco que no debería olvidar. 292 00:12:46,780 --> 00:12:48,470 ¿Qué es lo último que necesito hacer? 293 00:12:48,470 --> 00:12:48,580 Sí. 294 00:12:48,580 --> 00:12:50,500 PÚBLICO: Se debe imprimir un carácter nulo [INAUDIBLE] 295 00:12:50,500 --> 00:12:52,420 poner un carácter nulo al final de [INAUDIBLE]. 296 00:12:52,420 --> 00:12:52,950 DAVID: Exacto. 297 00:12:52,950 --> 00:12:55,450 Necesito poner un carácter nulo al final del arreglo. 298 00:12:55,450 --> 00:12:57,160 Entonces, ¿cómo lo hago? 299 00:12:57,160 --> 00:12:59,730 Bueno, tengo la sintaxis y creo, 300 00:12:59,730 --> 00:13:02,340 ya saben, quiero decir, initials[end of array] 301 00:13:02,340 --> 00:13:04,570 pero ¿cómo puedo hacerlo? 302 00:13:04,570 --> 00:13:06,030 ¿Qué valores debo poner aquí? 303 00:13:06,030 --> 00:13:08,330 304 00:13:08,330 --> 00:13:08,830 Sí. 305 00:13:08,830 --> 00:13:11,130 DAVID: ¿La longitud de la cadena del nombre? 306 00:13:11,130 --> 00:13:16,326 DAVID: Sí, podría poner initials[Strlen(name), bueno, no del nombre. 307 00:13:16,326 --> 00:13:17,690 PÚBLICO: De las iniciales. 308 00:13:17,690 --> 00:13:21,200 DAVID: De las iniciales, pero ahora me pusieron en un argumento circular, 309 00:13:21,200 --> 00:13:23,600 porque estoy tratando de... 310 00:13:23,600 --> 00:13:24,890 es como un catch-22 ahora. 311 00:13:24,890 --> 00:13:29,160 Estoy tratando de almacenar una \ n al final de la cadena. 312 00:13:29,160 --> 00:13:31,880 Pero recuerden que en la vez pasada, el modo en que strlen 313 00:13:31,880 --> 00:13:36,830 sabe dónde termina la cadena, es poniendo \0. 314 00:13:36,830 --> 00:13:38,190 Así que aún no está allí. 315 00:13:38,190 --> 00:13:39,270 Entonces no podemos usar strlen. 316 00:13:39,270 --> 00:13:41,240 Pero creo que ya tenemos la solución. 317 00:13:41,240 --> 00:13:43,630 PÚBLICO: ¿No se podría solo poner initials[4]? 318 00:13:43,630 --> 00:13:48,014 [INAUDIBLE] 319 00:13:48,014 --> 00:13:48,680 DAVID: OK. 320 00:13:48,680 --> 00:13:50,780 Entonces, ciertamente podríamos hacer eso, o casi eso. 321 00:13:50,780 --> 00:13:52,520 No es exactamente cuatro. 322 00:13:52,520 --> 00:13:53,536 Con un ligero cambio, ¿sí? 323 00:13:53,536 --> 00:13:54,410 PÚBLICO: [INAUDIBLE] 324 00:13:54,410 --> 00:13:55,535 DAVID: Sí, allá atrás. 325 00:13:55,535 --> 00:13:56,624 PÚBLICO: [INAUDIBLE] 326 00:13:56,624 --> 00:13:57,540 DAVID: OK, bien. 327 00:13:57,540 --> 00:13:58,980 Entonces... sí, contador... 328 00:13:58,980 --> 00:13:59,480 es, sí. 329 00:13:59,480 --> 00:14:01,317 Contador será la respuesta. 330 00:14:01,317 --> 00:14:02,900 Pero dejen arreglo este error de aquí. 331 00:14:02,900 --> 00:14:05,390 Cuatro era la intuición correcta, pero recuerden, 332 00:14:05,390 --> 00:14:11,750 si tienen cuatro posibles caracteres, entonces 0, 1, 2, 3 será el último. 333 00:14:11,750 --> 00:14:13,130 Necesitamos fijar esto en 3. 334 00:14:13,130 --> 00:14:17,450 Pero aún más general sería poner un contador, porque el valor del contador 335 00:14:17,450 --> 00:14:21,530 es la longitud de la cadena que acabamos de leer en las iniciales. 336 00:14:21,530 --> 00:14:23,720 Y entonces, si queremos terminar esa cadena, 337 00:14:23,720 --> 00:14:27,920 ya sabemos cuántos caracteres hemos contado. 338 00:14:27,920 --> 00:14:32,600 Y, de hecho, sería técnicamente incorrecto poner a ciegas \0 339 00:14:32,600 --> 00:14:36,480 solamente al final de estos cuatro caracteres. 340 00:14:36,480 --> 00:14:37,002 ¿Por qué? 341 00:14:37,002 --> 00:14:39,210 ¿En cuál situación sería lógicamente incorrecto? 342 00:14:39,210 --> 00:14:39,350 ¿Sí? 343 00:14:39,350 --> 00:14:41,420 PÚBLICO: si alguien tuviera más de tres iniciales. 344 00:14:41,420 --> 00:14:42,690 DAVID: Si tuviera más de tres iniciales 345 00:14:42,690 --> 00:14:45,439 realmente tendríamos un problema, porque no tenemos espacio para nada 346 00:14:45,439 --> 00:14:48,290 más allá de tres letras y un terminador nulo. 347 00:14:48,290 --> 00:14:50,060 Y hay otro problema potencial. 348 00:14:50,060 --> 00:14:50,250 ¿Sí? 349 00:14:50,250 --> 00:14:51,530 PÚBLICO: ¿Si no tienen un segundo nombre? 350 00:14:51,530 --> 00:14:53,000 DAVID: Así es, si no tienen un segundo nombre, 351 00:14:53,000 --> 00:14:56,390 habrá tal vez solo dos letras, nombre y apellido. 352 00:14:56,390 --> 00:14:58,550 Y entonces se pondrá la diagonal inversa cero 353 00:14:58,550 --> 00:15:01,050 al final del arreglo, lo cual es bueno. 354 00:15:01,050 --> 00:15:04,490 Pero ¿qué va a ser ese tercer valor, el penúltimo valor, 355 00:15:04,490 --> 00:15:05,090 en el arreglo? 356 00:15:05,090 --> 00:15:06,173 PÚBLICO: Un valor basura. 357 00:15:06,173 --> 00:15:07,530 Es solo basura, por así decirlo. 358 00:15:07,530 --> 00:15:09,020 Y entonces podría ser algún carácter raro 359 00:15:09,020 --> 00:15:10,700 que podría generar símbolos extraños en la pantalla, no lo sabemos 360 00:15:10,700 --> 00:15:11,866 simplemente porque es incorrecto. 361 00:15:11,866 --> 00:15:15,390 La diagonal inversa cero tiene que ir al final de la cadena. 362 00:15:15,390 --> 00:15:18,710 Ahora, déjenme ver si no cometí ningún error de sintaxis aquí, 363 00:15:18,710 --> 00:15:24,740 guardaré esto, y pondré make initials 364 00:15:24,740 --> 00:15:26,390 OK, entonces, hmm. 365 00:15:26,390 --> 00:15:30,899 "Implicitly declaring library function strlen with type 'unsigned' long" 366 00:15:30,899 --> 00:15:34,190 Entonces, hay muchas palabras y solo reconozco algunas de inmediato. 367 00:15:34,190 --> 00:15:36,680 Podría ejecutarlo mediante help50, lo cual debería ser nuestro primer instinto, 368 00:15:36,680 --> 00:15:38,330 por su cuenta o en horas extras. 369 00:15:38,330 --> 00:15:42,050 Pero veamos si no podemos separar lo que realmente es el error. 370 00:15:42,050 --> 00:15:44,780 ¿Qué se me olvidó? 371 00:15:44,780 --> 00:15:45,280 Sí. 372 00:15:45,280 --> 00:15:48,122 PÚBLICO: Bueno, [INAUDIBLE] 373 00:15:48,122 --> 00:15:50,705 DAVID: Sí, necesitaba la biblioteca de cadenas, la cual 374 00:15:50,705 --> 00:15:52,121 se está volviendo un hábito. 375 00:15:52,121 --> 00:15:54,777 Cada vez que uso strlen debo recordar usar una cadena, 376 00:15:54,777 --> 00:15:57,110 de lo contrario aparecerá ese mensaje de error una y otra vez, 377 00:15:57,110 --> 00:15:58,944 Tal vez hay más errores, pero no estoy seguro, 378 00:15:58,944 --> 00:16:01,568 A continuación volveré a compilar porque 379 00:16:01,568 --> 00:16:04,530 podríamos tener más errores en pantalla de los que vemos en este momento. 380 00:16:04,530 --> 00:16:05,970 De hecho hay uno más, 381 00:16:05,970 --> 00:16:07,940 es un error similar pero en una función diferente. 382 00:16:07,940 --> 00:16:11,300 "Implicit declaration of function is upper". 383 00:16:11,300 --> 00:16:13,340 Y ahí está de nuevo el mismo error. 384 00:16:13,340 --> 00:16:14,390 Olvidé algo. 385 00:16:14,390 --> 00:16:15,110 ¿Alguien recuerda? 386 00:16:15,110 --> 00:16:17,480 Este es un poco 387 00:16:17,480 --> 00:16:19,780 menos común, diría yo. 388 00:16:19,780 --> 00:16:20,280 Sí. 389 00:16:20,280 --> 00:16:22,744 PÚBLICO: Se necesita la biblioteca de tipos de caracteres. 390 00:16:22,744 --> 00:16:25,160 DAVID: Sí, la biblioteca tipo carácter, o tipo C. 391 00:16:25,160 --> 00:16:27,493 Entonces, solo sabríamos esto al revisar la página 392 00:16:27,493 --> 00:16:29,480 principal, por así decirlo, o reference.cs50.net, 393 00:16:29,480 --> 00:16:31,579 o revisar sus notas, o Google, o lo que sea. 394 00:16:31,579 --> 00:16:32,370 Y entonces queda bien. 395 00:16:32,370 --> 00:16:34,820 Parece que está en Ctype.h. 396 00:16:34,820 --> 00:16:37,220 Ahora voy a recompilar. 397 00:16:37,220 --> 00:16:42,575 Parece que funciona, entonces escribo initials y luego David J. Malan, 398 00:16:42,575 --> 00:16:44,010 Enter, parece que funciona. 399 00:16:44,010 --> 00:16:47,750 Ahora probare un caso aparte, Rob Bowden, sin su segundo nombre. 400 00:16:47,750 --> 00:16:48,260 RB. 401 00:16:48,260 --> 00:16:49,410 Y parece que funciona. 402 00:16:49,410 --> 00:16:52,370 Este no es el proceso para una prueba rigurosa, pero confiemos que utilizamos 403 00:16:52,370 --> 00:16:53,870 al menos las bases correctas. 404 00:16:53,870 --> 00:16:57,030 Pero la clave aquí es que rompimos esta abstracción, por así decirlo, 405 00:16:57,030 --> 00:16:58,130 de lo que es una cadena. 406 00:16:58,130 --> 00:17:00,379 Porque si entendemos que una cadena es solo 407 00:17:00,379 --> 00:17:03,800 una secuencia de caracteres y que una cadena debe terminar con \0, 408 00:17:03,800 --> 00:17:05,119 podemos hacerlo nosotros mismos. 409 00:17:05,119 --> 00:17:08,089 Y esto es lo que podemos hacer en C, podemos poner caracteres 410 00:17:08,089 --> 00:17:10,970 o números en cualquier lugar que deseemos en la memoria 411 00:17:10,970 --> 00:17:13,670 Y esto finalmente te da mucho poder y flexibilidad, 412 00:17:13,670 --> 00:17:17,119 pero también, como ya veremos, muchas posibilidades para cometer errores 413 00:17:17,119 --> 00:17:18,500 con este poder. 414 00:17:18,500 --> 00:17:22,440 Muy bien, ¿tienen alguna duda sobre este ejemplo en particular? 415 00:17:22,440 --> 00:17:22,940 Sí. 416 00:17:22,940 --> 00:17:25,710 PÚBLICO: ¿Puedes explicar el contador de iniciales? 417 00:17:25,710 --> 00:17:26,460 DAVID: Claro. 418 00:17:26,460 --> 00:17:27,420 PÚBLICO: [INAUDIBLE] 419 00:17:27,420 --> 00:17:28,170 DAVID: Claro que sí. 420 00:17:28,170 --> 00:17:32,400 Vamos a explicar el contador de iniciales que se usa aquí 421 00:17:32,400 --> 00:17:34,320 y que se declara acá. 422 00:17:34,320 --> 00:17:37,590 Entonces, básicamente queremos hacer un seguimiento de dos ubicaciones. 423 00:17:37,590 --> 00:17:40,830 Si mi nombre es de esta longitud, comenzaré en el primer 424 00:17:40,830 --> 00:17:47,140 carácter, D, y con i itero desde D-A-V-I-D, espacio, etc. 425 00:17:47,140 --> 00:17:49,770 Entonces, en cierto modo, avanza un paso a la vez. 426 00:17:49,770 --> 00:17:52,186 El arreglo de iniciales, mientras tanto, es otra porción de memoria. 427 00:17:52,186 --> 00:17:55,500 Es de tamaño cuatro, en alguna parte de ese chip de silicio verde, 428 00:17:55,500 --> 00:17:57,270 con todas esas fichas negras. 429 00:17:57,270 --> 00:17:59,760 Y queremos avanzar más lentamente, porque solo 430 00:17:59,760 --> 00:18:03,630 queremos movernos a la siguiente ubicación en el arreglo de iniciales 431 00:18:03,630 --> 00:18:05,309 una vez que hayamos puesto una letra mayúscula allí. 432 00:18:05,309 --> 00:18:07,350 Y es posible que eso ocurra con menor frecuencia 433 00:18:07,350 --> 00:18:09,210 a menos que el usuario haya escrito todo en mayúsculas. 434 00:18:09,210 --> 00:18:11,689 Entonces, para lograr eso, necesitamos una segunda variable 435 00:18:11,689 --> 00:18:13,980 y ustedes propusieron que usemos una variable llamada contador, 436 00:18:13,980 --> 00:18:16,660 pero podríamos haberla llamado j o de algún otro modo. 437 00:18:16,660 --> 00:18:19,170 Entonces, el contador se inicializa en cero 438 00:18:19,170 --> 00:18:24,250 y se incrementa aquí cada vez que encontramos una letra mayúscula. 439 00:18:24,250 --> 00:18:26,890 Entonces, tiene el efecto de contar las letras mayúsculas 440 00:18:26,890 --> 00:18:32,100 en el nombre de alguien: D, J, M, y debe ser 3 al final de esos bucles. 441 00:18:32,100 --> 00:18:34,320 Y eso es perfecto, porque como ya vimos anteriormente, 442 00:18:34,320 --> 00:18:39,540 3 es la ubicación correcta para poner la diagonal inversa 0, incluso 443 00:18:39,540 --> 00:18:42,480 cuando quiera ir en la cuarta ubicación, la dirección de la misma, 444 00:18:42,480 --> 00:18:44,340 o su ubicación sea 3. 445 00:18:44,340 --> 00:18:47,490 Entonces, de alguna manera resolvemos varios problemas a la vez. 446 00:18:47,490 --> 00:18:48,170 Buena pregunta. 447 00:18:48,170 --> 00:18:50,394 ¿Otras preguntas? 448 00:18:50,394 --> 00:18:51,060 ¿Alguna otra? 449 00:18:51,060 --> 00:18:51,580 Muy bien. 450 00:18:51,580 --> 00:18:52,080 Entonces. 451 00:18:52,080 --> 00:18:56,880 Dicho esto, no nos preocupemos tanto por ese tipo de implementación 452 00:18:56,880 --> 00:19:00,420 de bajo nivel y pensemos qué más podemos hacer con estas cosas 453 00:19:00,420 --> 00:19:01,170 llamadas arreglos. 454 00:19:01,170 --> 00:19:03,211 Si comenzamos a deshacernos de las direcciones y solo sabemos 455 00:19:03,211 --> 00:19:06,240 tenemos una secuencia de caracteres, o cualquier otra cosa en la memoria, 456 00:19:06,240 --> 00:19:08,700 y a final de cuentas tenemos la habilidad 457 00:19:08,700 --> 00:19:10,590 para establecer cosas contiguamente en la memoria 458 00:19:10,590 --> 00:19:12,280 de manera consecutiva, como esta. 459 00:19:12,280 --> 00:19:16,147 Entonces, aquí hay ocho cajas, dentro de las cuales podemos poner cualquier cosa, 460 00:19:16,147 --> 00:19:18,480 pero como humanos hemos estado haciendo trampa por algún tiempo. 461 00:19:18,480 --> 00:19:21,540 Cuando teníamos el nombre de Stelios en la pantalla, todos los de esta sala 462 00:19:21,540 --> 00:19:25,450 solo echábamos un vistazo y asimilábamos su nombre de golpe. 463 00:19:25,450 --> 00:19:29,910 Pero las computadoras no son tan intuitivas ni lo ven todo 464 00:19:29,910 --> 00:19:33,570 como nosotros, que podemos ver todo el panorama a la vez. 465 00:19:33,570 --> 00:19:36,940 Una computadora solo puede ver una cosa a la vez. 466 00:19:36,940 --> 00:19:40,260 Y entonces, una metáfora mejor que una caja como esta 467 00:19:40,260 --> 00:19:42,960 para las ubicaciones que hay en la memoria de la computadora 468 00:19:42,960 --> 00:19:45,960 sería como tener ocho casilleros en una escuela, 469 00:19:45,960 --> 00:19:49,680 donde una computadora, para ver el valor en cualquiera de esos cajones 470 00:19:49,680 --> 00:19:53,550 tendría que trabajar un poco y abrir la puerta para ver lo que hay adentro. 471 00:19:53,550 --> 00:19:57,840 y por lo tanto, no podría ver ocho ubicaciones simultáneamente. 472 00:19:57,840 --> 00:20:00,960 Por lo tanto, esto tendría implicaciones muy reales, porque ahora 473 00:20:00,960 --> 00:20:03,270 si queremos comprobar la longitud de una cadena 474 00:20:03,270 --> 00:20:06,520 o contar el número de cosas que hay en un arreglo, o mover cosas 475 00:20:06,520 --> 00:20:09,112 tendremos que hacer una cosa a la vez, 476 00:20:09,112 --> 00:20:11,070 mientras que los humanos podríamos simplemente verlo 477 00:20:11,070 --> 00:20:14,690 y decir, oh, ordena estos números de alguna manera intuitiva. 478 00:20:14,690 --> 00:20:18,880 Y eso es una buena transición a un problema muy distinto 479 00:20:18,880 --> 00:20:20,830 que es el de clasificar valores. 480 00:20:20,830 --> 00:20:25,230 Entonces, para esto tenemos, digamos, el equivalente a siete casilleros, 481 00:20:25,230 --> 00:20:26,310 aquí arriba. 482 00:20:26,310 --> 00:20:29,082 Y detrás de estas puertas, por así decirlo, hay un montón de números. 483 00:20:29,082 --> 00:20:31,290 Así que haremos la transición desde caracteres y cadenas 484 00:20:31,290 --> 00:20:33,373 y simplemente lo generalizaremos a números, porque son 485 00:20:33,373 --> 00:20:36,520 convenientes para trabajar, y tenemos muchos de ellos a nuestra disposición. 486 00:20:36,520 --> 00:20:38,970 Pero me gustaría encontrar un número en particular. 487 00:20:38,970 --> 00:20:42,037 Supongamos que una computadora almacena un arreglo de números, 488 00:20:42,037 --> 00:20:44,370 un montón de enteros consecutivos, consecutivos, consecutivos. 489 00:20:44,370 --> 00:20:45,745 Así es como podrían verse. 490 00:20:45,745 --> 00:20:48,974 Las puertas están cerradas y necesitamos un algoritmo para encontrar un número, 491 00:20:48,974 --> 00:20:52,140 porque una computadora no puede solo ver y decir, ahí está tu número. 492 00:20:52,140 --> 00:20:54,540 Probablemente la computadora tiene que ser más metódica 493 00:20:54,540 --> 00:20:57,570 debe ir de izquierda a derecha, de derecha a izquierda, comenzar en el medio, 494 00:20:57,570 --> 00:20:58,890 abrirlos al azar. 495 00:20:58,890 --> 00:21:00,270 Necesitamos un algoritmo. 496 00:21:00,270 --> 00:21:05,010 ¿Alguien quiere ser un valiente voluntario? 497 00:21:05,010 --> 00:21:06,448 OK, ven por favor. 498 00:21:06,448 --> 00:21:07,156 ¿Cómo te llamas? 499 00:21:07,156 --> 00:21:07,910 CHRISSY: Chrissy. 500 00:21:07,910 --> 00:21:08,310 DAVID: ¿Kristen? 501 00:21:08,310 --> 00:21:08,850 CHRISSY: Chrissy. 502 00:21:08,850 --> 00:21:09,725 DAVID: Chrissy. 503 00:21:09,725 --> 00:21:11,700 Ven por este lado. 504 00:21:11,700 --> 00:21:14,970 Muy bien, Chrissy, todo lo que sabes es que hay siete puertas, 505 00:21:14,970 --> 00:21:16,550 encantado de conocerte, 506 00:21:16,550 --> 00:21:17,502 aquí en la pantalla. 507 00:21:17,502 --> 00:21:20,460 Con ayuda de tu dedo puedes tocar una puerta para abrirla, 508 00:21:20,460 --> 00:21:22,085 o desbloquearla para ver que hay 509 00:21:22,085 --> 00:21:26,800 y quisiera que encuentres el número 50. 510 00:21:26,800 --> 00:21:27,300 Diablos. 511 00:21:27,300 --> 00:21:29,284 [RISAS] 512 00:21:29,284 --> 00:21:30,772 ¡Muy bien! 513 00:21:30,772 --> 00:21:36,240 [APLAUSOS] 514 00:21:36,240 --> 00:21:38,940 Creo que necesitamos un premio mejor que una pelotita para el estrés. 515 00:21:38,940 --> 00:21:40,037 Muy bien hecho. 516 00:21:40,037 --> 00:21:42,870 Quisiera preguntarte si podemos 517 00:21:42,870 --> 00:21:43,680 pasarte el micrófono, 518 00:21:43,680 --> 00:21:44,380 aquí tienes. 519 00:21:44,380 --> 00:21:49,040 Dime, ¿cuál fue tu increíble algoritmo para encontrar el 50? 520 00:21:49,040 --> 00:21:50,550 CHRISSY: Solo le di clic. 521 00:21:50,550 --> 00:21:51,508 DAVID: OK, eso es genial. 522 00:21:51,508 --> 00:21:52,466 CHRISSY: Se ve bien. 523 00:21:52,466 --> 00:21:53,280 DAVID: OK. 524 00:21:53,280 --> 00:21:54,111 Entonces, tú, OK. 525 00:21:54,111 --> 00:21:54,610 Muy bueno. 526 00:21:54,610 --> 00:21:57,570 Maravillosamente efectivo. 527 00:21:57,570 --> 00:22:00,600 Deja revelo... hagamos esto. 528 00:22:00,600 --> 00:22:04,920 Estos son todos los sitios donde podías haberte equivocado. 529 00:22:04,920 --> 00:22:07,920 Y deja le pregunto al público antes de probar con otro ejemplo. 530 00:22:07,920 --> 00:22:10,470 ¿Qué les sorprende de estos números? 531 00:22:10,470 --> 00:22:12,422 ¿Nada en particular? 532 00:22:12,422 --> 00:22:14,089 PÚBLICO: Están desordenados. 533 00:22:14,089 --> 00:22:15,505 DAVID: ¿Están en orden? 534 00:22:15,505 --> 00:22:15,790 PÚBLICO: Desordenados. 535 00:22:15,790 --> 00:22:17,170 DAVID: Desordenados. 536 00:22:17,170 --> 00:22:19,360 Son aleatorios. 537 00:22:19,360 --> 00:22:22,690 Aunque alguien astuto podría notar algo, 538 00:22:22,690 --> 00:22:24,591 o alguien que vea demasiada televisión. 539 00:22:24,591 --> 00:22:25,090 Sí. 540 00:22:25,090 --> 00:22:26,290 PÚBLICO: Son los números de Lost. 541 00:22:26,290 --> 00:22:27,456 DAVID: Sí, gracias. 542 00:22:27,456 --> 00:22:29,300 Los dos vemos mucho Lost. 543 00:22:29,300 --> 00:22:32,560 Además, teníamos un séptimo número y le agregamos el nuestro, 544 00:22:32,560 --> 00:22:34,570 entonces quedaron en orden aleatorio. 545 00:22:34,570 --> 00:22:36,460 porque los revolví arbitrariamente. 546 00:22:36,460 --> 00:22:38,410 No están ordenados de mayor a menor, 547 00:22:38,410 --> 00:22:40,845 ni de mayor a menor. 548 00:22:40,845 --> 00:22:43,720 No tienen ningún patrón porque simplemente los mezclé. 549 00:22:43,720 --> 00:22:48,240 Y eso es un problema, porque aunque Chrissy tuvo suerte y encontró el 50, 550 00:22:48,240 --> 00:22:50,500 fue muy buena para encontrar el 50, 551 00:22:50,500 --> 00:22:53,410 podría ser difícil replicar ese algoritmo y encontrarlo 552 00:22:53,410 --> 00:22:55,720 cada vez, a menos que sepamos algo 553 00:22:55,720 --> 00:22:57,550 sobre los números que hay detrás de las puertas. 554 00:22:57,550 --> 00:23:00,020 Y entonces, lo sabremos en el siguiente ejemplo. 555 00:23:00,020 --> 00:23:04,210 En el próximo ejemplo también tenemos siete puertas 556 00:23:04,210 --> 00:23:07,060 y los mismos siete números, pero ahora están ordenados. 557 00:23:07,060 --> 00:23:11,864 Sabiendo eso, ¿qué cambia en tu enfoque? 558 00:23:11,864 --> 00:23:16,130 CHRISSY: Uh, bueno, supongo que si están ordenados, como de menor a mayor 559 00:23:16,130 --> 00:23:18,850 entonces podría, porque sabría que está más cerca del final. 560 00:23:18,850 --> 00:23:21,389 Pero si no sé cómo están ordenados, entonces 561 00:23:21,389 --> 00:23:22,680 creo que realmente no lo sabría. 562 00:23:22,680 --> 00:23:23,040 DAVID: OK, bien. 563 00:23:23,040 --> 00:23:25,790 Entonces si digo que están ordenados de menor a mayor 564 00:23:25,790 --> 00:23:28,206 te propongo de nuevo que encuentres el número 50. 565 00:23:28,206 --> 00:23:30,980 566 00:23:30,980 --> 00:23:32,680 Sí, esto no está funcionando muy bien. 567 00:23:32,680 --> 00:23:34,010 Eso estuvo muy bien. 568 00:23:34,010 --> 00:23:35,480 OK, felicidades. 569 00:23:35,480 --> 00:23:40,040 [APLAUSOS] 570 00:23:40,040 --> 00:23:41,919 Entonces, vieron... gracias. 571 00:23:41,919 --> 00:23:43,710 Entonces, vieron qué tan eficiente 572 00:23:43,710 --> 00:23:48,520 fue su segundo algoritmo cuando ella aprovechó esa información. 573 00:23:48,520 --> 00:23:52,350 Pero con toda seriedad, podría hacerse mejor, especialmente 574 00:23:52,350 --> 00:23:56,460 para conjuntos de datos muy grandes si conocen algo sobre los datos. 575 00:23:56,460 --> 00:23:58,440 Si saben que estos números están ordenados, 576 00:23:58,440 --> 00:24:01,062 podrían, tal como Chrissy lo hizo, muy intuitiva y correctamente, 577 00:24:01,062 --> 00:24:03,520 ir al final, sabiendo que el número más grande, 578 00:24:03,520 --> 00:24:05,145 probablemente sea el que está más a la derecha. 579 00:24:05,145 --> 00:24:08,850 Si ella no lo sabía, y solo sabía que los números estaban ordenados, 580 00:24:08,850 --> 00:24:12,360 y no sabía si 50 era un número pequeño, un número medio, 581 00:24:12,360 --> 00:24:15,900 o el número más grande, solo era un número detrás de las puertas. 582 00:24:15,900 --> 00:24:20,008 ¿Qué sería una estrategia inteligente dada esa mínima información? 583 00:24:20,008 --> 00:24:21,966 PÚBLICO: [INAUDIBLE] a mitad de camino, y luego si es 584 00:24:21,966 --> 00:24:24,430 mayor, lo mueves hacia la derecha, si es menor, lo mueves hacia la izquierda. 585 00:24:24,430 --> 00:24:26,050 DAVID: Sí, podemos intentar esa misma división 586 00:24:26,050 --> 00:24:29,050 y conquistar el enfoque que tuvimos en la primera clase, con la guía telefónica, 587 00:24:29,050 --> 00:24:29,260 ¿correcto? 588 00:24:29,260 --> 00:24:31,420 Donde revisamos casi en medio, porque 589 00:24:31,420 --> 00:24:34,010 sabíamos que MS estaría más o menos en medio. 590 00:24:34,010 --> 00:24:34,930 Y luego, si buscáramos 591 00:24:34,930 --> 00:24:37,480 a Mike Smith, cuyo apellido comienza con S, 592 00:24:37,480 --> 00:24:40,438 sabríamos que estaría a la derecha, y entonces iríamos a la derecha, 593 00:24:40,438 --> 00:24:41,842 y luego dividiríamos el problema 594 00:24:41,842 --> 00:24:46,790 [RISAS] Hoy no nos va tan bien. 595 00:24:46,790 --> 00:24:49,520 Entonces, dividiríamos y venceríamos el problema una y otra vez. 596 00:24:49,520 --> 00:24:50,560 Y podemos hacerlo aquí. 597 00:24:50,560 --> 00:24:53,800 Aunque no es tan visualmente atractivo como una guía telefónica, 598 00:24:53,800 --> 00:24:55,220 podemos ir al centro. 599 00:24:55,220 --> 00:24:58,074 Y si Chrissy hubiera abierto la puerta de en medio y visto el 16, 600 00:24:58,074 --> 00:24:58,990 sabrían, ¿qué? 601 00:24:58,990 --> 00:25:00,520 Y de hecho puedo recrear esto. 602 00:25:00,520 --> 00:25:02,540 Voy a actualizar la pantalla. 603 00:25:02,540 --> 00:25:04,600 Entonces, en este caso, tenemos las mismas puertas. 604 00:25:04,600 --> 00:25:08,920 Sé que 50 está en algún lado, y no sé cómo... dónde está, excepto el 16. 605 00:25:08,920 --> 00:25:10,920 Ahora sé que está a la derecha, como proponen. 606 00:25:10,920 --> 00:25:14,750 Entonces, puedo eliminar todas estas puertas y no preocuparme por ellas. 607 00:25:14,750 --> 00:25:16,630 Y de hecho, si las abro podemos confirmar 608 00:25:16,630 --> 00:25:19,249 que no necesito desperdiciar mi tiempo buscando en ellas. 609 00:25:19,249 --> 00:25:20,290 Ahora tengo tres puertas. 610 00:25:20,290 --> 00:25:21,550 Ahora, ¿qué proponen que hagamos? 611 00:25:21,550 --> 00:25:22,780 PÚBLICO: ¿Ir a la de en medio otra vez? 612 00:25:22,780 --> 00:25:24,530 DAVID: Sí, ir a la de en medio otra vez. 613 00:25:24,530 --> 00:25:28,340 Entonces, el 42 es una buena respuesta, pero no es lo que estamos buscando. 614 00:25:28,340 --> 00:25:30,899 Y de hecho, podemos tirar esta mitad del problema 615 00:25:30,899 --> 00:25:33,940 y buscar en la mitad derecha, que ahora se ha reducido 616 00:25:33,940 --> 00:25:36,746 a uno, y entonces encontraríamos el 50. 617 00:25:36,746 --> 00:25:38,620 Y si pudiéramos reconstruir lo que hubiera sido 618 00:25:38,620 --> 00:25:42,820 una gran historia, en el primer ejemplo qué tan bien lo habría 619 00:25:42,820 --> 00:25:46,240 hecho Chrissy, en teoría, o si hiciéramos este ejercicio una y otra 620 00:25:46,240 --> 00:25:48,680 y otra vez, con el primer ejemplo. 621 00:25:48,680 --> 00:25:50,770 Si no sabemos nada sobre los números, 622 00:25:50,770 --> 00:25:54,190 podemos tener suerte, simplemente eligiendo una puerta y, guau, 623 00:25:54,190 --> 00:25:55,510 ahí está el número. 624 00:25:55,510 --> 00:25:57,920 Pero eso no va a suceder siempre, es lo más probable. 625 00:25:57,920 --> 00:26:02,980 Y entonces quizás tuviéramos que comenzar, desde el principio, no, 626 00:26:02,980 --> 00:26:04,240 no, no. 627 00:26:04,240 --> 00:26:06,750 Tal vez podríamos ser más inteligentes y brincar hacia adelante, no, 628 00:26:06,750 --> 00:26:10,275 no, OK, en algún momento lo encontraremos si está allí. 629 00:26:10,275 --> 00:26:13,150 Pero si no sabemos nada de los números, lo mejor que podemos hacer 630 00:26:13,150 --> 00:26:14,410 es aplicarles la fuerza bruta. 631 00:26:14,410 --> 00:26:17,830 Solo la fuerza bruta a nuestra manera, a través de las posibilidades 632 00:26:17,830 --> 00:26:18,950 hasta encontrar la respuesta. 633 00:26:18,950 --> 00:26:20,980 Pero en el peor de los casos, ¿Cuántas puertas podríamos 634 00:26:20,980 --> 00:26:23,710 abrir hasta encontrar el número 50, si no sabíamos nada? 635 00:26:23,710 --> 00:26:24,543 PÚBLICO: Las siete. 636 00:26:24,543 --> 00:26:25,820 DAVID: Sí, las siete. 637 00:26:25,820 --> 00:26:26,320 ¿Correcto? 638 00:26:26,320 --> 00:26:29,350 Si n es el número de puertas, entonces podría tomar n pasos. 639 00:26:29,350 --> 00:26:31,600 En este caso, fue n menos uno, o seis pasos. 640 00:26:31,600 --> 00:26:35,740 Pero en el caso de Chrissy, claramente, hay un límite inferior muy emocionante, 641 00:26:35,740 --> 00:26:38,440 porque si se tiene suerte, puede tomar solo un paso. 642 00:26:38,440 --> 00:26:40,660 Entonces, eso es un rango interesante a considerar. 643 00:26:40,660 --> 00:26:43,450 La solución al problema podría tomar un paso, o n pasos, 644 00:26:43,450 --> 00:26:45,160 o cualquier número intermedio. 645 00:26:45,160 --> 00:26:48,250 Pero en la búsqueda binaria que propusieron en el segundo enfoque, 646 00:26:48,250 --> 00:26:49,630 la de divide y vencerás, 647 00:26:49,630 --> 00:26:51,760 recuerden cuando hicimos eso en el pasado, 648 00:26:51,760 --> 00:26:57,406 teníamos una forma muy linda en la curva que dibujamos, la cual describió 649 00:26:57,406 --> 00:26:58,780 la eficiencia de este algoritmo. 650 00:26:58,780 --> 00:27:00,610 Y volveremos a ello dentro de poco. 651 00:27:00,610 --> 00:27:04,950 Pero, para mayor claridad, formalicemos cuáles son estos dos algoritmos. 652 00:27:04,950 --> 00:27:07,820 Si comienzo desde la izquierda y voy a la derecha o comienzo desde la derecha 653 00:27:07,820 --> 00:27:11,470 y voy a la izquierda, siguiendo una línea, podríamos llamarlo búsqueda lineal. 654 00:27:11,470 --> 00:27:13,540 Y puede escribirse de muchas maneras. 655 00:27:13,540 --> 00:27:17,331 Se me ocurrió este pseudocódigo, pero cualquier persona razonable 656 00:27:17,331 --> 00:27:20,330 podría tener otra alternativa y decir, también es búsqueda lineal. 657 00:27:20,330 --> 00:27:22,060 Estas no son definiciones oficiales. 658 00:27:22,060 --> 00:27:23,620 Y lo escribí de la siguiente manera. 659 00:27:23,620 --> 00:27:27,880 Para cada elemento en el arreglo, si es el elemento que busco, 660 00:27:27,880 --> 00:27:28,940 devuelve verdadero. 661 00:27:28,940 --> 00:27:32,960 Esta es una forma muy concisa de decir, para cada elemento del arreglo, 662 00:27:32,960 --> 00:27:35,170 busca de izquierda a derecha o de derecha a izquierda. 663 00:27:35,170 --> 00:27:37,170 Si es el que estamos buscando, devuelve verdadero. 664 00:27:37,170 --> 00:27:39,940 Encontré el número 50, o lo que realmente sea. 665 00:27:39,940 --> 00:27:42,580 De lo contrario, devuelve falso al final. 666 00:27:42,580 --> 00:27:43,820 Y fíjense en la sangría. 667 00:27:43,820 --> 00:27:48,430 La eliminé porque solo como último paso lo devuelvo falso 668 00:27:48,430 --> 00:27:52,660 si ninguna de mis iteraciones a través del bucle regresa verdadera. 669 00:27:52,660 --> 00:27:54,400 Entonces, eso sería búsqueda lineal. 670 00:27:54,400 --> 00:27:59,697 En la búsqueda binaria, se debe ser un poco más detallado para explicarlo. 671 00:27:59,697 --> 00:28:01,780 Y hay muchas formas diferentes de escribirlo, 672 00:28:01,780 --> 00:28:03,490 pero es muy similar a algo 673 00:28:03,490 --> 00:28:05,650 que vimos antes, con Mike Smith y la guía telefónica. 674 00:28:05,650 --> 00:28:08,191 Entonces, si vemos en el medio del arreglo ordenado, 675 00:28:08,191 --> 00:28:12,010 tal como lo propusieron, y si el elemento que buscamos está ahí, 676 00:28:12,010 --> 00:28:13,210 entonces devuelve verdadero. 677 00:28:13,210 --> 00:28:13,900 Encontré el 50. 678 00:28:13,900 --> 00:28:16,600 Tuve suerte, estaba en el centro muerto en medio de mi arreglo, 679 00:28:16,600 --> 00:28:18,820 en una ejecución particular de este programa. 680 00:28:18,820 --> 00:28:22,015 Si no, si el elemento está a la izquierda, busca en la mitad izquierda del arreglo. 681 00:28:22,015 --> 00:28:24,640 Si no, si está a la derecha, busca en la mitad derecha del arreglo. 682 00:28:24,640 --> 00:28:28,940 De lo contrario, devuelve falso, porque posiblemente no está allí. 683 00:28:28,940 --> 00:28:30,440 Entonces, esta sería una búsqueda binaria. 684 00:28:30,440 --> 00:28:33,880 Y a pesar de que son más líneas de código, o pseudocódigo, 685 00:28:33,880 --> 00:28:37,750 podríamos decir que debería ser un poco más rápido, ¿verdad? 686 00:28:37,750 --> 00:28:41,590 Debido a eso de divide y vencerás, y tirando la mitad de la mitad de la mitad 687 00:28:41,590 --> 00:28:43,750 de la mitad, de la mitad se acaba el problema, este 688 00:28:43,750 --> 00:28:48,740 se vuelve más pequeño y mucho, mucho más rápido. 689 00:28:48,740 --> 00:28:49,420 Todo bien. 690 00:28:49,420 --> 00:28:53,680 Dicho lo anterior, parece ser algo muy bueno 691 00:28:53,680 --> 00:28:57,980 que tener las cosas ordenadas sea un ingrediente poderoso para un problema. 692 00:28:57,980 --> 00:28:58,480 ¿Correcto? 693 00:28:58,480 --> 00:29:00,855 Cuesta más trabajo, a Chrissy debería haberle costado más trabajo, 694 00:29:00,855 --> 00:29:02,980 en general nos costaría a todos más trabajo 695 00:29:02,980 --> 00:29:07,830 encontrar un número usando la búsqueda lineal en vez de la búsqueda binaria. 696 00:29:07,830 --> 00:29:11,080 Me hubiera llevado una eternidad encontrar a Mike Smith buscando en una 697 00:29:11,080 --> 00:29:14,020 página a la vez versus usando divide y vencerás, 698 00:29:14,020 --> 00:29:19,450 pues lo encontré mucho más rápido dividiendo el problema a la mitad 699 00:29:19,450 --> 00:29:20,830 y a la mitad, una y otra vez. 700 00:29:20,830 --> 00:29:24,472 Entonces, eso lleva a la pregunta, ¿cómo se ordena algo? 701 00:29:24,472 --> 00:29:26,680 Bueno, para continuar recogeré estas cosas 702 00:29:26,680 --> 00:29:29,967 que no usaremos en este curso, sino en otro sitio en el campus, 703 00:29:29,967 --> 00:29:31,300 es posible que tengan estos libros azules. 704 00:29:31,300 --> 00:29:33,460 y que en el momento del examen escriban su nombre, el curso, 705 00:29:33,460 --> 00:29:34,450 y todo eso en ellos. 706 00:29:34,450 --> 00:29:37,491 Y lo hemos simplificado, entonces, esta es una persona cuyo apellido comienza 707 00:29:37,491 --> 00:29:38,990 con A, el apellido 708 00:29:38,990 --> 00:29:42,550 de una persona que comienza con B, C, y así sucesivamente hasta la Z. 709 00:29:42,550 --> 00:29:44,860 Pero supongamos que las personas acaban en diferentes momentos 710 00:29:44,860 --> 00:29:46,900 durante el examen, y por supuesto, cuando se está en el centro de ciencias 711 00:29:46,900 --> 00:29:48,580 o donde sea, todos simplemente comienzan a entregarlos, 712 00:29:48,580 --> 00:29:50,390 y vienen de esta manera y luego 713 00:29:50,390 --> 00:29:52,348 los asistentes que están en el frente de la habitación, o el profesor, 714 00:29:52,348 --> 00:29:54,970 tienen que ordenar estos valores. 715 00:29:54,970 --> 00:29:59,320 Bueno, ¿cuál es el algoritmo que utilizamos? 716 00:29:59,320 --> 00:30:02,590 Si tienen un montón de libros de examen como este, 717 00:30:02,590 --> 00:30:06,790 todos tienen una letra asociada, ¿qué haríamos para ordenarlos? 718 00:30:06,790 --> 00:30:07,390 ¿Qué debo hacer? 719 00:30:07,390 --> 00:30:08,724 PÚBLICO: Comparar dos a la vez. 720 00:30:08,724 --> 00:30:10,181 DAVID: ¿Comparar dos a la vez? 721 00:30:10,181 --> 00:30:12,580 OK, entonces tomaré un par de aquí. 722 00:30:12,580 --> 00:30:13,960 Y dado que soy el único que puede verlos, 723 00:30:13,960 --> 00:30:17,001 deberían poder verlos en el proyector, gracias a Ian y Scully. 724 00:30:17,001 --> 00:30:19,154 Tenemos P y H, entonces alfabéticamente H va antes de P. 725 00:30:19,154 --> 00:30:20,320 Muy bien, ¿y ahora qué hago? 726 00:30:20,320 --> 00:30:22,084 ¿Tomo otros dos? 727 00:30:22,084 --> 00:30:23,000 PÚBLICO: Toma uno. 728 00:30:23,000 --> 00:30:24,874 DAVID: OK, entonces tomo solo uno, 729 00:30:24,874 --> 00:30:27,550 y tomé uno de N, entonces ese va entre H y P. 730 00:30:27,550 --> 00:30:29,320 así que puedo deslizarlo. 731 00:30:29,320 --> 00:30:33,050 Ahora tomé el de G, que va antes que H, luego 732 00:30:33,050 --> 00:30:35,352 tomé otro con E, ese va antes que G, entonces, 733 00:30:35,352 --> 00:30:36,810 de hecho se vuelve cada vez más fácil. 734 00:30:36,810 --> 00:30:41,500 Oh, oh, uno con U, este va al final, después de P. 735 00:30:41,500 --> 00:30:45,730 Y puedo seguir tomando uno a la vez, F en este caso, 736 00:30:45,730 --> 00:30:48,214 y luego ponerlo en la ubicación apropiada. 737 00:30:48,214 --> 00:30:51,130 Y no completaremos todo porque sería muy tedioso 738 00:30:51,130 --> 00:30:53,170 y al final me avergonzaré si saco una letra 739 00:30:53,170 --> 00:30:53,680 equivocada. 740 00:30:53,680 --> 00:30:55,660 Pero eso es un algoritmo, ¿verdad? 741 00:30:55,660 --> 00:30:59,654 Para cada cuaderno que hay en la pila, tómalo, compáralo 742 00:30:59,654 --> 00:31:01,570 con todos los elementos que ya estás sosteniendo 743 00:31:01,570 --> 00:31:04,030 e insertarlo en la ubicación apropiada. 744 00:31:04,030 --> 00:31:06,155 Y podemos llamarlo de algún modo y a eso 745 00:31:06,155 --> 00:31:09,860 se le llama ordenamiento por inserción, en tanto que énfasis del algoritmo es 746 00:31:09,860 --> 00:31:13,630 gracias, insertar letras, en este caso, 747 00:31:13,630 --> 00:31:15,820 en la ubicación apropiada. 748 00:31:15,820 --> 00:31:21,179 Dicho lo anterior, ¿hay otras formas distintas? 749 00:31:21,179 --> 00:31:24,220 Para continuar, y tenemos suficientes pelotitas para el estrés como para 750 00:31:24,220 --> 00:31:27,490 aplicar una demostración humana, más allá de estos libros 751 00:31:27,490 --> 00:31:28,400 tenemos aquí estos números. 752 00:31:28,400 --> 00:31:30,190 Supongamos que queremos ordenarlos. 753 00:31:30,190 --> 00:31:33,070 Tengo ocho pelotitas para el estrés y ocho pedazos de papel. 754 00:31:33,070 --> 00:31:35,830 ¿Podríamos tener ocho voluntarios? 755 00:31:35,830 --> 00:31:40,032 Ok, sí, derecha y atrás, dos tres, vayamos más atrás... cuatro. 756 00:31:40,032 --> 00:31:40,990 ¿Puedo ir más atrás? 757 00:31:40,990 --> 00:31:46,300 Cinco, seis, siete y ocho. 758 00:31:46,300 --> 00:31:47,050 Vengan. 759 00:31:47,050 --> 00:31:48,541 Ah, para la próxima. 760 00:31:48,541 --> 00:31:49,040 Para la próxima. 761 00:31:49,040 --> 00:31:50,470 Muy bien, vengan. 762 00:31:50,470 --> 00:31:55,960 763 00:31:55,960 --> 00:31:56,460 OK. 764 00:31:56,460 --> 00:31:56,880 ¿Cómo te llamas? 765 00:31:56,880 --> 00:31:57,470 JERRY: Jerry. 766 00:31:57,470 --> 00:31:57,600 DAVID: Jerry. 767 00:31:57,600 --> 00:32:00,240 OK, si gustas pasar y pararte frente a uno de los atriles. 768 00:32:00,240 --> 00:32:00,870 ARMAH: Armah 769 00:32:00,870 --> 00:32:01,850 DAVID: Armah, David. 770 00:32:01,850 --> 00:32:02,391 CHRIS: Chris. 771 00:32:02,391 --> 00:32:03,630 DAVID: Chris, David. 772 00:32:03,630 --> 00:32:04,230 Gracias. 773 00:32:04,230 --> 00:32:05,066 KAYLIND: Kaylind. 774 00:32:05,066 --> 00:32:05,998 DAVID: Kaylind. 775 00:32:05,998 --> 00:32:06,464 NOLAN: Nolan. 776 00:32:06,464 --> 00:32:07,290 DAVID: Nolan, David. 777 00:32:07,290 --> 00:32:07,860 JAY: Jay. 778 00:32:07,860 --> 00:32:08,130 DAVID: David. 779 00:32:08,130 --> 00:32:08,820 MATTHEW: Matthew. 780 00:32:08,820 --> 00:32:09,540 DAVID: Matthew, David. 781 00:32:09,540 --> 00:32:10,050 OK. 782 00:32:10,050 --> 00:32:14,580 Entonces, esto es estadísticamente anómalo 783 00:32:14,580 --> 00:32:17,632 ya que estamos muy emocionados porque este semestre en CS50, 784 00:32:17,632 --> 00:32:20,090 por primera vez, y nosotros vemos estos números anualmente, 785 00:32:20,090 --> 00:32:23,850 el 44 % de los alumnos en CS50 son mujeres este año. 786 00:32:23,850 --> 00:32:26,446 787 00:32:26,446 --> 00:32:28,320 Entonces, como pueden ver, ninguna de mis demostraciones 788 00:32:28,320 --> 00:32:30,370 ha funcionado correctamente hoy. 789 00:32:30,370 --> 00:32:31,490 Pero confíen en esa información. 790 00:32:31,490 --> 00:32:34,980 Entonces, si cada uno de ustedes puede pararse detrás de uno de los 791 00:32:34,980 --> 00:32:38,880 atriles, entonces conté exactamente ocho personas. 792 00:32:38,880 --> 00:32:40,740 Frente a ustedes chicos tenemos números. 793 00:32:40,740 --> 00:32:43,022 Así que adelante y volteen las hojas de papel, 794 00:32:43,022 --> 00:32:45,480 las cuales representan los números que tenemos en la pantalla, 795 00:32:45,480 --> 00:32:46,749 si las puse en el orden correcto. 796 00:32:46,749 --> 00:32:48,790 Entonces habrá muchas maneras diferentes 797 00:32:48,790 --> 00:32:52,120 en las que podemos ordenar estos ocho valores. 798 00:32:52,120 --> 00:32:54,280 ¿Qué hacemos para lograr esto? 799 00:32:54,280 --> 00:32:57,829 Bueno, similar a lo que propusieron antes, cuando tomamos un par de libros azules 800 00:32:57,829 --> 00:33:00,120 y los comparamos, ¿por qué no intento esa misma intuición? 801 00:33:00,120 --> 00:33:03,510 Cuatro y dos, estos números obviamente están desordenados. 802 00:33:03,510 --> 00:33:05,310 ¿Qué haré para continuar? 803 00:33:05,310 --> 00:33:07,389 Sí, proseguiré y cambiaré estos. 804 00:33:07,389 --> 00:33:09,180 Ahora, el problema está resuelto, lo cual es brillante. 805 00:33:09,180 --> 00:33:10,250 Tomé un bocado del problema, 806 00:33:10,250 --> 00:33:11,083 y a continuación. 807 00:33:11,083 --> 00:33:12,240 ¿Cuatro y siete? 808 00:33:12,240 --> 00:33:13,020 Esos lucen bien. 809 00:33:13,020 --> 00:33:14,430 ¿Siete y cinco? 810 00:33:14,430 --> 00:33:15,000 No, Ok. 811 00:33:15,000 --> 00:33:16,035 Entonces, ¿qué quiero hacer aquí? 812 00:33:16,035 --> 00:33:16,660 PÚBLICO: Cambiarlos. 813 00:33:16,660 --> 00:33:18,300 DAVID: Sí, entonces puedo intercambiar esos, gracias. 814 00:33:18,300 --> 00:33:19,230 Entonces, ¿siete y seis? 815 00:33:19,230 --> 00:33:19,980 También están desordenados, 816 00:33:19,980 --> 00:33:21,444 intercambiemos esos. 817 00:33:21,444 --> 00:33:22,110 ¿Siete y ocho? 818 00:33:22,110 --> 00:33:23,160 Están bien. 819 00:33:23,160 --> 00:33:23,940 ¿Ocho y tres? 820 00:33:23,940 --> 00:33:27,420 Están mal, si quieren proseguiremos e intercambiaremos esos. 821 00:33:27,420 --> 00:33:29,920 Y, ocho y uno, si quieres seguir adelante e intercambiar esos. 822 00:33:29,920 --> 00:33:31,650 Entonces, ¿cuál fue el efecto neto? 823 00:33:31,650 --> 00:33:34,290 ¿He ordenado esta lista de números? 824 00:33:34,290 --> 00:33:35,150 Obviamente no. 825 00:33:35,150 --> 00:33:36,690 Pero lo mejoré. 826 00:33:36,690 --> 00:33:40,350 ¿Y cuál es el ejemplo, tal vez, más evidente de la mejora, en frente 827 00:33:40,350 --> 00:33:41,102 de estos? 828 00:33:41,102 --> 00:33:42,310 PÚBLICO: Ocho al final. 829 00:33:42,310 --> 00:33:44,050 DAVID: Ocho está ahora al final. 830 00:33:44,050 --> 00:33:46,420 Entonces, el número más grande, por así decirlo, se reordenó hasta el final, 831 00:33:46,420 --> 00:33:48,390 como si fuera el más grande y emergió del ordenamiento. 832 00:33:48,390 --> 00:33:51,090 Así que eso es bueno, pero todavía hay trabajo por hacer aquí. 833 00:33:51,090 --> 00:33:53,521 Entonces, puedo, de nuevo, intentar arreglar estos problemas localmente. 834 00:33:53,521 --> 00:33:55,770 Solo tomaré un par de problemas e intentaré resolverlos. 835 00:33:55,770 --> 00:33:56,591 Entonces, ¿dos y cuatro? 836 00:33:56,591 --> 00:33:57,090 Vamos bien. 837 00:33:57,090 --> 00:33:58,220 ¿Cuatro y cinco? 838 00:33:58,220 --> 00:33:58,800 ¿Cinco y seis? 839 00:33:58,800 --> 00:33:59,595 ¿Seis y siete? 840 00:33:59,595 --> 00:34:00,659 Oh, ¿siete y tres? 841 00:34:00,659 --> 00:34:01,950 Muchachos, ¿ustedes quieren intercambiar eso? 842 00:34:01,950 --> 00:34:04,830 843 00:34:04,830 --> 00:34:05,550 Maravilloso. 844 00:34:05,550 --> 00:34:08,639 Luego, siete y uno, queremos que lo hagan de nuevo. 845 00:34:08,639 --> 00:34:11,370 Y ahora, ¿necesito molestarme en comparar siete y ocho? 846 00:34:11,370 --> 00:34:13,620 Técnicamente no, porque si sabemos que ocho hizo su trabajo, ahora 847 00:34:13,620 --> 00:34:15,630 podemos iniciar el corte correcto de algunas esquinas 848 00:34:15,630 --> 00:34:17,520 para ahorrar un poco de tiempo fuera del algoritmo, 849 00:34:17,520 --> 00:34:18,520 y hacerlo un poco más eficiente. 850 00:34:18,520 --> 00:34:19,050 Bien. 851 00:34:19,050 --> 00:34:20,984 ¿Están ordenados? 852 00:34:20,984 --> 00:34:22,400 No, entonces seguiremos haciendo esto. 853 00:34:22,400 --> 00:34:25,355 Muchachos, ahora en parejas continuaremos para ejecutar esto. 854 00:34:25,355 --> 00:34:25,980 Así que, aquí vamos. 855 00:34:25,980 --> 00:34:26,639 Dos, cuatro. 856 00:34:26,639 --> 00:34:27,239 Cuatro, cinco. 857 00:34:27,239 --> 00:34:27,825 Cinco, seis. 858 00:34:27,825 --> 00:34:29,475 Seis, tres. 859 00:34:29,475 --> 00:34:31,155 Seis, uno. 860 00:34:31,155 --> 00:34:33,530 Podemos detenernos allí, porque sabemos que siete está en orden. 861 00:34:33,530 --> 00:34:34,321 Ahora lo haremos de nuevo. 862 00:34:34,321 --> 00:34:34,949 Dos y cuatro. 863 00:34:34,949 --> 00:34:35,532 Cuatro y cinco. 864 00:34:35,532 --> 00:34:36,882 ¿Cinco y tres? 865 00:34:36,882 --> 00:34:38,670 ¿Cinco y uno? 866 00:34:38,670 --> 00:34:39,449 Bien mejorado. 867 00:34:39,449 --> 00:34:45,150 Y los que siguen, dos y cuatro, cuatro y tres, cuatro y uno, 868 00:34:45,150 --> 00:34:48,650 y después dos y tres, tres y uno, 869 00:34:48,650 --> 00:34:51,458 y luego dos y uno. 870 00:34:51,458 --> 00:34:52,909 OK, ahora está ordenado. 871 00:34:52,909 --> 00:34:54,150 Sí, muy bien hecho. 872 00:34:54,150 --> 00:34:55,310 Muy bien hecho. 873 00:34:55,310 --> 00:34:58,724 Es un poco tedioso y no 874 00:34:58,724 --> 00:35:01,640 quiero seguir yendo y viniendo, porque afortunadamente tenemos 875 00:35:01,640 --> 00:35:04,670 toda esta fuerza de trabajo, varios CPU, supongo 876 00:35:04,670 --> 00:35:05,210 ahora. 877 00:35:05,210 --> 00:35:08,510 Así que, tenemos todos estos CPU o computadoras 878 00:35:08,510 --> 00:35:09,750 que pueden ayudarme. 879 00:35:09,750 --> 00:35:10,874 Esto todavía es muy lento. 880 00:35:10,874 --> 00:35:12,329 Me refiero a que es una larga historia, 881 00:35:12,329 --> 00:35:14,120 Rebobinemos una vez y tratemos una vez más. 882 00:35:14,120 --> 00:35:16,520 Si pudieran reorganizar sus trozos de papel, chicos, para que 883 00:35:16,520 --> 00:35:20,840 coincidan de nuevo con la pantalla y se restablezca nuestra ubicación original. 884 00:35:20,840 --> 00:35:21,870 Regresemos allá. 885 00:35:21,870 --> 00:35:25,100 886 00:35:25,100 --> 00:35:27,090 Intentemos otro enfoque. 887 00:35:27,090 --> 00:35:30,300 Probé el enfoque de inserción, en el cual asumo solo un problema, 888 00:35:30,300 --> 00:35:32,910 como en el cuaderno azul, los inserto en la ubicación correcta. 889 00:35:32,910 --> 00:35:35,310 Sinceramente, eso fue un poco tedioso, por eso lo aborté, 890 00:35:35,310 --> 00:35:37,351 porque tomaría más y más y más tiempo 891 00:35:37,351 --> 00:35:40,530 encontrar la ubicación correcta entre todos esos libros azules. 892 00:35:40,530 --> 00:35:42,840 Entonces, intentaré algo más intuitivo. 893 00:35:42,840 --> 00:35:45,990 Si quiero ordenar estos números, seleccionaré 894 00:35:45,990 --> 00:35:47,710 el número más pequeño que encuentre. 895 00:35:47,710 --> 00:35:50,509 OK, cuatro, en este momento, es el número más pequeño que encontré. 896 00:35:50,509 --> 00:35:52,050 Así que, por el momento lo tomaré. 897 00:35:52,050 --> 00:35:53,514 De nuevo, estas son casillas. 898 00:35:53,514 --> 00:35:55,680 Aunque nosotros los humanos podemos verlas todas, la computadora 899 00:35:55,680 --> 00:35:57,250 solo puede ver una ubicación a la vez. 900 00:35:57,250 --> 00:36:00,141 Este es el número más pequeño que vi hasta ahora. 901 00:36:00,141 --> 00:36:01,140 Así que lo tomaré, 902 00:36:01,140 --> 00:36:03,930 pero muy rápido, puedo detener esto, porque ahora 903 00:36:03,930 --> 00:36:05,346 encontré un número aún más pequeño, 904 00:36:05,346 --> 00:36:06,970 entonces me quedaré con este en su lugar. 905 00:36:06,970 --> 00:36:11,074 Siete, no me preocuparé por este, cinco, seis, ocho, tres, uno, 906 00:36:11,074 --> 00:36:12,240 encontré un número más pequeño. 907 00:36:12,240 --> 00:36:14,580 Ahora necesito hacer algo con esto. 908 00:36:14,580 --> 00:36:18,870 Quiero tomar el uno, así que aquí pondría el dos. 909 00:36:18,870 --> 00:36:22,930 Ahora, ¿qué quiero hacer con el número uno? 910 00:36:22,930 --> 00:36:25,054 Sí, solo quiero ponerlo aquí. 911 00:36:25,054 --> 00:36:26,970 Puedo hacer esto de diferentes maneras, 912 00:36:26,970 --> 00:36:28,170 pero lo removeré 913 00:36:28,170 --> 00:36:31,307 cualquiera que sea, porque es un número bastante bajo y aleatorio. 914 00:36:31,307 --> 00:36:32,640 Pudo ser un número grande, 915 00:36:32,640 --> 00:36:34,473 así que le haré un espacio y aplicaré eso. 916 00:36:34,473 --> 00:36:36,990 Seleccioné el elemento más pequeño. 917 00:36:36,990 --> 00:36:38,970 ¿La lista está ordenada? 918 00:36:38,970 --> 00:36:40,260 Quiero decir, obviamente no. 919 00:36:40,260 --> 00:36:42,240 Pero, ¿es mejor? 920 00:36:42,240 --> 00:36:42,930 Lo es, ¿verdad? 921 00:36:42,930 --> 00:36:45,420 Porque ahora el uno está en la ubicación correcta. 922 00:36:45,420 --> 00:36:48,490 Además, hasta el momento resolví un octavo del problema. 923 00:36:48,490 --> 00:36:49,260 Entonces no está mal. 924 00:36:49,260 --> 00:36:50,160 ¿Qué podría hacer después? 925 00:36:50,160 --> 00:36:51,493 Voy a aplicar el mismo algoritmo. 926 00:36:51,493 --> 00:36:54,270 y seleccionaré el número más pequeño, el cual es este, 927 00:36:54,270 --> 00:36:56,340 y este y este, 928 00:36:56,340 --> 00:36:59,670 no, tres es más pequeño, oh, dos es incluso más pequeño, así que finalmente 929 00:36:59,670 --> 00:37:00,422 tomaré este. 930 00:37:00,422 --> 00:37:02,880 ¿Saben qué?, en realidad el cuatro no necesita estar allí, 931 00:37:02,880 --> 00:37:06,490 lo removeré otra vez, y colocaré al dos donde pertenece, 932 00:37:06,490 --> 00:37:08,419 y moveré este aquí. 933 00:37:08,419 --> 00:37:09,960 Ahora la lista está aún más ordenada. 934 00:37:09,960 --> 00:37:12,834 Y si prosigo haciendo esto otra vez, y otra vez, si solo queremos 935 00:37:12,834 --> 00:37:14,670 tomar el número más pequeño, ¿tres? 936 00:37:14,670 --> 00:37:17,294 OK, entonces iré directo y removeré el siete porque es, 937 00:37:17,294 --> 00:37:18,930 de cualquier manera, un tipo de número al azar. 938 00:37:18,930 --> 00:37:20,430 Gracias, cuatro, 939 00:37:20,430 --> 00:37:23,541 continuaré y removeré el cinco, a pesar de que siento, 940 00:37:23,541 --> 00:37:26,040 que en promedio, yo mismo estoy haciendo un poco más de trabajo, 941 00:37:26,040 --> 00:37:26,760 eso no importa. 942 00:37:26,760 --> 00:37:29,160 Algunas veces será bueno, algunas será malo. 943 00:37:29,160 --> 00:37:31,260 Continuaré y pondré el cinco aquí. 944 00:37:31,260 --> 00:37:35,580 Ahora seleccionaré el siguiente elemento más pequeño, que será cinco. 945 00:37:35,580 --> 00:37:37,720 Nos recuperamos bastante rápido. 946 00:37:37,720 --> 00:37:39,221 Removeré al seis de aquí. 947 00:37:39,221 --> 00:37:41,178 Ahora buscaré el elemento más pequeño. 948 00:37:41,178 --> 00:37:42,180 De hecho es seis. 949 00:37:42,180 --> 00:37:44,830 Removeré al ocho, colocaré este aquí, 950 00:37:44,830 --> 00:37:47,001 y ahora siete está bien, ocho está bien, 951 00:37:47,001 --> 00:37:47,500 terminé. 952 00:37:47,500 --> 00:37:49,300 Es una especie de larga historia, ¿cierto? 953 00:37:49,300 --> 00:37:51,960 Estuve yendo y viniendo, buscando estos números. 954 00:37:51,960 --> 00:37:53,960 A esto le llamaríamos ordenamiento por selección. 955 00:37:53,960 --> 00:37:56,370 Muchas gracias, si gustan, guarden sus pedazos de papel, 956 00:37:56,370 --> 00:37:57,360 se los pueden quedar. 957 00:37:57,360 --> 00:38:03,035 Chicos, también les daré una bola de estrés. 958 00:38:03,035 --> 00:38:05,160 Y si pudiéramos, una ronda de aplausos para ustedes muchachos. 959 00:38:05,160 --> 00:38:07,732 Si quieren entréguenlos. 960 00:38:07,732 --> 00:38:13,480 Así como antes, veremos si podemos aplicar, 961 00:38:13,480 --> 00:38:17,330 veremos si podemos aplicar algún pseudocódigo a este algoritmo, 962 00:38:17,330 --> 00:38:20,950 porque una cosa es hablar sobre eso, y otra cosa es ordenar por una razón 963 00:38:20,950 --> 00:38:22,420 a través de la intuición, pero al final del día, 964 00:38:22,420 --> 00:38:24,836 si queremos programar esto, tenemos que ser más precisos, 965 00:38:24,836 --> 00:38:28,720 y consideraremos el menor número de operaciones que la computadora 966 00:38:28,720 --> 00:38:30,440 ejecutará. 967 00:38:30,440 --> 00:38:32,980 Entonces, así es como podríamos implementar el ordenamiento burbuja. 968 00:38:32,980 --> 00:38:35,710 Repetir hasta que no haya cambios. 969 00:38:35,710 --> 00:38:40,150 Para i, de 0 hasta n 2 y n es solo 970 00:38:40,150 --> 00:38:43,720 el tamaño del problema, el número de puertas, el número de humanos, 971 00:38:43,720 --> 00:38:46,690 la cantidad de números, cualquiera que sea la entrada al verdadero problema. 972 00:38:46,690 --> 00:38:52,930 Así que, desde 0 hasta n-2, si los elementos i-ésimo y el i-ésimo más 1 973 00:38:52,930 --> 00:38:56,290 están desordenados, se intercambian. 974 00:38:56,290 --> 00:38:57,940 Esto es como un trabalenguas. 975 00:38:57,940 --> 00:39:01,300 Pero si lo piensan, solo estoy aplicando un tipo de vocabulario 976 00:39:01,300 --> 00:39:04,420 que tenemos de C, y un tipo de orden desde cero, 977 00:39:04,420 --> 00:39:07,540 hacia otro tipo de experiencia humana muy orgánica, 978 00:39:07,540 --> 00:39:11,740 pero uso un lenguaje más metódico en vez de solo usar la improvisación, 979 00:39:11,740 --> 00:39:13,390 cuando lo hicimos con humanos. 980 00:39:13,390 --> 00:39:14,740 Porque, ¿qué significa esto? 981 00:39:14,740 --> 00:39:17,470 Para i desde 0 hasta n-2. 982 00:39:17,470 --> 00:39:20,410 Eso significa que se inicia en la ubicación 0, 983 00:39:20,410 --> 00:39:23,350 y si aquí hay n elementos, este es 0, 984 00:39:23,350 --> 00:39:25,690 y esta, al final, es la ubicación, 985 00:39:25,690 --> 00:39:28,990 986 00:39:28,990 --> 00:39:30,670 que será n-1. 987 00:39:30,670 --> 00:39:31,170 ¿Correcto? 988 00:39:31,170 --> 00:39:33,960 Si comienzan a contar en 0, tendrán que reajustar toda su vida 989 00:39:33,960 --> 00:39:37,240 para restar 1 del final de la cola de este intervalo de números. 990 00:39:37,240 --> 00:39:37,740 ¿Correcto? 991 00:39:37,740 --> 00:39:40,560 0, si eso fuera 1, esto sería n. 992 00:39:40,560 --> 00:39:43,620 Pero si eso fuera 0, esto es ahora n-1. 993 00:39:43,620 --> 00:39:45,870 Así que dice, para 0, 994 00:39:45,870 --> 00:39:49,920 para i desde 0 hasta n-2, lo cual es técnicamente esto. 995 00:39:49,920 --> 00:39:54,360 Entonces uso un tipo de lenguaje para que la iteración inicie aquí, 996 00:39:54,360 --> 00:39:57,420 e implemento algo como esto, hasta el penúltimo 997 00:39:57,420 --> 00:39:59,850 elemento, lo cual no hicimos antes. 998 00:39:59,850 --> 00:40:01,560 Parece que casi no tiene errores. 999 00:40:01,560 --> 00:40:06,130 Pero si leen más adelante en el pseudocódigo, ¿por qué hice eso? 1000 00:40:06,130 --> 00:40:10,100 ¿Solamente iterar hasta el penúltimo elemento de i? 1001 00:40:10,100 --> 00:40:11,730 ¿Qué salta a la vista? 1002 00:40:11,730 --> 00:40:12,370 Sí. 1003 00:40:12,370 --> 00:40:16,580 PÚBLICO: ¿Porque intercambiarás el i en los i + 1 elementos? 1004 00:40:16,580 --> 00:40:17,330 DAVID: Bien. 1005 00:40:17,330 --> 00:40:20,060 PÚBLICO: Cuando llegas a n-2, lo cambiarás por n - 1. 1006 00:40:20,060 --> 00:40:20,630 DAVID: Exacto. 1007 00:40:20,630 --> 00:40:23,870 En el ordenamiento burbuja todo era intercambiar o potencialmente intercambiar 1008 00:40:23,870 --> 00:40:25,877 pare de elementos vecinos, por así decirlo. 1009 00:40:25,877 --> 00:40:29,210 Debemos asegurarnos de que si iteramos a través de todos estos números, 1010 00:40:29,210 --> 00:40:33,140 nos detendremos un poco antes del final del arreglo, por lo que i + 1 1011 00:40:33,140 --> 00:40:36,440 se refiere a un elemento que realmente está en nuestra lista, 1012 00:40:36,440 --> 00:40:38,330 y no nos conduzca hasta aquí, el cual 1013 00:40:38,330 --> 00:40:41,220 sería algún valor basura que no se debe tocar. 1014 00:40:41,220 --> 00:40:44,420 Entonces, si esos elementos están desordenados, los intercambiamos, 1015 00:40:44,420 --> 00:40:46,610 y tengo un gran bucle exterior que solo dice, 1016 00:40:46,610 --> 00:40:51,020 haz esto, una y otra vez, y otra vez, hasta que no haya intercambios. 1017 00:40:51,020 --> 00:40:53,889 En ese momento podemos inferir que terminamos. 1018 00:40:53,889 --> 00:40:56,180 Ya que cada vez que iba y venía en la lista, 1019 00:40:56,180 --> 00:41:00,410 y los muchachos ayudaron intercambiando sus números según correspondió, 1020 00:41:00,410 --> 00:41:04,490 Y lo hice una y otra vez, si había margen para mejorarlo. 1021 00:41:04,490 --> 00:41:07,610 E intuitivamente, ¿por qué es absoluta y lógicamente seguro 1022 00:41:07,610 --> 00:41:12,230 detener todo ese proceso una vez que no se ha hecho ningún intercambio 1023 00:41:12,230 --> 00:41:14,380 a través de la lista? 1024 00:41:14,380 --> 00:41:15,880 ¿Por qué es esa una conclusión segura? 1025 00:41:15,880 --> 00:41:18,760 1026 00:41:18,760 --> 00:41:20,520 Así que, si reviso la lista, 1027 00:41:20,520 --> 00:41:23,850 no, estos son buenos, estos son buenos, estos son buenos, 1028 00:41:23,850 --> 00:41:25,230 OK, ¿no querías tu número? 1029 00:41:25,230 --> 00:41:27,300 estos son buenos, estos son buenos, 1030 00:41:27,300 --> 00:41:30,720 ¿Cómo sé que no necesito hacer eso de nuevo? 1031 00:41:30,720 --> 00:41:31,994 PÚBLICO: Ya está ordenado. 1032 00:41:31,994 --> 00:41:33,660 DAVID: Ya está ordenado, ¿cierto? 1033 00:41:33,660 --> 00:41:35,189 Y sería un poco irracional, 1034 00:41:35,189 --> 00:41:37,980 si hemos recorrido la lista, buscando todo en pareja, 1035 00:41:37,980 --> 00:41:40,492 si no hay nada para intercambiar, incluso molestándonos en hacer esto otra vez, 1036 00:41:40,492 --> 00:41:43,200 ¿por qué esperaríamos resultados diferentes, si los mismos números 1037 00:41:43,200 --> 00:41:45,241 no se movieron y nosotros mismos no los movimos? 1038 00:41:45,241 --> 00:41:46,230 Entonces podemos detenernos. 1039 00:41:46,230 --> 00:41:48,930 Pero esto todavía nos invita a la pregunta, ¿qué tan costoso fue eso? 1040 00:41:48,930 --> 00:41:50,763 ¿Cuántos intercambios o comparaciones hicimos? 1041 00:41:50,763 --> 00:41:52,710 Regresaremos a esto dentro de poco. 1042 00:41:52,710 --> 00:41:56,381 El ordenamiento por selección puede expresarse incluso de forma resumida. 1043 00:41:56,381 --> 00:41:59,130 Y fue el segundo algoritmo que hicimos con nuestros ocho voluntarios 1044 00:41:59,130 --> 00:42:01,900 aquí, para i desde 0 hasta n-1. 1045 00:42:01,900 --> 00:42:04,600 Esta vez, en todo el camino hasta el final de la lista, 1046 00:42:04,600 --> 00:42:08,115 se encuentra el elemento más pequeño entre el i-ésimo y n-1 i-ésimo. 1047 00:42:08,115 --> 00:42:10,080 Entonces, entre esos dos intervalos, el inicio 1048 00:42:10,080 --> 00:42:14,670 de la lista y el final, intercambiamos el menor con el elemento i-ésimo. 1049 00:42:14,670 --> 00:42:15,730 Entonces, ¿qué significa esto? 1050 00:42:15,730 --> 00:42:17,950 Así que de nuevo, para i desde 0 hasta n-1. 1051 00:42:17,950 --> 00:42:22,410 Esto es un pseudocódigo que dice, inicia una variable i en la ubicación 0, 1052 00:42:22,410 --> 00:42:24,902 y haz esto hasta que iguale a n-1. 1053 00:42:24,902 --> 00:42:27,360 Hicimos esto hasta que recorrimos todo el camino a través de la lista. 1054 00:42:27,360 --> 00:42:28,560 ¿Qué me está diciendo que haga? 1055 00:42:28,560 --> 00:42:33,180 Encuentra el elemento más pequeño entre el i-ésimo elemento y el final de la lista. 1056 00:42:33,180 --> 00:42:34,530 n-1 nunca cambia, 1057 00:42:34,530 --> 00:42:36,090 siempre se sitúa al final de la lista, entonces 1058 00:42:36,090 --> 00:42:38,923 ¿Por qué caminé en la lista buscando, en última instancia, el número 1? 1059 00:42:38,923 --> 00:42:40,710 Y, ¿qué hice con el número 1? 1060 00:42:40,710 --> 00:42:42,800 Intercambiar el elemento más pequeño con el i-ésimo elemento. 1061 00:42:42,800 --> 00:42:46,050 Y pude haber dado un mal paso cuando realicé un intercambio pequeño, 1062 00:42:46,050 --> 00:42:48,720 pero lo arreglamos después. 1063 00:42:48,720 --> 00:42:51,780 Al final, removí al que ocupó la ubicación i-ésima 1064 00:42:51,780 --> 00:42:54,900 e hice espacio para el elemento que yo sabía que pertenecía allí. 1065 00:42:54,900 --> 00:42:57,690 Pude mezclarlos y hacer espacio para esos elementos, 1066 00:42:57,690 --> 00:43:00,450 que matemáticamente, es igual de bueno 1067 00:43:00,450 --> 00:43:03,150 se remueven y se trasladan toda la lista hasta el final, como lo hicimos. 1068 00:43:03,150 --> 00:43:04,620 Una vez que recorrí toda la lista, 1069 00:43:04,620 --> 00:43:06,370 no hubo un elemento más pequeño que encontrar. 1070 00:43:06,370 --> 00:43:09,071 Y como vimos, la lista está ordenada. 1071 00:43:09,071 --> 00:43:11,070 Tal vez esto es más rápido, tal vez sea más lento, 1072 00:43:11,070 --> 00:43:13,040 no es obvio inmediatamente. 1073 00:43:13,040 --> 00:43:16,560 Y tipo de ordenamiento por inserción, que surgió a través de los libros azules 1074 00:43:16,560 --> 00:43:18,750 en el piso, podría ser descrito como esto. 1075 00:43:18,750 --> 00:43:26,250 Para i, desde 1 hasta n-1, llama al 0-ésimo por el i-1 i-ésimo elemento 1076 00:43:26,250 --> 00:43:27,450 del lado ordenado, 1077 00:43:27,450 --> 00:43:30,270 eso es un trabalenguas, consideramos el lado izquierdo de nuestra lista 1078 00:43:30,270 --> 00:43:32,100 como el lado ordenado de la lista. 1079 00:43:32,100 --> 00:43:33,840 E inicialmente, no hay nada allí. 1080 00:43:33,840 --> 00:43:35,940 Tenemos cero elementos ordenados a nuestra izquierda, 1081 00:43:35,940 --> 00:43:37,710 y ocho elementos sin ordenar a nuestra derecha. 1082 00:43:37,710 --> 00:43:39,840 Ese tipo de ordenamiento describe la historia de cuando 1083 00:43:39,840 --> 00:43:41,670 tuvimos voluntarios y números aquí. 1084 00:43:41,670 --> 00:43:44,580 No había elementos ordenados, todo a mi derecha no estaba ordenado. 1085 00:43:44,580 --> 00:43:45,870 Eso es todo lo que dice. 1086 00:43:45,870 --> 00:43:47,070 Remueve el elemento i-ésimo. 1087 00:43:47,070 --> 00:43:49,290 Eso fue como elegir este cuaderno azul si 1088 00:43:49,290 --> 00:43:51,090 utilizáramos los libros azules en este ejemplo. 1089 00:43:51,090 --> 00:43:52,200 Entonces, ¿qué quiero hacer? 1090 00:43:52,200 --> 00:43:54,780 Insertarlos en orden en el lado ordenado. 1091 00:43:54,780 --> 00:43:57,972 Entonces, si este es el lado ordenado y este es el lado sin ordenar, 1092 00:43:57,972 --> 00:44:00,180 este es el equivalente que dice, toma ese cuaderno azul 1093 00:44:00,180 --> 00:44:01,770 y ponlo en la primera ubicación. 1094 00:44:01,770 --> 00:44:03,645 Podemos hacer un tipo de brecha visual para eso. 1095 00:44:03,645 --> 00:44:06,122 Ahora, este es el lado ordenado y este es el lado desordenado. 1096 00:44:06,122 --> 00:44:08,580 O, de manera equivalente, cuando estaba aquí abajo con los libros azules, 1097 00:44:08,580 --> 00:44:12,120 los libros en mis manos fueron el lado ordenado, los que estaban en el escenario 1098 00:44:12,120 --> 00:44:13,870 fueron el lado desordenado. 1099 00:44:13,870 --> 00:44:14,940 La misma idea. 1100 00:44:14,940 --> 00:44:16,440 ¿Qué ocurre después? 1101 00:44:16,440 --> 00:44:22,380 Entonces itero una ubicación siguiente, y remuevo el siguiente elemento, 1102 00:44:22,380 --> 00:44:26,160 y cualquier número que sea, ¿va a la izquierda 1103 00:44:26,160 --> 00:44:27,630 o va a la derecha? 1104 00:44:27,630 --> 00:44:29,652 Fue lo mismo que pasó en el escenario, 1105 00:44:29,652 --> 00:44:31,860 parece como si recogiera un tercer libro azul y decidiera, 1106 00:44:31,860 --> 00:44:33,150 ¿va entre estos libros? 1107 00:44:33,150 --> 00:44:34,680 ¿va debajo, va arriba? 1108 00:44:34,680 --> 00:44:37,300 Lo inserté en su ubicación apropiada. 1109 00:44:37,300 --> 00:44:41,160 En este ordenamiento por inserción tomamos cada número 1110 00:44:41,160 --> 00:44:43,922 según lo encontramos, y lidiamos con eso aquí y allá. 1111 00:44:43,922 --> 00:44:45,630 Tomamos el número y lidiamos con eso, entonces, 1112 00:44:45,630 --> 00:44:48,210 sabemos que este tiene que ir aquí, si pretendemos qué 1113 00:44:48,210 --> 00:44:49,740 los números se parezcan por un momento. 1114 00:44:49,740 --> 00:44:51,730 Así que eso sería insertarlo en la ubicación correcta, 1115 00:44:51,730 --> 00:44:52,860 como lo hice con los libros azules. 1116 00:44:52,860 --> 00:44:55,360 Tal vez este, oh, tal vez este uno es un número realmente pequeño, 1117 00:44:55,360 --> 00:44:57,060 y entonces lo inserto aquí. 1118 00:44:57,060 --> 00:45:00,240 Así que trato de lidiar con cada problema cuando lo encuentro, 1119 00:45:00,240 --> 00:45:02,700 pero se vuelve costoso, o muy molesto, 1120 00:45:02,700 --> 00:45:07,127 tener que mover todo esto fuera del camino 1121 00:45:07,127 --> 00:45:08,460 para abrirle paso a esos elementos. 1122 00:45:08,460 --> 00:45:10,750 Por eso que me aburrí con el ejemplo del libro azul, 1123 00:45:10,750 --> 00:45:12,541 porque se volvió muy tedioso 1124 00:45:12,541 --> 00:45:14,860 y estaba harto de buscar la ubicación correcta de todos los libros azules. 1125 00:45:14,860 --> 00:45:16,770 En resumen, estos tres algoritmos, 1126 00:45:16,770 --> 00:45:19,830 se expresaron de manera muy distinta, aunque todos ellos son 1127 00:45:19,830 --> 00:45:24,000 algo instintivos hasta que intentamos describir lo que nuestra intuición 1128 00:45:24,000 --> 00:45:27,210 ha hecho durante los últimos años 1129 00:45:27,210 --> 00:45:31,200 cuando ordenamos cosas en el mundo real, 1130 00:45:31,200 --> 00:45:34,559 y todo puede describirse en términos de estos algoritmos. 1131 00:45:34,559 --> 00:45:37,350 Así que estos algoritmos, e iniciamos esta conversación en la primera 1132 00:45:37,350 --> 00:45:38,070 lección, 1133 00:45:38,070 --> 00:45:40,410 todos tienen, en última instancia, algún tipo de tiempo de 1134 00:45:40,410 --> 00:45:44,280 ejecución asociado con ellos, parecido a cuánto tiempo toma hacer algo. 1135 00:45:44,280 --> 00:45:47,670 Y hablamos acerca del proceso de encontrar a Mike Smith en términos 1136 00:45:47,670 --> 00:45:48,990 de este gráfico bastante genérico. 1137 00:45:48,990 --> 00:45:51,420 No era muy matemático, ni muy sofisticado, solo 1138 00:45:51,420 --> 00:45:54,210 quería tener una idea de las relaciones, o compromisos, de espacio 1139 00:45:54,210 --> 00:45:55,510 y tiempo, por así decirlo. 1140 00:45:55,510 --> 00:45:58,770 Y así, en el eje x u horizontal, tuvimos el tamaño del problema, 1141 00:45:58,770 --> 00:46:00,720 como un número de páginas en la guía telefónica, 1142 00:46:00,720 --> 00:46:02,490 o número de personas en la guía telefónica, 1143 00:46:02,490 --> 00:46:05,490 y en el eje y o vertical, tuvimos la cantidad de tiempo 1144 00:46:05,490 --> 00:46:06,699 para resolver el problema. 1145 00:46:06,699 --> 00:46:08,490 Cuántos segundos, o cuántos cambios de página, 1146 00:46:08,490 --> 00:46:11,130 podríamos contar al usar cualquier unidad de medida que nos guste. 1147 00:46:11,130 --> 00:46:15,270 En el primer algoritmo para Mike Smith, cuando inicié con la primera página 1148 00:46:15,270 --> 00:46:19,400 y cambié, y cambié, y cambié, fue una línea recta, una relación lineal. 1149 00:46:19,400 --> 00:46:21,290 Una página más, un paso más. 1150 00:46:21,290 --> 00:46:22,580 Por lo tanto, es una línea recta. 1151 00:46:22,580 --> 00:46:25,580 En el siguiente algoritmo se buscó por pares, evocando a la primera lección. 1152 00:46:25,580 --> 00:46:26,959 Dos, cuatro, seis, ocho. 1153 00:46:26,959 --> 00:46:29,000 Eso aún es una línea recta, porque hay 1154 00:46:29,000 --> 00:46:33,740 una relación predecible entre número de páginas y número de segundos, 1155 00:46:33,740 --> 00:46:34,430 o cambios de página. 1156 00:46:34,430 --> 00:46:37,304 Son dos a uno en lugar de uno a uno, así que aún es una línea recta, 1157 00:46:37,304 --> 00:46:38,490 pero es inferior en la gráfica. 1158 00:46:38,490 --> 00:46:39,380 Es mejor. 1159 00:46:39,380 --> 00:46:43,150 Pero el mejor, por mucho, fue el enfoque de divide y vencerás. 1160 00:46:43,150 --> 00:46:43,650 ¿Correcto? 1161 00:46:43,650 --> 00:46:46,441 Y sin duda se sintió más rápido, es grandioso, porque fue intuitivo. 1162 00:46:46,441 --> 00:46:48,920 No fue tan fácil expresarlo en un pseudocódigo, 1163 00:46:48,920 --> 00:46:51,080 ya que fue uno de los más largos de hoy, 1164 00:46:51,080 --> 00:46:53,630 pero al menos nos dio una la respuesta rápidamente. 1165 00:46:53,630 --> 00:46:56,990 Este es logarítmico, en el sentido de que el logaritmo, 1166 00:46:56,990 --> 00:46:59,845 técnicamente es de base 2, si recordamos algunas de nuestras matemáticas, 1167 00:46:59,845 --> 00:47:02,720 es porque dividimos el problema a la mitad, y a la mitad, y a la mitad. 1168 00:47:02,720 --> 00:47:04,180 Y está bien si están incómodos con eso, 1169 00:47:04,180 --> 00:47:05,870 ni siquiera recuerdo lo qué es un logaritmo. 1170 00:47:05,870 --> 00:47:11,640 Por ahora, asumamos que el tiempo logarítmico tiene esta forma diferente, 1171 00:47:11,640 --> 00:47:13,730 que crece mucho más lento. 1172 00:47:13,730 --> 00:47:18,890 Podemos elegir log n/n, que al elegir entre dos algoritmos, 1173 00:47:18,890 --> 00:47:20,720 elegir el log n, o algo similar a eso, 1174 00:47:20,720 --> 00:47:24,150 porque será más pequeño, como lo podemos visualizar aquí. 1175 00:47:24,150 --> 00:47:26,510 Entonces, lo consideraremos similar al ordenamiento burbuja. 1176 00:47:26,510 --> 00:47:28,490 Existe un par de maneras en las que podemos ver esto. 1177 00:47:28,490 --> 00:47:30,865 Y de nuevo, el objetivo aquí no es ser muy matemático, 1178 00:47:30,865 --> 00:47:33,620 no comenzaremos a hacer pruebas, pero echaremos 1179 00:47:33,620 --> 00:47:36,620 un vistazo a algunos de los pasos en este algoritmo, 1180 00:47:36,620 --> 00:47:40,400 para tener una idea general de qué tan lento o tan rápido es un algoritmo. 1181 00:47:40,400 --> 00:47:41,690 Y de hecho, ese es el objetivo. 1182 00:47:41,690 --> 00:47:45,140 Existe una notación elegante que veremos y se denomina notación asintótica, 1183 00:47:45,140 --> 00:47:46,670 con caracteres griegos especiales. 1184 00:47:46,670 --> 00:47:48,290 Pero al final del día, solo intentamos 1185 00:47:48,290 --> 00:47:51,590 tener una idea general de que tan bueno o malo es un algoritmo, parecido 1186 00:47:51,590 --> 00:47:53,119 a lo que intentamos hacer con esta imagen. 1187 00:47:53,119 --> 00:47:55,160 Pero ahora lo haremos un poco más convencional, 1188 00:47:55,160 --> 00:47:56,840 como lo haría un especialista en sistemas. 1189 00:47:56,840 --> 00:48:01,340 Recordemos que en el ordenamiento burbuja comparamos a cada par de humanos 1190 00:48:01,340 --> 00:48:03,240 y se hizo un intercambio cuando no estaban ordenados, 1191 00:48:03,240 --> 00:48:04,370 y después lo repetimos, 1192 00:48:04,370 --> 00:48:05,630 y lo repetimos, y lo repetimos. 1193 00:48:05,630 --> 00:48:07,200 Y seguimos repasando la lista. 1194 00:48:07,200 --> 00:48:11,210 Eso puede ser cuantificado, como un tipo de análisis 1195 00:48:11,210 --> 00:48:12,810 de un número total de pasos. 1196 00:48:12,810 --> 00:48:15,050 Entonces, si tenemos n humanos frente a la habitación, 1197 00:48:15,050 --> 00:48:18,260 y queremos compararlos en parejas de izquierda a derecha, 1198 00:48:18,260 --> 00:48:20,450 ¿Cuántos pares posibles están ahí mientras camino 1199 00:48:20,450 --> 00:48:23,980 por primera vez a través de la lista? 1200 00:48:23,980 --> 00:48:30,204 Si existen n elementos, y los puedo regresar a dónde estaban. 1201 00:48:30,204 --> 00:48:32,620 ¿Cuántos pares hubo, ya que caminé de izquierda a derecha? 1202 00:48:32,620 --> 00:48:35,650 Comparé estos dos, estos dos, estos dos. 1203 00:48:35,650 --> 00:48:39,950 1204 00:48:39,950 --> 00:48:41,250 Sí, hay n menos uno, 1205 00:48:41,250 --> 00:48:42,250 específicamente siete. 1206 00:48:42,250 --> 00:48:44,833 Incluso si no estamos del todo seguros de a dónde vamos con esto, 1207 00:48:44,833 --> 00:48:48,140 si hay ocho asientos, este es uno, dos, tres, cuatro, cinco, seis, 1208 00:48:48,140 --> 00:48:48,861 siete, 1209 00:48:48,861 --> 00:48:49,860 y hay ocho en total. 1210 00:48:49,860 --> 00:48:51,600 Así que, eso es n-1. 1211 00:48:51,600 --> 00:48:53,720 Esa es la cantidad de comparaciones que pudimos hacer 1212 00:48:53,720 --> 00:48:55,040 la primera vez a través del ordenamiento burbuja. 1213 00:48:55,040 --> 00:48:57,623 Pero la primera vez que fui a través de la lista en tipo burbuja 1214 00:48:57,623 --> 00:48:59,180 ¿la lista se ordenó por completo? 1215 00:48:59,180 --> 00:49:00,290 No, tuvimos que hacerlo otra vez. 1216 00:49:00,290 --> 00:49:03,650 Sabíamos que 8 se reordenó hasta al final, así que fue bueno. 1217 00:49:03,650 --> 00:49:05,280 8 estaba en el lugar correcto. 1218 00:49:05,280 --> 00:49:08,220 Pero tuve que hacerlo de nuevo, y arreglar más problemas en el camino. 1219 00:49:08,220 --> 00:49:11,870 Pero la segunda vez, no tuve que recorrer toda la lista. 1220 00:49:11,870 --> 00:49:15,500 Para ser claro, ¿a quién no necesité ver? 1221 00:49:15,500 --> 00:49:18,240 A la última ubicación, u 8, en nuestro caso particular. 1222 00:49:18,240 --> 00:49:21,740 Así que la segunda vez a través de la lista de humanos, 1223 00:49:21,740 --> 00:49:23,550 solo tuve que hacer n-2 comparaciones. 1224 00:49:23,550 --> 00:49:24,050 ¿Correcto? 1225 00:49:24,050 --> 00:49:28,040 Porque puedo ignorar al número 8, al último humano, y solo lidiar 1226 00:49:28,040 --> 00:49:30,800 con los otros siete humanos que están mal ordenados. 1227 00:49:30,800 --> 00:49:34,130 Entonces, si quisiera ser quisquilloso, escribir esto, y contar 1228 00:49:34,130 --> 00:49:36,350 cuántos pasos, o cuántas comparaciones, hice, 1229 00:49:36,350 --> 00:49:37,740 podríamos generalizarlo así. 1230 00:49:37,740 --> 00:49:38,240 ¿Correcto? 1231 00:49:38,240 --> 00:49:42,920 Será (n - 1) + (n - 2) + (n - 3) + ... 1232 00:49:42,920 --> 00:49:46,070 O, más específicamente, 7 + 6 + 5 + 4, esto 1233 00:49:46,070 --> 00:49:49,280 es solo la fórmula elegante que dice lo mismo. 1234 00:49:49,280 --> 00:49:52,700 Ahora, no recuerdo todas las fórmulas del final de mi libro de matemáticas 1235 00:49:52,700 --> 00:49:54,440 bien, pero recuerdo esto. 1236 00:49:54,440 --> 00:49:57,650 En sus libros de física y de matemáticas, frecuentemente en la tapa dura, 1237 00:49:57,650 --> 00:50:00,830 vemos pequeñas anotaciones en las que las series de números 1238 00:50:00,830 --> 00:50:03,050 sirven para sumar o multiplicar. 1239 00:50:03,050 --> 00:50:06,290 Y resulta que esa suma puede 1240 00:50:06,290 --> 00:50:10,730 expresarse de manera resumida como n (n -1) todo dividido entre 2. 1241 00:50:10,730 --> 00:50:14,360 Eso es lo mismo, matemáticamente, como las largas series 1242 00:50:14,360 --> 00:50:16,220 que tenían punto, punto, punto. 1243 00:50:16,220 --> 00:50:19,370 Si multiplico esto al aplicar algo de álgebra, 1244 00:50:19,370 --> 00:50:22,611 como (n^2 - n) / 2. 1245 00:50:22,611 --> 00:50:25,610 Es un tipo de multiplicación como n^2/2 , 1246 00:50:25,610 --> 00:50:27,000 -n/2. 1247 00:50:27,000 --> 00:50:29,240 Entonces, si yo quisiera ser preciso, este 1248 00:50:29,240 --> 00:50:30,790 es el tiempo de ejecución del ordenamiento burbuja 1249 00:50:30,790 --> 00:50:34,080 que toma el número de pasos para ordenar a n personas. 1250 00:50:34,080 --> 00:50:34,580 ¿Por qué? 1251 00:50:34,580 --> 00:50:37,539 Porque solo conté la cantidad de comparaciones que hice. 1252 00:50:37,539 --> 00:50:39,830 Eso es, cuántas comparaciones necesita el ordenamiento burbuja. 1253 00:50:39,830 --> 00:50:41,782 Pero, esto se está volviendo tedioso, 1254 00:50:41,782 --> 00:50:43,740 y mis ojos ya comenzaron a ponerse vidriosos. 1255 00:50:43,740 --> 00:50:46,640 No quiero recordar estas fórmulas algebraicas. 1256 00:50:46,640 --> 00:50:49,580 Así que, intentemos un ejemplo para tener una idea de qué tan lento 1257 00:50:49,580 --> 00:50:50,770 o qué tan rápido es esto. 1258 00:50:50,770 --> 00:50:52,370 Supongamos que n fuera un millón. 1259 00:50:52,370 --> 00:50:55,910 No ocho, sino un millón personas, o un millón de números. 1260 00:50:55,910 --> 00:50:58,460 ¿Qué tan lento o qué tan rápido será el ordenamiento burbuja? 1261 00:50:58,460 --> 00:51:01,560 Bueno, si introducimos un millón, es como decir que n es un millón. 1262 00:51:01,560 --> 00:51:06,809 Es un millón al cuadrado, dividido entre 2, menos un millón dividido entre 2. 1263 00:51:06,809 --> 00:51:08,600 Porque en resumen, eso es todo. 1264 00:51:08,600 --> 00:51:10,820 Entonces, si hago esto, es un número realmente grande. 1265 00:51:10,820 --> 00:51:14,720 500 mil millones menos 500 mil. 1266 00:51:14,720 --> 00:51:18,680 Y en cualquier otro contexto, 500 mil es un número bastante grande. 1267 00:51:18,680 --> 00:51:23,120 Pero no es tanto cuando se resta de 500 mil millones, 1268 00:51:23,120 --> 00:51:29,780 porque todavía se obtienen 499,999,500,000 después de la resta. 1269 00:51:29,780 --> 00:51:33,770 Lo que quiere decir, que de esos dos términos, el de la izquierda contra el de 1270 00:51:33,770 --> 00:51:35,450 la derecha, ¿cuál es el más grande? 1271 00:51:35,450 --> 00:51:38,827 ¿El factor más dominante en la expresión matemática? 1272 00:51:38,827 --> 00:51:40,160 Es el de la izquierda, ¿verdad? 1273 00:51:40,160 --> 00:51:41,870 Ese es enormemente más grande. 1274 00:51:41,870 --> 00:51:45,440 Y de manera más general, n al cuadrado dividido entre 2 1275 00:51:45,440 --> 00:51:49,167 se siente como un resultado más grande que n dividido entre 2. 1276 00:51:49,167 --> 00:51:51,750 Y lo hemos visto con pruebas, por ejemplo, lo que no es una prueba, 1277 00:51:51,750 --> 00:51:54,590 pero al menos nos da una sensación del tamaño del programa, 1278 00:51:54,590 --> 00:51:57,230 o el número de comparaciones que hacemos. 1279 00:51:57,230 --> 00:52:01,084 Saben qué, si ese es el caso, si el factor dominante 1280 00:52:01,084 --> 00:52:03,500 es el de la izquierda, en nuestro caso, es el que tiene el cuadrado, 1281 00:52:03,500 --> 00:52:06,141 en concreto, es mucho más influyente 1282 00:52:06,141 --> 00:52:08,390 debido al número de comparaciones que haremos, 1283 00:52:08,390 --> 00:52:11,630 agitaremos nuestras manos hacia los términos de orden inferior, 1284 00:52:11,630 --> 00:52:13,850 los dividiremos entre 2 y solo diremos 1285 00:52:13,850 --> 00:52:17,360 algo así como, uf, este algoritmo parece algo como n al cuadrado. 1286 00:52:17,360 --> 00:52:19,330 Ahora quitaré el denominador, 1287 00:52:19,330 --> 00:52:21,413 le quitaré lo que estoy restando, 1288 00:52:21,413 --> 00:52:24,540 quitaré cualquier cosa que no sea el factor dominante, 1289 00:52:24,540 --> 00:52:28,500 qué es el término que contribuye a la mayor cantidad total de pasos 1290 00:52:28,500 --> 00:52:29,000 efectuados. 1291 00:52:29,000 --> 00:52:32,300 Generalmente, esto es lo que un especialista en sistemas describiría 1292 00:52:32,300 --> 00:52:34,730 como el tiempo de ejecución de este algoritmo. 1293 00:52:34,730 --> 00:52:36,770 Está en el orden de n al cuadrado. 1294 00:52:36,770 --> 00:52:39,995 No es n al cuadrado, pero está en el orden de n cuadrado. 1295 00:52:39,995 --> 00:52:42,620 Está bastante cerca, y es bastante bueno para una conversación 1296 00:52:42,620 --> 00:52:46,100 con otra persona razonable que quiera debatir si su algoritmo 1297 00:52:46,100 --> 00:52:48,380 es quizás mejor o peor que el nuestro. 1298 00:52:48,380 --> 00:52:51,160 A esto se le denominaría una notación de gran O. 1299 00:52:51,160 --> 00:52:56,360 La gran O se usa para el límite en el tiempo de ejecución de un algoritmo. 1300 00:52:56,360 --> 00:53:00,500 El significado del límite superior que consideraremos, en el peor de los casos, 1301 00:53:00,500 --> 00:53:02,780 ¿Cuánto tiempo tomará este algoritmo? 1302 00:53:02,780 --> 00:53:05,660 Bueno, tomará en el orden de n pasos al cuadrado, 1303 00:53:05,660 --> 00:53:08,300 Porque si la lista de los números no están ordenados inicialmente, 1304 00:53:08,300 --> 00:53:10,860 tenemos que hacer mucho trabajo para ordenarla. 1305 00:53:10,860 --> 00:53:14,720 Hay otros términos que podríamos poner en esos paréntesis. 1306 00:53:14,720 --> 00:53:17,240 Algunos algoritmos no están en el orden de n al cuadrado. 1307 00:53:17,240 --> 00:53:20,250 Algunos algoritmos son del orden de n log n, 1308 00:53:20,250 --> 00:53:24,380 algunos algoritmos están en el orden mismo de n, o log n, o incluso de 1, 1309 00:53:24,380 --> 00:53:26,297 donde 1 se refiere al tiempo constante. 1310 00:53:26,297 --> 00:53:28,130 Y de hecho, los resalté aquí, 1311 00:53:28,130 --> 00:53:32,060 hasta ahora hemos visto ejemplos sobre la marcha de todos estos. 1312 00:53:32,060 --> 00:53:34,100 Por ejemplo, ¿en qué algoritmo vimos 1313 00:53:34,100 --> 00:53:38,180 que su tiempo de ejecución es del orden de n? 1314 00:53:38,180 --> 00:53:38,960 ¿n pasos? 1315 00:53:38,960 --> 00:53:40,186 PÚBLICO: Búsqueda lineal. 1316 00:53:40,186 --> 00:53:41,310 DAVID: Búsqueda lineal. 1317 00:53:41,310 --> 00:53:43,680 Si tuviéramos que pensar en la búsqueda lineal, 1318 00:53:43,680 --> 00:53:46,804 o desde la primera lección, cuando busqué a Mike, 1319 00:53:46,804 --> 00:53:49,590 una página de agenda telefónica a la vez, es un algoritmo lineal. 1320 00:53:49,590 --> 00:53:53,280 Si existen n páginas, o n humanos, podría tomarme el orden de n pasos, 1321 00:53:53,280 --> 00:53:54,230 porque Mike Smith, 1322 00:53:54,230 --> 00:53:57,360 si S está hacia el final del abecedario, él podría estar por allí, 1323 00:53:57,360 --> 00:53:59,760 o al final de la agenda telefónica, o Dios no lo quiera, 1324 00:53:59,760 --> 00:54:01,860 su nombre inicia con Z, entonces 1325 00:54:01,860 --> 00:54:04,500 proseguiré todo el camino en la agenda telefónica. 1326 00:54:04,500 --> 00:54:06,690 Eso está en el orden de n pasos, 1327 00:54:06,690 --> 00:54:08,340 así que, esto podría ser lineal. 1328 00:54:08,340 --> 00:54:10,950 También vimos otro algoritmo, en amarillo, 1329 00:54:10,950 --> 00:54:13,680 la gran O de log n. 1330 00:54:13,680 --> 00:54:14,740 Lo vimos hace un momento. 1331 00:54:14,740 --> 00:54:18,990 ¿Cuál de nuestros algoritmos estaba en el orden de log n tiempo de ejecución? 1332 00:54:18,990 --> 00:54:20,210 Sí, la búsqueda binaria. 1333 00:54:20,210 --> 00:54:21,050 Divide y vencerás. 1334 00:54:21,050 --> 00:54:22,010 No lo llamamos, 1335 00:54:22,010 --> 00:54:24,600 no describimos la fórmula de esto en la primera lección, 1336 00:54:24,600 --> 00:54:26,180 pero así es como describiríamos el tiempo de ejecución. 1337 00:54:26,180 --> 00:54:28,400 No solo con una bonita imagen, pero con una expresión 1338 00:54:28,400 --> 00:54:29,540 así, que todos los humanos-- 1339 00:54:29,540 --> 00:54:31,456 al menos especialistas en sistemas, pueden estar de acuerdo. 1340 00:54:31,456 --> 00:54:32,834 Y en tiempo constante. 1341 00:54:32,834 --> 00:54:35,000 Lo gracioso aquí es porque desperdiciamos 1342 00:54:35,000 --> 00:54:37,220 términos que realmente no importaron, O de 1 no 1343 00:54:37,220 --> 00:54:39,470 significa un algoritmo que solo toma un paso. 1344 00:54:39,470 --> 00:54:43,190 Eso sería un número muy limitado de opciones para nuestros algoritmos, 1345 00:54:43,190 --> 00:54:50,196 pero significa, simbólicamente, un número constante de pasos. 1346 00:54:50,196 --> 00:54:51,320 Una cantidad constante de pasos. 1347 00:54:51,320 --> 00:54:55,280 ¿Qué es algo que podríamos tomar como una cantidad constante de pasos, 1348 00:54:55,280 --> 00:54:56,542 en un algoritmo? 1349 00:54:56,542 --> 00:54:58,762 1350 00:54:58,762 --> 00:55:01,470 Tal vez, como en la primera lección que tuvimos, el tonto ejemplo de la crema 1351 00:55:01,470 --> 00:55:02,550 de cacahuate y la mermelada. 1352 00:55:02,550 --> 00:55:04,800 ¿Cuál de los pasos de ese día pudo tomar la gran O 1353 00:55:04,800 --> 00:55:07,030 de 1 paso, un número constante de pasos? 1354 00:55:07,030 --> 00:55:10,060 1355 00:55:10,060 --> 00:55:13,120 Recuerdo uno, ¿inserte un cuchillo en el tarro? 1356 00:55:13,120 --> 00:55:14,120 Eso es como un paso. 1357 00:55:14,120 --> 00:55:16,828 Tal vez son dos, porque tendría que levantar el cuchillo 1358 00:55:16,828 --> 00:55:18,460 e insertarlo en el tarro. 1359 00:55:18,460 --> 00:55:20,830 Un paso, dos pasos, pero es un número constante. 1360 00:55:20,830 --> 00:55:25,460 Para nada nos informaron del número de pasos por el mismo algoritmo. 1361 00:55:25,460 --> 00:55:26,230 Solo ocurren. 1362 00:55:26,230 --> 00:55:27,244 Lo hacen en un solo paso. 1363 00:55:27,244 --> 00:55:29,410 Si hay alguna cantidad de otros algoritmos, 1364 00:55:29,410 --> 00:55:31,620 y dejamos en blanco uno al que regresamos, pero 1365 00:55:31,620 --> 00:55:33,910 consideremos lo contrario a esto, si quieren. 1366 00:55:33,910 --> 00:55:36,970 Si la gran O es nuestro límite superior en el tiempo de ejecución, resulta que 1367 00:55:36,970 --> 00:55:40,881 hay un vocabulario que discute el límite inferior del tiempo de ejecución de un 1368 00:55:40,881 --> 00:55:41,380 algoritmo. 1369 00:55:41,380 --> 00:55:44,870 Para nuestros propósitos, lo valoramos en el contexto del mejor de los casos. 1370 00:55:44,870 --> 00:55:48,940 En el mejor de los casos, ¿cuánto tiempo puede tomar un algoritmo? 1371 00:55:48,940 --> 00:55:52,930 Bien, esta es una omega mayúscula y se usa exactamente de la misma manera 1372 00:55:52,930 --> 00:55:57,040 para decir, omega de n al cuadrado, u omega de n, u omega de log n. 1373 00:55:57,040 --> 00:56:00,820 Así que, es la misma simbología, solo que se refiere a un límite inferior. 1374 00:56:00,820 --> 00:56:03,290 Se necesitan estos pocos pasos, o estos muchos pasos, 1375 00:56:03,290 --> 00:56:05,170 gran O, gran omega. 1376 00:56:05,170 --> 00:56:12,032 Por lo tanto, ¿qué algoritmo está, por así decirlo, en omega de 1? 1377 00:56:12,032 --> 00:56:17,720 ¿Qué algoritmo, en el mejor de los casos, podría tomar solo un paso? 1378 00:56:17,720 --> 00:56:23,022 Y quién dio hoy la mejor respuesta en la sala. 1379 00:56:23,022 --> 00:56:24,480 ¿Qué algoritmo podría tomar un paso? 1380 00:56:24,480 --> 00:56:24,979 Sí. 1381 00:56:24,979 --> 00:56:26,200 PÚBLICO: [INAUDIBLE] 1382 00:56:26,200 --> 00:56:29,500 DAVID: Sí, la búsqueda lineal podría tomar omega de un paso. 1383 00:56:29,500 --> 00:56:31,830 Porque en el mejor caso, está justo allí. 1384 00:56:31,830 --> 00:56:33,800 O en el caso de Chrissy, incluso si nuestro algoritmo 1385 00:56:33,800 --> 00:56:35,800 se ordena para elegir al azar, en el mejor de los casos, 1386 00:56:35,800 --> 00:56:38,230 está justo allí, el número 50. 1387 00:56:38,230 --> 00:56:41,950 Incluso su algoritmo, o nuestro algoritmo de búsqueda lineal, 1388 00:56:41,950 --> 00:56:44,920 y para el caso, incluso nuestro algoritmo de búsqueda binaria, 1389 00:56:44,920 --> 00:56:48,377 están en omega de 1, en al menos en el mejor de los casos. 1390 00:56:48,377 --> 00:56:49,960 Porque si tenemos suerte, terminamos. 1391 00:56:49,960 --> 00:56:51,370 Un paso. 1392 00:56:51,370 --> 00:56:56,630 Por el contrario, ¿qué es un algoritmo? que toma al menos n pasos? 1393 00:56:56,630 --> 00:56:58,536 ¿Cómo omega de n? 1394 00:56:58,536 --> 00:56:59,999 PÚBLICO: [INAUDIBLE] 1395 00:56:59,999 --> 00:57:01,290 DAVID: Esa es una buena idea. 1396 00:57:01,290 --> 00:57:02,990 Escuché que dijeron ordenamiento burbuja. 1397 00:57:02,990 --> 00:57:03,690 PÚBLICO: Sí. 1398 00:57:03,690 --> 00:57:04,398 DAVID: ¿Por qué? 1399 00:57:04,398 --> 00:57:06,530 PÚBLICO: Porque si ya están ordenados, 1400 00:57:06,530 --> 00:57:09,900 solo revisa cada comparación, y no hace ningún intercambio. 1401 00:57:09,900 --> 00:57:10,650 DAVID: Bien. 1402 00:57:10,650 --> 00:57:13,002 En el caso del ordenamiento burbuja, donde generalmente 1403 00:57:13,002 --> 00:57:15,210 tuvimos mucho más trabajo por hacer que encontrar algo fácilmente 1404 00:57:15,210 --> 00:57:19,710 con un algoritmo de búsqueda, el ordenamiento burbuja es un evento omega 1405 00:57:19,710 --> 00:57:22,440 que necesita de al menos el orden de n pasos, tal vez es n-1, 1406 00:57:22,440 --> 00:57:24,390 o n-2, pero está en el orden de n. 1407 00:57:24,390 --> 00:57:25,290 ¿Por qué? 1408 00:57:25,290 --> 00:57:29,250 Porque revisa a través de la lista al menos una vez, 1409 00:57:29,250 --> 00:57:30,480 ustedes saben qué, ¿para ser claro? 1410 00:57:30,480 --> 00:57:31,770 PÚBLICO: Que todos están en orden. 1411 00:57:31,770 --> 00:57:33,228 DAVID: Que están en orden. 1412 00:57:33,228 --> 00:57:36,810 Saben que como un efecto secundario de no intercambiar, 1413 00:57:36,810 --> 00:57:39,960 solo pueden determinar que la lista está ordenada en primer lugar 1414 00:57:39,960 --> 00:57:43,410 gastando al menos n pasos en ese proceso. 1415 00:57:43,410 --> 00:57:44,160 Excelente. 1416 00:57:44,160 --> 00:57:46,680 Hay otro uno, y este es el último, 1417 00:57:46,680 --> 00:57:50,010 por lo que si tienen un algoritmo o un escenario 1418 00:57:50,010 --> 00:57:54,044 donde el límite superior y el inferior es el mismo 1419 00:57:54,044 --> 00:57:57,210 también hay un símbolo para eso, pueden describir el algoritmo 1420 00:57:57,210 --> 00:57:59,400 en términos de notación theta. 1421 00:57:59,400 --> 00:58:02,460 Significa que theta de n, theta de log n, sean lo que sea, 1422 00:58:02,460 --> 00:58:05,549 significa que el límite superior y el inferior uno y el mismo. 1423 00:58:05,549 --> 00:58:08,590 Existen más formalidades para esto, y pueden bucear en la profundidad 1424 00:58:08,590 --> 00:58:09,750 de este curso de teoría. 1425 00:58:09,750 --> 00:58:13,350 Para nuestros propósitos, gran O y omega lo utilizarán de manera útil 1426 00:58:13,350 --> 00:58:18,150 para describir cuál es el tiempo de ejecución de un algoritmo 1427 00:58:18,150 --> 00:58:19,380 en realidad. 1428 00:58:19,380 --> 00:58:23,460 La gran O de n al cuadrado es lo más rápido que vimos hasta ahora. 1429 00:58:23,460 --> 00:58:27,180 Desafortunadamente, tienden a correr bastante lento. 1430 00:58:27,180 --> 00:58:29,776 Como lo vimos con un ejemplo de 500 mil millones de pasos solo 1431 00:58:29,776 --> 00:58:30,900 ordenan un millón de elementos. 1432 00:58:30,900 --> 00:58:32,790 Podemos hacer algo mucho mejor que eso, 1433 00:58:32,790 --> 00:58:35,370 como en la primera lección, cuando locamente propuse, 1434 00:58:35,370 --> 00:58:38,190 Supuse que su agenda telefónica tenía cerca de cuatro mil millones de páginas, 1435 00:58:38,190 --> 00:58:41,130 solo necesitamos 32 pasos al usar la búsqueda binaria, 1436 00:58:41,130 --> 00:58:44,980 en lugar de cuatro mil millones pasos al usar la búsqueda lineal. 1437 00:58:44,980 --> 00:58:48,630 Sería agradable si, después de toda de esta discusión de algoritmos 1438 00:58:48,630 --> 00:58:51,540 si introdujéramos estas formalidades, podríamos hacerlo mejor. 1439 00:58:51,540 --> 00:58:53,629 Nosotros podemos hacerlo mejor, pero 1440 00:58:53,629 --> 00:58:55,920 hicimos mucho para que estuviera listo, así que continuemos 1441 00:58:55,920 --> 00:58:56,970 y tomemos cinco minutos de descanso. 1442 00:58:56,970 --> 00:59:00,390 Regresaremos, cuando terminen de ejecutarse los tres 1443 00:59:00,390 --> 00:59:02,955 algoritmos que acabamos de ver. 1444 00:59:02,955 --> 00:59:04,230 Muy bien. 1445 00:59:04,230 --> 00:59:07,500 Echemos un vistazo rápido y veamos qué parecen estos algoritmos, 1446 00:59:07,500 --> 00:59:09,750 para que los comparemos contra algo 1447 00:59:09,750 --> 00:59:13,470 que yo afirmo que terminará por ser mejor. 1448 00:59:13,470 --> 00:59:14,040 OK. 1449 00:59:14,040 --> 00:59:18,920 Aquí tenemos un arreglo de números representado como barras verticales. 1450 00:59:18,920 --> 00:59:22,010 Una barra pequeña es un número pequeño, la barra alta es un gran número. 1451 00:59:22,010 --> 00:59:25,110 Es una manera acertada de visualizar lo que serían solo números 1452 00:59:25,110 --> 00:59:26,250 bastante pequeños. 1453 00:59:26,250 --> 00:59:29,880 Continuaré y haré la animación bastante rápido, 1454 00:59:29,880 --> 00:59:33,270 iré directo y elegiré, por ejemplo, ordenamiento burbuja. 1455 00:59:33,270 --> 00:59:36,180 Reduciré la velocidad un poco, 1456 00:59:36,180 --> 00:59:37,600 en interés de la discusión. 1457 00:59:37,600 --> 00:59:39,870 Entonces, veremos este algoritmo ordenamiento burbuja. 1458 00:59:39,870 --> 00:59:43,170 Que hace varios intercambios a través de la lista, tal como lo hice, 1459 00:59:43,170 --> 00:59:45,900 destacando en rosa dos vecinos a la vez, 1460 00:59:45,900 --> 00:59:47,670 y decide si realizar o no el intercambio, 1461 00:59:47,670 --> 00:59:51,180 al igual que nosotros, con nuestros ocho voluntarios, hicimos exactamente lo mismo. 1462 00:59:51,180 --> 00:59:54,400 Desde luego, con esta visualización, se puede hacer más rápido, 1463 00:59:54,400 --> 00:59:57,540 y podemos acelerar esto hasta el punto donde 1464 00:59:57,540 --> 01:00:01,800 se comienza a sentir el efecto de la reordenación, por lo que el número 1465 01:00:01,800 --> 01:00:06,540 más grande se reordena en la cima, que se sitúa a la derecha, como lo hizo el 8 1466 01:00:06,540 --> 01:00:07,930 cuando lo hicimos en papel. 1467 01:00:07,930 --> 01:00:09,226 Esto es el ordenamiento burbuja. 1468 01:00:09,226 --> 01:00:11,850 Podríamos ver esto por bastante tiempo, y en cierto sentido 1469 01:00:11,850 --> 01:00:12,930 es un poco fascinante. 1470 01:00:12,930 --> 01:00:14,931 Pero en otro sentido, es bastante decepcionante, 1471 01:00:14,931 --> 01:00:17,180 porque al final de la día, todo lo que obtendremos 1472 01:00:17,180 --> 01:00:19,620 es un grupo de barras ordenadas, que van de las barras cortas a las grandes. 1473 01:00:19,620 --> 01:00:22,050 Tal vez la conclusión es que este algoritmo 1474 01:00:22,050 --> 01:00:24,324 se detiene por una buena cantidad de tiempo, 1475 01:00:24,324 --> 01:00:27,240 a pesar de que se ejecuta esto a la velocidad más rápida, porque solo 1476 01:00:27,240 --> 01:00:30,300 arregla, en el mejor de los casos, un número a la vez. 1477 01:00:30,300 --> 01:00:33,570 Quizás algunos otros mejoren, pero solo nos movemos todo el camino 1478 01:00:33,570 --> 01:00:35,040 hasta el final de un número a la vez. 1479 01:00:35,040 --> 01:00:39,210 Y tenemos que regresar, regresar, regresar, y hacer más trabajo. 1480 01:00:39,210 --> 01:00:42,990 Será muy poco satisfactorio detenerlo, pero regresemos al azar. 1481 01:00:42,990 --> 01:00:46,410 Ahora, si elegimos, por ejemplo, ordenamiento por selección, 1482 01:00:46,410 --> 01:00:48,790 veremos que el algoritmo funciona un poco diferente. 1483 01:00:48,790 --> 01:00:50,677 Lo detendré un poco. 1484 01:00:50,677 --> 01:00:53,010 Lo que ahora hace, es un poco menos obvio, 1485 01:00:53,010 --> 01:00:57,150 busca a través de la lista el siguiente elemento más pequeño, 1486 01:00:57,150 --> 01:00:59,430 y lo coloca al inicio de la lista. 1487 01:00:59,430 --> 01:01:00,669 todo el camino a la izquierda. 1488 01:01:00,669 --> 01:01:02,460 Así que busca, busca, y busca, 1489 01:01:02,460 --> 01:01:07,050 y resalta en rojo el descubrimiento más reciente 1490 01:01:07,050 --> 01:01:07,965 el elemento más pequeño. 1491 01:01:07,965 --> 01:01:10,090 Tan pronto como se sitúa hasta el final de la lista, 1492 01:01:10,090 --> 01:01:13,340 el elemento más pequeño se moverá todo el camino a la izquierda. 1493 01:01:13,340 --> 01:01:16,380 Esto es algo contrario al ordenamiento burbuja, 1494 01:01:16,380 --> 01:01:18,370 mueve todos los elementos más pequeños a la izquierda. 1495 01:01:18,370 --> 01:01:19,480 Sin embargo, esto es arbitrario. 1496 01:01:19,480 --> 01:01:21,870 Podríamos reordenar los elementos pequeños solamente al revertir 1497 01:01:21,870 --> 01:01:24,000 el orden de nuestras operaciones, podríamos ordenar desde el más grande 1498 01:01:24,000 --> 01:01:25,374 al más pequeño, eso es irrelevante. 1499 01:01:25,374 --> 01:01:29,220 Solo por la convención humana tendemos a clasificar de menor a mayor, al menos 1500 01:01:29,220 --> 01:01:30,630 en ejemplos como este. 1501 01:01:30,630 --> 01:01:34,427 Podemos acelerarlo, pero no hace exactamente el efecto de la misma 1502 01:01:34,427 --> 01:01:37,260 comparación, y todo lo que hacemos es una redada buscando dentro de la lista 1503 01:01:37,260 --> 01:01:41,290 el más pequeño, buscando el más pequeño, buscando el más pequeño. 1504 01:01:41,290 --> 01:01:45,550 Y de esta manera, construirá del corto al alto. 1505 01:01:45,550 --> 01:01:48,690 Proseguiré y haré más tiempo, esta vez con el ordenamiento por inserción, 1506 01:01:48,690 --> 01:01:51,700 y lo frenaré. 1507 01:01:51,700 --> 01:01:55,060 Lo que hacemos aquí es lo siguiente. 1508 01:01:55,060 --> 01:01:59,730 Identificamos el siguiente elemento, y después lo insertamos en su ubicación 1509 01:01:59,730 --> 01:02:03,570 que pertenece a la "mitad ordenada" de la lista. 1510 01:02:03,570 --> 01:02:06,840 Recuerden que en general describo a las cosas de la izquierda como ordenadas, 1511 01:02:06,840 --> 01:02:09,960 las de la derecha como desordenadas, y la implicación 1512 01:02:09,960 --> 01:02:13,020 de que a pesar de que los números de la izquierda 1513 01:02:13,020 --> 01:02:17,370 están ordenados, cuando encuentro un número del área desordenada, 1514 01:02:17,370 --> 01:02:20,520 debería trasladar las cosas de un sitio a otro y mezclarlas. 1515 01:02:20,520 --> 01:02:23,610 Y a diferencia de la copia que hicimos en persona, 1516 01:02:23,610 --> 01:02:27,262 antes de tomar la música del estante y moverla aquí, 1517 01:02:27,262 --> 01:02:28,470 no es realmente legítimo. 1518 01:02:28,470 --> 01:02:28,970 ¿Correcto? 1519 01:02:28,970 --> 01:02:30,540 Este es el valor de estos disparates. 1520 01:02:30,540 --> 01:02:33,190 No debería tener acceso a esta memoria. 1521 01:02:33,190 --> 01:02:36,150 Entonces, ¿qué fue más legítimo con nuestro ocho humanos?, 1522 01:02:36,150 --> 01:02:38,640 ¿El hecho de que nuestros voluntarios hicieron el trabajo físico 1523 01:02:38,640 --> 01:02:40,170 de mover esos números? 1524 01:02:40,170 --> 01:02:42,940 También ese fue el trabajo de nivel bajo que la computadora hace. 1525 01:02:42,940 --> 01:02:47,730 Aquí lo vemos aún más, ya sea lento o rápido. 1526 01:02:47,730 --> 01:02:49,830 Se insertaron en la ubicación apropiada. 1527 01:02:49,830 --> 01:02:51,840 Así que, ¿el caso puntual de estos elementos pequeños? 1528 01:02:51,840 --> 01:02:56,100 Tenemos que hacer una gran cantidad de trabajo para encontrar su ubicación, 1529 01:02:56,100 --> 01:02:59,260 hasta que finalmente, la encontramos y hacemos lo mismo. 1530 01:02:59,260 --> 01:03:01,980 Todo esto tiene algunos puntos a favor y en contra. 1531 01:03:01,980 --> 01:03:05,670 Pero con el ordenamiento por mezcla, podemos hacerlo aún mejor. 1532 01:03:05,670 --> 01:03:07,990 Un algoritmo con el nombre de ordenamiento por mezcla. 1533 01:03:07,990 --> 01:03:12,120 Pero para hacerlo mejor, necesitamos un nuevo ingrediente, formalmente 1534 01:03:12,120 --> 01:03:15,210 definido, como un tipo de ordenamiento por ventaja, pero no por nombre. 1535 01:03:15,210 --> 01:03:19,860 Para hacer esto, tomaré un poco del código, en CS50 IDE, 1536 01:03:19,860 --> 01:03:23,190 un programa llamado sigma-0.c. 1537 01:03:23,190 --> 01:03:25,930 Y veremos la interconexión en un momento. 1538 01:03:25,930 --> 01:03:28,410 Notemos en este programa lo siguiente. 1539 01:03:28,410 --> 01:03:31,860 Tenemos la función main, cuyo propósito en la vida 1540 01:03:31,860 --> 01:03:33,842 es obtener como resultado un número entero positivo del usuario, 1541 01:03:33,842 --> 01:03:35,550 y molestarlo una y otra vez 1542 01:03:35,550 --> 01:03:38,250 y otra vez, hasta que coopere y proporcione un número entero positivo. 1543 01:03:38,250 --> 01:03:40,620 Eso en lo que hace el bucle mientras es frecuentemente útil. 1544 01:03:40,620 --> 01:03:42,240 Y luego, ¿qué hacemos con eso? 1545 01:03:42,240 --> 01:03:46,680 Simplemente, pasamos ese valor n, que el humano escribió, 1546 01:03:46,680 --> 01:03:49,237 por medio de get int, a una función llamada sigma. 1547 01:03:49,237 --> 01:03:52,320 Sigma es como el carácter griego, o es parecida a la letra mayúscula E. 1548 01:03:52,320 --> 01:03:54,900 en general significa, en matemáticas, una suma de muchos números. 1549 01:03:54,900 --> 01:03:56,680 La suma de un grupo de números. 1550 01:03:56,680 --> 01:04:00,720 Esta es función denominada sigma, cuyo propósito en la vida 1551 01:04:00,720 --> 01:04:03,810 es sumar todos los números del 0 hasta n, 1552 01:04:03,810 --> 01:04:05,730 o de manera equivalente, de 1 hasta n. 1553 01:04:05,730 --> 01:04:09,100 Así, 1 más 2 más 3 más 4 más, ta-ta-ta, n, lo que sea que n 1554 01:04:09,100 --> 01:04:10,090 resulte ser. 1555 01:04:10,090 --> 01:04:12,940 Y luego lo imprimimos por medio de printf. 1556 01:04:12,940 --> 01:04:16,290 Ahora, ejecutaré este programa para dejar muy en claro lo que está pasando. 1557 01:04:16,290 --> 01:04:21,460 Y puedo hacer esto, por supuesto, en mi directorio fuente tres de hoy, 1558 01:04:21,460 --> 01:04:29,070 make sigma0, Enter, ./sigma0, Positive integer, será 2. 1559 01:04:29,070 --> 01:04:32,730 Según esa definición, debería sumar 0 más 1 más 2, entonces 1 1560 01:04:32,730 --> 01:04:34,090 más 2, debería ser 3, 1561 01:04:34,090 --> 01:04:35,427 así que debería ver 3 1562 01:04:35,427 --> 01:04:36,260 y de hecho, veo 3. 1563 01:04:36,260 --> 01:04:39,120 Hagamos uno más, si añado tres números, 1564 01:04:39,120 --> 01:04:43,790 esto debería ser 1 más 2 más 3, entonces, eso es 1, son 6 en total 1565 01:04:43,790 --> 01:04:44,570 y así sucesivamente. 1566 01:04:44,570 --> 01:04:46,520 Y aumentan rápidamente. 1567 01:04:46,520 --> 01:04:49,040 Si pongo 50, entonces llegaremos a los miles. 1568 01:04:49,040 --> 01:04:50,360 Eso es todo lo que hace. 1569 01:04:50,360 --> 01:04:51,470 Pero ¿cómo lo hace? 1570 01:04:51,470 --> 01:04:53,761 Bueno, existen muchas maneras, 1571 01:04:53,761 --> 01:04:56,797 pero si aprovechamos las técnicas que conocemos, 1572 01:04:56,797 --> 01:04:58,130 podríamos hacerlo mediante un ciclo for. 1573 01:04:58,130 --> 01:05:00,950 De todas las herramientas en nuestro kit, esa es una de las que más hemos usado. 1574 01:05:00,950 --> 01:05:02,730 ¿y cómo la uso aquí? 1575 01:05:02,730 --> 01:05:05,570 Primero declaramos una variable llamada sum y la iniciamos en 0, 1576 01:05:05,570 --> 01:05:07,130 porque aún no he hecho ningún trabajo. 1577 01:05:07,130 --> 01:05:11,810 Tengo un bucle for donde i es igual a 1 hasta m, for(i = 1; i <= m) 1578 01:05:11,810 --> 01:05:12,310 ¿Por qué m? 1579 01:05:12,310 --> 01:05:13,220 Bueno, porque 1580 01:05:13,220 --> 01:05:17,060 recordemos que cuando hacemos nuestra propia función, ya sea en Scratch o en C, 1581 01:05:17,060 --> 01:05:19,970 podemos decidir cómo le llamaremos a sus entradas, 1582 01:05:19,970 --> 01:05:22,100 es decir, a sus argumentos o parámetros, como se les conoce. 1583 01:05:22,100 --> 01:05:24,830 Únicamente para que esto quede claro, lo llamé m, incluso 1584 01:05:24,830 --> 01:05:26,330 cuando, por lo general, hemos usado n. 1585 01:05:26,330 --> 01:05:28,080 Lo podría haber llamado de cualquier manera, 1586 01:05:28,080 --> 01:05:29,795 solamente quería dejar muy en claro que es una variable diferente. 1587 01:05:29,795 --> 01:05:31,550 Más o menos en una semana veremos más al respecto. 1588 01:05:31,550 --> 01:05:36,350 Solo estoy contando de uno hasta m y sumando cualquiera que sea el valor de i. 1589 01:05:36,350 --> 01:05:38,360 Ahora, como una revisión rápida ¿por qué no 1590 01:05:38,360 --> 01:05:42,904 uso sum ++, como lo haría en este tipo de casos? 1591 01:05:42,904 --> 01:05:45,320 PÚBLICO: Porque no lo estás incrementando por [INAUDIBLE]... 1592 01:05:45,320 --> 01:05:46,195 DAVID: Exacto. 1593 01:05:46,195 --> 01:05:48,950 No solo lo incremento por 1, lo incremento por 1, luego por 2, 1594 01:05:48,950 --> 01:05:50,760 por 3, por 4, y así sucesivamente. 1595 01:05:50,760 --> 01:05:52,593 De modo que para contar necesito este bucle y 1596 01:05:52,593 --> 01:05:56,420 también necesito incluir i en la suma, no solo un ++, en este caso 1597 01:05:56,420 --> 01:05:57,800 y posteriormente regreso al sum. 1598 01:05:57,800 --> 01:06:00,030 Así, este es un ejemplo de una abstracción. 1599 01:06:00,030 --> 01:06:01,820 Como, ahora tengo un función llamada sigma, 1600 01:06:01,820 --> 01:06:03,980 al igual que en matemáticas, representamos el símbolo sigma como 1601 01:06:03,980 --> 01:06:05,750 una gran letra mayúscula que indica, suma todos estos números juntos, 1602 01:06:05,750 --> 01:06:07,400 tengo una función en C que hace lo mismo. 1603 01:06:07,400 --> 01:06:10,790 Ahora, puedo llamar esa función desde la parte superior de mi código 1604 01:06:10,790 --> 01:06:12,230 e imprimirá la respuesta. 1605 01:06:12,230 --> 01:06:15,710 Pero sucede que esta sencilla función se presta 1606 01:06:15,710 --> 01:06:20,570 para un buen ejemplo de otra técnica de programación, algo llamado recursión. 1607 01:06:20,570 --> 01:06:23,120 En CS50 no tendremos demasiadas oportunidades 1608 01:06:23,120 --> 01:06:26,077 para aplicar esta técnica, pero lo haremos hacia el final del semestre, 1609 01:06:26,077 --> 01:06:28,910 aunque la usarán todo el tiempo si toman una clase como CS51. 1610 01:06:28,910 --> 01:06:31,059 Si utilizan otro tipo de lenguaje de programación, 1611 01:06:31,059 --> 01:06:32,600 utilizarán esta técnica muy frecuentemente. 1612 01:06:32,600 --> 01:06:36,140 Se llama recursión y así es como se ve. 1613 01:06:36,140 --> 01:06:38,270 Permítanme continuar y abrir otro archivo que se encuentra 1614 01:06:38,270 --> 01:06:41,370 disponible en el sitio web del curso y se llama sigma 1. 1615 01:06:41,370 --> 01:06:45,390 Observen que la función main es la misma. 1616 01:06:45,390 --> 01:06:46,850 La función main es la misma. 1617 01:06:46,850 --> 01:06:49,674 Y de hecho, sigue llamando a la función que conocemos como sigma, 1618 01:06:49,674 --> 01:06:51,590 luego utiliza a printf e imprime la respuesta. 1619 01:06:51,590 --> 01:06:53,460 En eso no hay ninguna diferencia. 1620 01:06:53,460 --> 01:06:58,740 Pero en el resto del programa, lo que es diferente es el código para sigma. 1621 01:06:58,740 --> 01:07:00,560 Entonces ¿qué ocurre aquí? 1622 01:07:00,560 --> 01:07:03,616 Todavía toma como entrada a un entero llamado m. 1623 01:07:03,616 --> 01:07:05,990 Lo que es bueno, porque necesito saber cuál es el valor de sum. 1624 01:07:05,990 --> 01:07:08,390 Al igual que antes, nos devuelve un entero. 1625 01:07:08,390 --> 01:07:10,790 Y sorprendentemente tiene algo como 1626 01:07:10,790 --> 01:07:13,730 ¿qué? ¿cuatro líneas de código más algunas llaves? 1627 01:07:13,730 --> 01:07:16,190 e incluso esas líneas de código son súper cortas, 1628 01:07:16,190 --> 01:07:19,767 tampoco hay variables adicionales y hay una lógica absurda y extraña aquí. 1629 01:07:19,767 --> 01:07:21,850 Pero antes que nada, veamos qué es lo que está haciendo. 1630 01:07:21,850 --> 01:07:27,170 En la línea 23 digo, si m es menor o igual a 0, devuelve 0. 1631 01:07:27,170 --> 01:07:28,740 Ahora, ¿por qué esto tiene sentido? 1632 01:07:28,740 --> 01:07:31,910 Bueno, solo quiero mantener a los números positivos, o a los números no negativos, 1633 01:07:31,910 --> 01:07:33,500 que van de 0 hasta m. 1634 01:07:33,500 --> 01:07:35,930 De modo que solo necesito verificar si hay algún error allí ¿cierto? 1635 01:07:35,930 --> 01:07:39,292 Si una persona, de alguna manera, pone en esta función un -50 o algo así, 1636 01:07:39,292 --> 01:07:42,250 no quiero que la función se vuelva loca y tenga un comportamiento impredecible, 1637 01:07:42,250 --> 01:07:45,110 solo quiero que devuelva un 0, en caso de error 1638 01:07:45,110 --> 01:07:48,780 o cuando el número sea muy pequeño, o incluso menor como para ser 0. 1639 01:07:48,780 --> 01:07:50,362 A esto le voy a llamar un planteamiento básico. 1640 01:07:50,362 --> 01:07:52,070 Es solo, como este examen médico, como 1641 01:07:52,070 --> 01:07:57,260 no dejes que las matemáticas vayan más allá de este punto, de 0 o menos. 1642 01:07:57,260 --> 01:08:02,750 Lo más sorprendente si nos acercamos al código, es que el programa completo 1643 01:08:02,750 --> 01:08:05,450 en realidad se resume en una línea. 1644 01:08:05,450 --> 01:08:07,200 Pero ¿qué está pasando aquí? 1645 01:08:07,200 --> 01:08:11,150 Obtengo una respuesta a partir sigma. 1646 01:08:11,150 --> 01:08:15,050 Pero curiosamente, mi respuesta se determina en relación a sí misma, 1647 01:08:15,050 --> 01:08:16,550 lo cual, por lo general, es una mala idea. 1648 01:08:16,550 --> 01:08:17,050 ¿Cierto? 1649 01:08:17,050 --> 01:08:18,830 Es como si en inglés, tratáramos de definir 1650 01:08:18,830 --> 01:08:20,689 una palabra utilizando esa misma palabra en la definición, 1651 01:08:20,689 --> 01:08:22,399 usualmente alguien nos regañará por eso, porque no es 1652 01:08:22,399 --> 01:08:25,040 del todo útil usar una palabra en la definición de esa misma palabra. 1653 01:08:25,040 --> 01:08:28,100 A primera vista, la recursión se trata de la misma idea. 1654 01:08:28,100 --> 01:08:33,439 Estamos utilizando la misma función para resolver un problema que 1655 01:08:33,439 --> 01:08:36,875 en primer lugar se supone, debe resolverse por esa misma función. 1656 01:08:36,875 --> 01:08:38,000 Pero, ¿qué quiero decir con esto? 1657 01:08:38,000 --> 01:08:42,080 Main está llamando a sigma y ​​eso significa que el código 1658 01:08:42,080 --> 01:08:44,670 que hemos estado mirando, aquí abajo, se ejecuta. 1659 01:08:44,670 --> 01:08:47,630 Luego, vamos a suponer que llegamos a esta línea del código, 1660 01:08:47,630 --> 01:08:50,060 lo que la recursión nos permite hacer en este caso 1661 01:08:50,060 --> 01:08:53,377 es tomar un bocado del problema, y luego dárselo a alguien más 1662 01:08:53,377 --> 01:08:54,960 para que resuelva el resto del problema. 1663 01:08:54,960 --> 01:08:56,330 ¿qué queremos decir con eso? 1664 01:08:56,330 --> 01:09:00,260 Bueno, sigma, de nuevo, es este proceso de sumar todos los números entre 0 1665 01:09:00,260 --> 01:09:01,680 y algún número m. 1666 01:09:01,680 --> 01:09:03,920 Así, 1 más 2 más 3 más ta-ta-ta. 1667 01:09:03,920 --> 01:09:05,300 Pero ¿saben algo? 1668 01:09:05,300 --> 01:09:08,729 No quiero hacer todo ese trabajo, ya que lo hice en la versión 0 con mi bucle for, 1669 01:09:08,729 --> 01:09:10,670 haré solo una parte de ese trabajo. 1670 01:09:10,670 --> 01:09:11,939 ¿Y cómo hago eso? 1671 01:09:11,939 --> 01:09:17,359 Bueno, saben algo, cuando preguntaron ¿cuál es la suma de 0 hasta m? 1672 01:09:17,359 --> 01:09:21,620 Seré algo redundante al respecto y sería algo como, bueno, 1673 01:09:21,620 --> 01:09:23,420 es la respuesta de, 1674 01:09:23,420 --> 01:09:28,310 la respuesta es m, el mayor número que me dieron, más la suma de todo 1675 01:09:28,310 --> 01:09:30,240 lo que está abajo. 1676 01:09:30,240 --> 01:09:30,770 ¿Cierto? 1677 01:09:30,770 --> 01:09:34,880 Por lo que, si pasamos el número 10, esto es como decir, bueno, sigma de 10 1678 01:09:34,880 --> 01:09:37,910 es 10 más sigma de nueve y una especie de déjenme en paz, 1679 01:09:37,910 --> 01:09:39,830 no quiero hacer el resto de las matemáticas. 1680 01:09:39,830 --> 01:09:45,050 Pero, como llamamos de nuevo a la misma función, eso está bien. 1681 01:09:45,050 --> 01:09:47,090 Una función puede llamarse a sí misma, porque si 1682 01:09:47,090 --> 01:09:51,170 pensamos hacia dónde va la historia, ahora en esta historia, sigma se llama 1683 01:09:51,170 --> 01:09:52,640 con sigma de 9. 1684 01:09:52,640 --> 01:09:53,720 ¿Qué es lo que hace el código? 1685 01:09:53,720 --> 01:09:59,180 Bueno, sigma de nueve nos devuelve a 9 más cualquiera que sea sigma de 8. 1686 01:09:59,180 --> 01:10:00,830 Entonces, no resolvemos todo el problema. 1687 01:10:00,830 --> 01:10:03,840 Estamos devolviendo un 10, más un 9 1688 01:10:03,840 --> 01:10:06,930 y si continuamos así, más un 8, más un 7, más un 6. 1689 01:10:06,930 --> 01:10:09,110 Pero no vamos a hacer esto para siempre. 1690 01:10:09,110 --> 01:10:13,250 Aunque estoy usando sigma en la implementación de mi respuesta, ¿en cuáles 1691 01:10:13,250 --> 01:10:15,917 circunstancias no estaré llamando a sigma? 1692 01:10:15,917 --> 01:10:17,140 PÚBLICO: Si m es igual a 0. 1693 01:10:17,140 --> 01:10:20,390 DAVID MALAN: Si m es igual, o es menor que 0, lo cual no debería suceder, 1694 01:10:20,390 --> 01:10:24,200 pero me aseguraré de que no se pueda con el menor o igual que, 1695 01:10:24,200 --> 01:10:28,820 En algún momento me preguntarán, ¿cuánto es sigma de 0? 1696 01:10:28,820 --> 01:10:34,430 Y no voy a complicarme al respecto, lo único que diré es 0. 1697 01:10:34,430 --> 01:10:38,532 De ese modo no seguiré "pasando la pelota" para esa misma función, 1698 01:10:38,532 --> 01:10:41,490 a pesar de que toma un tiempo llegar a este punto en la historia, 1699 01:10:41,490 --> 01:10:44,390 debido a que decimos 10 más sigma de 9, sigma de 9 1700 01:10:44,390 --> 01:10:48,212 es 9 más sigma de 8, el cual es sigma de 8 más sigma de 7, 1701 01:10:48,212 --> 01:10:49,920 como si continuaran saliendo y saliendo y saliendo. 1702 01:10:49,920 --> 01:10:51,920 Pero es una especie de regulación mental, por así decirlo, 1703 01:10:51,920 --> 01:10:54,290 es como en un video en nuestro navegador, todos esos números 1704 01:10:54,290 --> 01:10:56,490 que nos devuelven, uno a la vez, 1705 01:10:56,490 --> 01:10:58,910 los cuales técnicamente se suman juntos 1706 01:10:58,910 --> 01:11:02,600 para nosotros por el programa con el operador +, el último número que 1707 01:11:02,600 --> 01:11:05,960 nos van a devolver es el cero y en este punto, todos los signos más 1708 01:11:05,960 --> 01:11:08,630 pueden simplemente entrar y devolvernos 1709 01:11:08,630 --> 01:11:11,340 cualquier número que estemos buscando. 1710 01:11:11,340 --> 01:11:15,560 Entonces, la recursión es la acción de una función que se llama a sí misma, 1711 01:11:15,560 --> 01:11:21,440 lo cual es muy, muy, muy malo, a menos que tengamos un planteamiento que asegure que 1712 01:11:21,440 --> 01:11:24,860 mientras tomamos un bocado del problema, 1713 01:11:24,860 --> 01:11:27,920 lo atenderemos con un caso especial, por así decirlo, 1714 01:11:27,920 --> 01:11:31,760 un planteamiento básico, una pequeña pieza del rompecabezas y que solo 1715 01:11:31,760 --> 01:11:33,830 devolverá una respuesta hardcoded, para asegurarnos de que esto 1716 01:11:33,830 --> 01:11:36,980 no ocurrirá muchas veces, de manera infinita. 1717 01:11:36,980 --> 01:11:42,780 ¿Alguna pregunta sobre este principio, de una función capaz de llamarse a sí misma? 1718 01:11:42,780 --> 01:11:43,280 Sí. 1719 01:11:43,280 --> 01:11:46,521 PÚBLICO: ¿El planteamiento básico aquí fue cuando m es igual a 0? 1720 01:11:46,521 --> 01:11:49,520 DAVID: Cuando m es igual o menor que 0, solo para estar seguros. 1721 01:11:49,520 --> 01:11:51,830 Pero sí, cuando m es igual a cero. 1722 01:11:51,830 --> 01:11:53,700 En efecto. 1723 01:11:53,700 --> 01:11:54,720 Veamos. 1724 01:11:54,720 --> 01:11:57,720 Si están cómodos, al menos con el hecho de, ¡oh! y ahora 1725 01:11:57,720 --> 01:12:00,690 aquí tenemos un poco de buen humor nerd, 1726 01:12:00,690 --> 01:12:03,357 si van a Google.com y supongamos que se preguntan, 1727 01:12:03,357 --> 01:12:06,190 se están preguntando qué es la recursión, en especial algunas horas después de esto. 1728 01:12:06,190 --> 01:12:13,429 Bueno, pueden buscarlo en Google y los especialistas en sistemas de Google, 1729 01:12:13,429 --> 01:12:13,970 ahí lo tienen. 1730 01:12:13,970 --> 01:12:16,790 OK si se están riendo, lo entienden, lo cual es genial. 1731 01:12:16,790 --> 01:12:18,370 Entonces esto es la recursión, 1732 01:12:18,370 --> 01:12:20,840 es algo que te devuelve una respuesta en términos de sí mismo. 1733 01:12:20,840 --> 01:12:22,170 Pero, ¿por qué esto es útil? 1734 01:12:22,170 --> 01:12:24,320 Bueno, ahora podemos aprovechar esto 1735 01:12:24,320 --> 01:12:27,470 para resolver un problema, si sabemos que podemos convertirlo en un código. 1736 01:12:27,470 --> 01:12:30,380 Nos enfocaremos menos en la implementación y más sobre la idea, 1737 01:12:30,380 --> 01:12:33,260 pero veamos si podemos envolver nuestras mentes alrededor del problema 1738 01:12:33,260 --> 01:12:35,520 para resolverlo con este código. 1739 01:12:35,520 --> 01:12:37,260 Este es el ordenamiento por mezcla, en pseudocódigo. 1740 01:12:37,260 --> 01:12:39,020 Y de nuevo, como todos los pseudocódigos que hemos escrito, 1741 01:12:39,020 --> 01:12:41,103 podríamos escribir este de muchísimas maneras diferentes. 1742 01:12:41,103 --> 01:12:42,390 Esta es una de ellas. 1743 01:12:42,390 --> 01:12:46,850 Observen la primera parte: on input of n elements, n números, n libros azules, 1744 01:12:46,850 --> 01:12:48,950 n cualquier cosa, continúa y haz lo siguiente, 1745 01:12:48,950 --> 01:12:50,832 If n < 2, return. 1746 01:12:50,832 --> 01:12:53,540 Esta es un poco diferente de la condición que tuve hace un momento, 1747 01:12:53,540 --> 01:12:56,240 pero el contexto aquí es para ordenar, no para sumar. 1748 01:12:56,240 --> 01:13:02,290 ¿Por qué es lógicamente correcto decir, si n es menor que 2, solo regresa? 1749 01:13:02,290 --> 01:13:03,470 Sí, porque se trata de sí mismo. 1750 01:13:03,470 --> 01:13:06,590 Si esto es menor que 2, significa que solo hay un libro azul, o tal vez incluso 1751 01:13:06,590 --> 01:13:08,990 cero, en cualquier caso, no hay trabajo por hacer, 1752 01:13:08,990 --> 01:13:09,620 Solo regresar. 1753 01:13:09,620 --> 01:13:12,380 La lista está ordenada, por corta que sea. 1754 01:13:12,380 --> 01:13:15,020 Pero si es más largo que eso, probablemente tengamos que trabajar, 1755 01:13:15,020 --> 01:13:17,360 y hacer algún ordenamiento. 1756 01:13:17,360 --> 01:13:18,510 ¿qué ocurre después? 1757 01:13:18,510 --> 01:13:20,540 Entonces, else, ¿saben algo? 1758 01:13:20,540 --> 01:13:22,940 Sort the left half of the elements y luego sort 1759 01:13:22,940 --> 01:13:26,700 the right half of the elements, y luego, OK, mézclenlos juntos. 1760 01:13:26,700 --> 01:13:29,162 Es el mismo tipo de actitud indiferente, donde 1761 01:13:29,162 --> 01:13:32,120 ¡ah! si me piden que ordene algo, solo voy a decirles, 1762 01:13:32,120 --> 01:13:35,210 bueno, ordenen los de la izquierda, luego los de la derecha 1763 01:13:35,210 --> 01:13:38,050 y simplemente se mezclan los resultados para que vuelvan a estar juntos. 1764 01:13:38,050 --> 01:13:40,160 Y esto es cíclico en el sentido de que, ¿cómo 1765 01:13:40,160 --> 01:13:42,470 ordenaremos la mitad izquierda de algo? 1766 01:13:42,470 --> 01:13:44,240 Necesitamos un algoritmo de ordenamiento. 1767 01:13:44,240 --> 01:13:46,410 Pero este es el algoritmo de ordenamiento. 1768 01:13:46,410 --> 01:13:50,420 Es como decir, use el ordenamiento por mezcla para ordenar la mitad izquierda 1769 01:13:50,420 --> 01:13:53,564 use el ordenamiento por mezcla en la mitad derecha, y los mezclamos juntos. 1770 01:13:53,564 --> 01:13:55,730 La mezcla no necesita ser un algoritmo elegante, 1771 01:13:55,730 --> 01:13:57,890 mezclarlos, es como si aquí tuvieran una pila de números 1772 01:13:57,890 --> 01:14:00,260 que están ordenados, una pila de números que están ordenados acá, 1773 01:14:00,260 --> 01:14:02,840 podemos simplemente mirarlos y tomar el que sea adecuado para 1774 01:14:02,840 --> 01:14:04,640 intercalarlos en el orden correcto. 1775 01:14:04,640 --> 01:14:06,230 Eso es a lo que nos referimos con mezclarlos. 1776 01:14:06,230 --> 01:14:08,750 ¿Cómo es esto correcto en el mundo? 1777 01:14:08,750 --> 01:14:13,250 Porque de esta manera, aparentemente no hicimos ningún trabajo. 1778 01:14:13,250 --> 01:14:16,220 Parece que no hay bucles, tampoco hay comparaciones, 1779 01:14:16,220 --> 01:14:20,210 está totalmente definido para que sea recursivo, por así decirlo. 1780 01:14:20,210 --> 01:14:22,130 Bueno, veamos qué significa esto. 1781 01:14:22,130 --> 01:14:25,580 Esta es una secuencia de visualizaciones que 1782 01:14:25,580 --> 01:14:30,845 potencialmente podrían caerse de la historia. 1783 01:14:30,845 --> 01:14:34,200 Trataré de ir despacio, pero no tan lentamente que el ejemplo por sí mismo 1784 01:14:34,200 --> 01:14:34,700 sea aburrido. 1785 01:14:34,700 --> 01:14:35,780 Pasaremos esto una vez y luego 1786 01:14:35,780 --> 01:14:36,950 una vez más, las diapositivas están en línea, por si desean 1787 01:14:36,950 --> 01:14:38,690 pasar a verla posteriormente. 1788 01:14:38,690 --> 01:14:41,240 Aquí hay una lista de 8 números, los mismos 8 números, 1789 01:14:41,240 --> 01:14:42,350 que vimos antes. 1790 01:14:42,350 --> 01:14:45,890 Los dibujé de manera contigua, como si estuvieran en un arreglo. 1791 01:14:45,890 --> 01:14:48,020 Esta lista tiene actualmente un tamaño de 8. 1792 01:14:48,020 --> 01:14:51,180 Por lo que el comienzo de esta historia es una entrada de 8 elementos. 1793 01:14:51,180 --> 01:14:53,240 ¿Cuál fue el primer paso en nuestro algoritmo? 1794 01:14:53,240 --> 01:14:55,760 Bueno, vamos a verificar, if n is less than 2, return. 1795 01:14:55,760 --> 01:14:58,410 Lo cual es irrelevante, porque n es 8, no menor que 2. 1796 01:14:58,410 --> 01:15:00,390 Entonces ese es un punto cuestionable. 1797 01:15:00,390 --> 01:15:04,250 Para mí, las primeras tres cosas que debo hacer para ordenar esta lista 1798 01:15:04,250 --> 01:15:08,480 son: to sort the left half, luego sort the right half 1799 01:15:08,480 --> 01:15:10,640 y después mezclen las mitades ordenadas. 1800 01:15:10,640 --> 01:15:12,180 OK, veamos cómo llegamos allí. 1801 01:15:12,180 --> 01:15:14,535 De modo que aquí está la lista, aquí está la mitad izquierda 1802 01:15:14,535 --> 01:15:16,410 y al parecer necesito ordenar la mitad izquierda 1803 01:15:16,410 --> 01:15:17,860 ¿Cómo puedo hacerlo? 1804 01:15:17,860 --> 01:15:20,952 Bueno, ¿cómo ordenarían una lista de cuatro elementos? 1805 01:15:20,952 --> 01:15:22,190 PÚBLICO: ¿Y si los separamos una vez más? 1806 01:15:22,190 --> 01:15:23,481 DAVID: Los separamos una vez más. 1807 01:15:23,481 --> 01:15:28,070 Ordenamos la mitad izquierda, luego la derecha y mezclamos esas dos mitades. 1808 01:15:28,070 --> 01:15:28,820 Así que déjenme hacer eso. 1809 01:15:28,820 --> 01:15:31,452 Dibujaré un cuadro alrededor de los elementos con los que estamos 1810 01:15:31,452 --> 01:15:32,660 trabajando en este momento, 1811 01:15:32,660 --> 01:15:35,390 a continuación revisaré la mitad izquierda 1812 01:15:35,390 --> 01:15:37,730 OK, ahora necesito ordenar esta lista. 1813 01:15:37,730 --> 01:15:39,830 ¿Cómo ordeno una lista de tamaño 2? 1814 01:15:39,830 --> 01:15:41,430 En realidad es 2, no es menor de 2, 1815 01:15:41,430 --> 01:15:42,840 tengo que hacer algún trabajo. 1816 01:15:42,840 --> 01:15:46,760 Entonces, ¿cómo ordenamos una lista de tamaño 2? 1817 01:15:46,760 --> 01:15:49,370 Es un poco extraño decirlo, pero-- 1818 01:15:49,370 --> 01:15:53,900 ordenamos la mitad izquierda, luego la mitad derecha y mezclamos ambas. 1819 01:15:53,900 --> 01:15:55,997 En este punto de la historia, podríamos muy bien 1820 01:15:55,997 --> 01:15:58,580 perdernos, porque seguimos diciendo lo mismo, 1821 01:15:58,580 --> 01:16:00,650 sin que hagamos algún trabajo. 1822 01:16:00,650 --> 01:16:03,562 Pero pensemos como si reguláramos estas instrucciones, 1823 01:16:03,562 --> 01:16:06,020 como lo he dicho, para ordenar la mitad izquierda, luego la mitad derecha 1824 01:16:06,020 --> 01:16:07,760 por ahora únicamente nos enfocaremos en la mitad izquierda. 1825 01:16:07,760 --> 01:16:09,170 Pero desafortunadamente nos distrajimos un poco, 1826 01:16:09,170 --> 01:16:11,390 porque para ordenar la mitad izquierda, tenemos que ordenar la mitad izquierda, 1827 01:16:11,390 --> 01:16:12,440 por lo que tenemos que hacer un poco más de trabajo. 1828 01:16:12,440 --> 01:16:14,773 Si dejamos que esta especie de carga mental se acumule, 1829 01:16:14,773 --> 01:16:17,150 tendremos que recordar cómo se hace, para volver a hacerlo. 1830 01:16:17,150 --> 01:16:19,370 Pero en realidad aún no hacemos el verdadero trabajo. 1831 01:16:19,370 --> 01:16:20,630 Estamos a punto de hacerlo. 1832 01:16:20,630 --> 01:16:24,890 Pues ahora que me dijeron, en una lista de tamaño 2, ordena la mitad izquierda, 1833 01:16:24,890 --> 01:16:27,560 aquí es donde tocamos fondo con el planteamiento básico 1834 01:16:27,560 --> 01:16:29,420 y comenzamos a tener algunos progresos. 1835 01:16:29,420 --> 01:16:31,220 Entonces, aquí están el 4 y el 2, una lista de tamaño 2, 1836 01:16:31,220 --> 01:16:33,050 vamos a ordenar la mitad izquierda. 1837 01:16:33,050 --> 01:16:36,530 ¿Cómo se ordena una lista de tamaño 1? 1838 01:16:36,530 --> 01:16:37,460 No podemos, ¿cierto? 1839 01:16:37,460 --> 01:16:40,670 Porque n es 1 y 1 por supuesto, es menor a 2 1840 01:16:40,670 --> 01:16:43,760 y ¿cuál era la única instrucción que había en la parte superior de esta función? 1841 01:16:43,760 --> 01:16:45,400 ordenamiento por mezcla? 1842 01:16:45,400 --> 01:16:46,430 Regresa. 1843 01:16:46,430 --> 01:16:47,750 algo así como no hagas nada. 1844 01:16:47,750 --> 01:16:48,800 OK todo el mundo, 1845 01:16:48,800 --> 01:16:51,020 ahora he ordenado el número 4 para ustedes. 1846 01:16:51,020 --> 01:16:53,930 Es cierto, es una declaración tonta, 1847 01:16:53,930 --> 01:16:56,702 pero la magia llegará cuando combinamos los resultados. 1848 01:16:56,702 --> 01:16:58,160 Veamos a dónde va la historia, 1849 01:16:58,160 --> 01:16:59,630 he ordenado la mitad izquierda, listo. 1850 01:16:59,630 --> 01:17:00,620 Regresa. 1851 01:17:00,620 --> 01:17:03,150 ¿qué se supone que debo hacer ahora? 1852 01:17:03,150 --> 01:17:05,810 Tengo que ordenar la mitad derecha en esa lista de tamaño 2. 1853 01:17:05,810 --> 01:17:07,700 OK listo. 1854 01:17:07,700 --> 01:17:11,090 En este punto de la historia ¿cuál es el tercer paso? 1855 01:17:11,090 --> 01:17:11,630 Mezclarlos. 1856 01:17:11,630 --> 01:17:16,640 Miremos de nuevo esta lista de tamaño 2, cada una de sus mitades se ordenó 1857 01:17:16,640 --> 01:17:18,750 de acuerdo con la absurda lógica que usamos aquí, 1858 01:17:18,750 --> 01:17:20,840 pero ahora sucede algo interesante. 1859 01:17:20,840 --> 01:17:23,930 Tengo a la izquierda el número 4 y a la derecha 1860 01:17:23,930 --> 01:17:26,432 el número 2, y cada una de estas listas son de tamaño 1. 1861 01:17:26,432 --> 01:17:29,390 Y si los cambiamos ya sea con su imaginación o visualmente con mis dedos, 1862 01:17:29,390 --> 01:17:32,180 piensen que su mano izquierda apunta hacia la primera lista 1863 01:17:32,180 --> 01:17:35,630 y su mano derecha apunta hacia la segunda, el proceso de mezclar los números 1864 01:17:35,630 --> 01:17:38,480 simplemente es comparar lo que apuntan tus dedos y decidir 1865 01:17:38,480 --> 01:17:39,890 cuál de ellos está primero. 1866 01:17:39,890 --> 01:17:42,450 Obviamente el 2 estará primero, así que en un momento, 1867 01:17:42,450 --> 01:17:45,256 veremos que este 2 debería moverse aquí y luego 1868 01:17:45,256 --> 01:17:46,880 no queda nada para mi mano derecha. 1869 01:17:46,880 --> 01:17:47,380 Está hecho. 1870 01:17:47,380 --> 01:17:49,310 Obviamente, el 4 irá aquí 1871 01:17:49,310 --> 01:17:53,540 y este proceso de reunir el 2 seguido del 4, es lo que entendemos como mezclarlos. 1872 01:17:53,540 --> 01:17:56,300 Es más o menos lo que hice con el ordenamiento por inserción, 1873 01:17:56,300 --> 01:17:59,589 pero aquí solo lo hacemos con cada uno de los elementos a la vez, como 1874 01:17:59,589 --> 01:18:01,880 si entrelazáramos o comprimiéramos las cosas, 1875 01:18:01,880 --> 01:18:03,080 del mismo modo que con un cierre, si lo pensamos de esa 1876 01:18:03,080 --> 01:18:03,810 manera. 1877 01:18:03,810 --> 01:18:06,990 Ahora, déjenme tomar el 2 y ponerlo aquí, 1878 01:18:06,990 --> 01:18:09,650 permítanme tomar el 4 y ponerlo aquí. 1879 01:18:09,650 --> 01:18:10,370 OK. 1880 01:18:10,370 --> 01:18:14,660 Así que, ordené la mitad izquierda, la mitad derecha, también los mezclé. 1881 01:18:14,660 --> 01:18:15,950 ¿cuál es el desenlace de la historia? 1882 01:18:15,950 --> 01:18:17,160 ¿En qué punto la dejamos? 1883 01:18:17,160 --> 01:18:18,410 PÚBLICO: en ordenar la mitad derecha. 1884 01:18:18,410 --> 01:18:21,035 DAVID: Ahora tenemos que ordenar la mitad derecha que era, como, 1885 01:18:21,035 --> 01:18:24,812 hace un minuto en la historia el cual, para resaltarlo esto, son el 7 y el 5. 1886 01:18:24,812 --> 01:18:26,270 A continuación tengo que hacer lo mismo. 1887 01:18:26,270 --> 01:18:31,350 Estoy ordenando una lista de tamaño 2, que de la derecha pasa a la izquierda. 1888 01:18:31,350 --> 01:18:34,250 Luego ordeno la mitad izquierda, listo 1889 01:18:34,250 --> 01:18:36,140 y ordeno la mitad derecha, listo. 1890 01:18:36,140 --> 01:18:37,740 Después debo mezclarlas juntas. 1891 01:18:37,740 --> 01:18:40,900 Ahora mis manos tienen algo de trabajo por hacer, pero lo haré por aquí, 1892 01:18:40,900 --> 01:18:43,550 bajamos el 5 y luego bajamos el 7. 1893 01:18:43,550 --> 01:18:49,400 Este punto de la historia, hemos ordenado la mitad de la mitad izquierda, 1894 01:18:49,400 --> 01:18:53,010 y también la mitad de la mitad izquierda. 1895 01:18:53,010 --> 01:18:56,070 ¿En qué punto de la historia nos encontramos ahora? 1896 01:18:56,070 --> 01:18:56,570 Es cierto. 1897 01:18:56,570 --> 01:18:59,480 Estamos, ahora tenemos, bueno, acabamos de ordenar la mitad derecha. 1898 01:18:59,480 --> 01:19:01,547 Ahora tenemos que mezclar las dos mitades. 1899 01:19:01,547 --> 01:19:04,880 Si hacemos esto en casa y deseamos recordar todos nuestros pasos, 1900 01:19:04,880 --> 01:19:07,640 solo deberemos hacer una lista de pendientes, desde arriba hasta abajo 1901 01:19:07,640 --> 01:19:08,390 en una hoja de papel. 1902 01:19:08,390 --> 01:19:10,640 Y conforme hagamos alguno de los pasos lo tachamos y regresamos 1903 01:19:10,640 --> 01:19:13,431 al resto de las cosas en la lista, de este modo veríamos o sentiríamos 1904 01:19:13,431 --> 01:19:15,530 aún más, lo pesada que era esa carga mental 1905 01:19:15,530 --> 01:19:17,030 que acumulábamos y de la cual debemos ocuparnos. 1906 01:19:17,030 --> 01:19:20,150 Pero ahora tengo dos listas de tamaño 2, hagamos la cosa de los dedos otra vez. 1907 01:19:20,150 --> 01:19:23,149 Comienzo por señalar en lista izquierda y hago lo mismo en la de la derecha. 1908 01:19:23,149 --> 01:19:26,166 El primer número por mezclar por lo visto será el 2. 1909 01:19:26,166 --> 01:19:27,290 ¿cuál sigue después de ese? 1910 01:19:27,290 --> 01:19:29,480 Actualizaré mi dedo izquierdo, ahora una vez 1911 01:19:29,480 --> 01:19:32,600 que mi mano izquierda apunta hacia el 4, en este punto, mi mano derecha todavía 1912 01:19:32,600 --> 01:19:35,150 apunta hacia el 5, ¿cuál es el siguiente? 1913 01:19:35,150 --> 01:19:35,930 El 4. 1914 01:19:35,930 --> 01:19:37,760 Ya que no hay más trabajo para mi mano izquierda, es probable 1915 01:19:37,760 --> 01:19:38,926 que esto será bastante trivial, 1916 01:19:38,926 --> 01:19:39,427 el 5 y el 7. 1917 01:19:39,427 --> 01:19:40,760 Pero necesito mezclarlos. 1918 01:19:40,760 --> 01:19:43,520 Parece que ya están mezclados, pero tenemos que hacerlo. 1919 01:19:43,520 --> 01:19:46,500 Y al igual que antes, lo haré en un espacio nuevo. 1920 01:19:46,500 --> 01:19:49,790 Entonces, 2, 4, 5 y 7. 1921 01:19:49,790 --> 01:19:52,250 Y ahora podemos verlo por primera vez. 1922 01:19:52,250 --> 01:19:55,610 La mitad izquierda de la lista original finalmente está ordenada. 1923 01:19:55,610 --> 01:19:59,220 Desafortunadamente, comenzamos la historia hace como tres minutos. 1924 01:19:59,220 --> 01:20:02,809 Y ahora relajemos nuestra mente, para volver a la mitad derecha original. 1925 01:20:02,809 --> 01:20:05,600 Si lo pensamos ahora, aunque he dicho muchas palabras, 1926 01:20:05,600 --> 01:20:09,410 técnicamente este es el segundo paso en nuestro algoritmo. 1927 01:20:09,410 --> 01:20:12,140 O al menos la primera invocación del mismo. 1928 01:20:12,140 --> 01:20:14,600 Muy bien, haremos la misma idea pero un poco más rápido. 1929 01:20:14,600 --> 01:20:16,520 Ordenemos la mitad izquierda. 1930 01:20:16,520 --> 01:20:17,660 ¿Cómo puedo hacerlo? 1931 01:20:17,660 --> 01:20:22,340 Ordenemos la mitad izquierda, luego la derecha lo cual resulta demasiado fácil, 1932 01:20:22,340 --> 01:20:25,309 pero ahora tengo que mezclar al 6 y al 8. 1933 01:20:25,309 --> 01:20:27,350 En este caso mezclarlos no tuvo mucho efecto, 1934 01:20:27,350 --> 01:20:29,720 pero teníamos que hacerlo para asegurarnos. 1935 01:20:29,720 --> 01:20:32,180 A continuación, vamos a ordenar la mitad de la mitad derecha. 1936 01:20:32,180 --> 01:20:35,090 Ahora voy a ordenar ambas, 1937 01:20:35,090 --> 01:20:36,340 el paso clave es mezclarlas. 1938 01:20:36,340 --> 01:20:38,120 Ahora es cuando hacemos un verdadero trabajo, 1939 01:20:38,120 --> 01:20:40,080 y que tenemos trabajo pendiente, 1940 01:20:40,080 --> 01:20:43,163 también debemos ordenar las mitades izquierda y derecha, de la mitad derecha 1941 01:20:43,163 --> 01:20:43,760 original. 1942 01:20:43,760 --> 01:20:47,990 Entonces es 1, luego 3, luego 6, luego 8. 1943 01:20:47,990 --> 01:20:49,812 Por fin, casi terminamos. 1944 01:20:49,812 --> 01:20:51,020 ¿Ahora qué hacemos con estos? 1945 01:20:51,020 --> 01:20:54,015 Ya que tenemos las dos mitades, la izquierda y la derecha del original, 1946 01:20:54,015 --> 01:20:56,390 pensemos en que los dedos hagan el trabajo de nuevo. 1947 01:20:56,390 --> 01:21:01,580 El 1 irá aquí, el 2 irá aquí, el 3 aquí, luego el 4, 1948 01:21:01,580 --> 01:21:03,987 y constantemente comparo hacia dónde apuntan mis dedos, 1949 01:21:03,987 --> 01:21:06,320 pero mis dedos se mueven todo el tiempo y de izquierda a derecha. 1950 01:21:06,320 --> 01:21:08,945 Tan pronto como me ocupo de un número, avanzo al siguiente 1951 01:21:08,945 --> 01:21:09,570 de la lista. 1952 01:21:09,570 --> 01:21:14,600 Obviamente ahora tenemos, 1, 2, 3, 4, 5, 6. 1953 01:21:14,600 --> 01:21:17,069 Pero si se imaginan mis dedos mientras hacen este trabajo, 1954 01:21:17,069 --> 01:21:19,860 todo el tiempo se mueven desde la derecha hasta el final de la lista 1955 01:21:19,860 --> 01:21:24,500 y tan pronto como tocan los extremos de esas listas, debo terminar de mezclarlas. 1956 01:21:24,500 --> 01:21:25,250 Y voila, 1957 01:21:25,250 --> 01:21:26,930 ordenamos los elementos. 1958 01:21:26,930 --> 01:21:29,330 Existe una enorme cantidad de palabras y sería una pesadilla 1959 01:21:29,330 --> 01:21:32,163 hacerlo con personas, porque suceden muchas cosas 1960 01:21:32,163 --> 01:21:35,230 y tendríamos que recordar, o separar muchos de los pasos. 1961 01:21:35,230 --> 01:21:39,910 Pero al final, hicimos algo y lo capturamos incluso 1962 01:21:39,910 --> 01:21:41,560 por esta imagen. 1963 01:21:41,560 --> 01:21:46,090 Entonces, el ordenamiento por mezcla, aunque suena como una larga historia, 1964 01:21:46,090 --> 01:21:49,480 es en esencia más rápido y es más rápido porque estamos 1965 01:21:49,480 --> 01:21:53,640 dividiendo el problema a la mitad, como lo hicimos con la búsqueda binaria, 1966 01:21:53,640 --> 01:21:56,150 en el ejemplo de la agenda telefónica hace algunos días. 1967 01:21:56,150 --> 01:22:00,700 Si miramos en la pantalla, podremos ver los residuos del trabajo 1968 01:22:00,700 --> 01:22:01,780 que hemos hecho. 1969 01:22:01,780 --> 01:22:08,670 ¿Cuántas veces movimos los elementos de una fila a otra? 1970 01:22:08,670 --> 01:22:12,360 Comenzaron aquí, luego llegaron hasta acá 1971 01:22:12,360 --> 01:22:14,260 y luego acá y acá. 1972 01:22:14,260 --> 01:22:18,780 Esos son uno, dos, tres movimientos de las letras, o de los números 1973 01:22:18,780 --> 01:22:19,770 en la memoria, si lo prefieren. 1974 01:22:19,770 --> 01:22:21,630 Entonces, si se imaginan cada una de estas filas como un fragmento diferente 1975 01:22:21,630 --> 01:22:24,450 de memoria y de RAM, únicamente muevo las cosas en la memoria. 1976 01:22:24,450 --> 01:22:26,612 De modo que el tres solo es un número. 1977 01:22:26,612 --> 01:22:29,070 Pero, si esto lo aplicáramos a otros casos, 1978 01:22:29,070 --> 01:22:34,410 resulta que el logaritmo base 2 de n, donde n es 8 1979 01:22:34,410 --> 01:22:40,020 y 8 es el número de elementos con los que empezamos, el log base 2 de 8 es 3. 1980 01:22:40,020 --> 01:22:42,300 De hecho, si tenemos un poco de fe, 1981 01:22:42,300 --> 01:22:44,758 para que no tengamos que hacer un ejemplo más grande, 1982 01:22:44,758 --> 01:22:46,140 para demostrarlo, 1983 01:22:46,140 --> 01:22:49,310 el número de veces que movemos los números será igual, 1984 01:22:49,310 --> 01:22:51,630 al log base 2 de n. 1985 01:22:51,630 --> 01:22:53,700 Que en este caso es 3. 1986 01:22:53,700 --> 01:22:56,280 Esto nos lleva a la siguiente pregunta, en cada 1987 01:22:56,280 --> 01:23:00,760 una de las filas, cada vez que movemos los números a nueva ubicación en la memoria, 1988 01:23:00,760 --> 01:23:05,399 ¿Cuántas veces tocamos ése número mientras está en esa posición? 1989 01:23:05,399 --> 01:23:07,440 O, ¿cuántas veces, de manera equivalente, lo buscamos 1990 01:23:07,440 --> 01:23:08,820 para hacer algo con él? 1991 01:23:08,820 --> 01:23:12,260 1992 01:23:12,260 --> 01:23:13,550 ¿Qué quiero decir con esto? 1993 01:23:13,550 --> 01:23:17,170 Bueno, el movimiento de arriba hacia abajo ocurrió cada vez 1994 01:23:17,170 --> 01:23:18,080 que los mezclamos. 1995 01:23:18,080 --> 01:23:18,580 ¿Cierto? 1996 01:23:18,580 --> 01:23:20,729 Movimos los números de aquí hasta aquí. 1997 01:23:20,729 --> 01:23:23,770 Pero tan pronto como lo hicimos, tuvimos que hacer algún trabajo, con el puntero izquierdo 1998 01:23:23,770 --> 01:23:24,519 y el derecho. 1999 01:23:24,519 --> 01:23:26,830 Necesité mezclarlos juntos. 2000 01:23:26,830 --> 01:23:29,960 Y como lo enfaticé antes, cada vez que comparo los números 2001 01:23:29,960 --> 01:23:31,720 mi mano izquierda y derecha avanzan 2002 01:23:31,720 --> 01:23:33,630 constantemente desde la izquierda y la derecha. 2003 01:23:33,630 --> 01:23:34,990 Nunca retrocedo. 2004 01:23:34,990 --> 01:23:38,190 Como constantemente regresaba con el ordenamiento burbuja, el de inserción, 2005 01:23:38,190 --> 01:23:40,690 ordenamiento por selección, ocurrieron muchas comparaciones, 2006 01:23:40,690 --> 01:23:42,773 se sentía como un montón de trabajo, y físicamente lo fue. 2007 01:23:42,773 --> 01:23:46,210 Pero aquí, ya saben, los mezclo, y muevo estas cosas de lugar, 2008 01:23:46,210 --> 01:23:50,710 y mis manos se mueven constantemente hacia adelante, buscando, en cada fila, 2009 01:23:50,710 --> 01:23:52,180 n números en total. 2010 01:23:52,180 --> 01:23:58,390 Mi mano izquierda o derecha apuntan a cada uno de los números una vez. 2011 01:23:58,390 --> 01:23:59,680 Nunca retroceden. 2012 01:23:59,680 --> 01:24:03,160 Así que, nunca fue n +1 o 2 n, solo fue n. 2013 01:24:03,160 --> 01:24:07,930 Entonces, tenemos movimientos log n de los números, en la memoria. 2014 01:24:07,930 --> 01:24:11,440 Cada vez que hacemos eso, en efecto, los mezclamos de izquierda a derecha, 2015 01:24:11,440 --> 01:24:13,150 tocando cada número a la vez. 2016 01:24:13,150 --> 01:24:18,070 Hacemos n cosas log n veces. 2017 01:24:18,070 --> 01:24:22,840 Entonces, eso sería matemáticamente igual a n log n. 2018 01:24:22,840 --> 01:24:25,480 De nuevo, si no están muy cómodos con los logaritmos, 2019 01:24:25,480 --> 01:24:29,244 sabemos que, de nuestra imagen, con las líneas rectas y la línea curva, 2020 01:24:29,244 --> 01:24:30,160 ¿cuál es más chica? 2021 01:24:30,160 --> 01:24:32,440 ¿Log de n, o n en términos generales? 2022 01:24:32,440 --> 01:24:33,460 PÚBLICO: Log de n. 2023 01:24:33,460 --> 01:24:35,440 DAVID: Log de n es más pequeño, ¿cierto? 2024 01:24:35,440 --> 01:24:39,400 Es por eso que la línea verde fue menor, y también fue curva. 2025 01:24:39,400 --> 01:24:41,620 Estaba debajo de la línea lineal n. 2026 01:24:41,620 --> 01:24:46,754 En general, cuanto más grande es n, más lentamente crece log n. 2027 01:24:46,754 --> 01:24:48,670 Y de nuevo, si solo se tiene fe en que esto 2028 01:24:48,670 --> 01:24:52,060 es una expresión matemática que comunica el tiempo requerido 2029 01:24:52,060 --> 01:24:53,260 para hacer algo, en menos. 2030 01:24:53,260 --> 01:24:55,150 ¿Cuál, por lo tanto, es más pequeño? 2031 01:24:55,150 --> 01:24:58,510 ¿n al cuadrado, que desde luego es n veces n? 2032 01:24:58,510 --> 01:24:59,867 O, ¿n log n? 2033 01:24:59,867 --> 01:25:01,095 PÚBLICO: n log n. 2034 01:25:01,095 --> 01:25:01,970 DAVID: n log n. 2035 01:25:01,970 --> 01:25:05,530 Ahora encontramos un algoritmo que a diferencia de todos los vistos, 2036 01:25:05,530 --> 01:25:07,690 y a pesar de que tomó un tiempo para explicar, y aunque 2037 01:25:07,690 --> 01:25:10,030 es posible que tenga que escudriñar de nuevo para enfocar nuestra mente 2038 01:25:10,030 --> 01:25:11,920 a nuestro alrededor, me llevó tiempo, 2039 01:25:11,920 --> 01:25:17,570 también es fundamentalmente más rápido. 2040 01:25:17,570 --> 01:25:21,591 Para intentar de nuevo esto, nos mostrará otra perspectiva. 2041 01:25:21,591 --> 01:25:24,340 Al menos si estamos más matemáticamente cómodos después de hoy, 2042 01:25:24,340 --> 01:25:26,530 si nos preocupa que esto sean más matemáticas de las que esperaban, 2043 01:25:26,530 --> 01:25:29,170 nos damos cuenta de que rápidamente nos abstraemos lejos de estos detalles, 2044 01:25:29,170 --> 01:25:31,715 y comenzamos a agitar nuestras manos al usar gran 0 y gran omega. 2045 01:25:31,715 --> 01:25:34,090 Consideremos cómo podríamos buscar en esta otra manera. 2046 01:25:34,090 --> 01:25:35,964 Si la imagen no estuviera trabajando para nosotros, 2047 01:25:35,964 --> 01:25:39,670 veríamos si podemos, anotar cuántos pasos da cada uno 2048 01:25:39,670 --> 01:25:40,780 de estas líneas de código. 2049 01:25:40,780 --> 01:25:42,190 No hay muchas líneas de código aquí, por lo que 2050 01:25:42,190 --> 01:25:43,810 no debería ser una expresión muy larga. 2051 01:25:43,810 --> 01:25:47,230 Entonces, ¿cuánto tiempo lleva decidir si n < 2? 2052 01:25:47,230 --> 01:25:48,846 Y si es así, ¿regresar? 2053 01:25:48,846 --> 01:25:50,970 Bueno, ya pasaron muchos números, así que 2054 01:25:50,970 --> 01:25:52,520 lo llamaré tiempo constante. 2055 01:25:52,520 --> 01:25:54,840 ¿Sabemos cuántos números se nos entregaron? 2056 01:25:54,840 --> 01:25:56,590 No, si es no son menores a 2, o si, lo son. 2057 01:25:56,590 --> 01:25:57,700 Nosotros respondemos sí o no. 2058 01:25:57,700 --> 01:25:58,420 Tiempo constante. 2059 01:25:58,420 --> 01:25:59,270 Gran O de uno. 2060 01:25:59,270 --> 01:25:59,770 ¿Correcto? 2061 01:25:59,770 --> 01:26:00,970 Así que, describiré como es esto. 2062 01:26:00,970 --> 01:26:02,470 Esta es la manera formal de decirlo. 2063 01:26:02,470 --> 01:26:06,070 T (n), es cuánto tiempo toma un problema dado de tamaño n, 2064 01:26:06,070 --> 01:26:07,730 es una manera elegante de decir eso. 2065 01:26:07,730 --> 01:26:08,980 Está en el orden de un paso. 2066 01:26:08,980 --> 01:26:10,560 Tal vez sean dos, tal vez sean tres, porque 2067 01:26:10,560 --> 01:26:11,410 buscamos tener algo. 2068 01:26:11,410 --> 01:26:13,201 Pero es un número fijo de pasos para decidir, 2069 01:26:13,201 --> 01:26:15,730 que hay menos de n elementos en frente de mí. 2070 01:26:15,730 --> 01:26:17,350 No nos llevará mucho tiempo. 2071 01:26:17,350 --> 01:26:21,190 Así que, esa pieza de rompecabezas toma una gran O de un paso. 2072 01:26:21,190 --> 01:26:23,200 Ahora, tenemos otras tres preguntas para responder. 2073 01:26:23,200 --> 01:26:24,616 Eso es algo así como un desechable. 2074 01:26:24,616 --> 01:26:27,802 Eso es realmente rápido, si son solo uno, dos o tres pasos. 2075 01:26:27,802 --> 01:26:29,260 Entonces, ¿estas cosas son costosas? 2076 01:26:29,260 --> 01:26:30,220 Bien, veamos. 2077 01:26:30,220 --> 01:26:31,690 Ordena la mitad izquierda de los elementos. 2078 01:26:31,690 --> 01:26:35,080 Bueno, puedo ser inteligente y proponer lo siguiente. 2079 01:26:35,080 --> 01:26:35,740 ¿Saben qué? 2080 01:26:35,740 --> 01:26:38,830 La cantidad de tiempo requerido para ordenar n elementos 2081 01:26:38,830 --> 01:26:40,810 es técnicamente igual a la cantidad de tiempo 2082 01:26:40,810 --> 01:26:45,220 toma la mitad del tiempo ordenar del tiempo, más la cantidad de tiempo requerido 2083 01:26:45,220 --> 01:26:49,260 para ordenar la otra mitad de esos elementos, más 2084 01:26:49,260 --> 01:26:51,040 algo de tiempo en mezclarlos. 2085 01:26:51,040 --> 01:26:54,319 Y es esencialmente n, pero voy a generalizarlo como una gran O de n, 2086 01:26:54,319 --> 01:26:56,110 porque tuve que mover mis manos. 2087 01:26:56,110 --> 01:26:59,235 Pero, la clave fue que mis manos se movieron constantemente a la derecha. 2088 01:26:59,235 --> 01:27:02,592 No hubo bucle una y otra vez, y de nuevo, como con los otros algoritmos. 2089 01:27:02,592 --> 01:27:04,300 Así que, son como n pasos para mezclarlos. 2090 01:27:04,300 --> 01:27:06,250 Si tengo 4 números aquí, y 4 números aquí, 2091 01:27:06,250 --> 01:27:08,170 tengo que tocar un total de 8 elementos. 2092 01:27:08,170 --> 01:27:12,730 8 es n, así que se siente, sí, por orden de n pasos para mezclarlos. 2093 01:27:12,730 --> 01:27:15,730 Lamentablemente, esto es una respuesta repetitiva 2094 01:27:15,730 --> 01:27:18,919 a la pregunta de cuán eficiente es el ordenamiento por mezcla. 2095 01:27:18,919 --> 01:27:20,710 Pero es un tipo de consistencia con el hecho de que 2096 01:27:20,710 --> 01:27:24,432 ese ordenamiento por mezcla se implementó por repeticiones en este código. 2097 01:27:24,432 --> 01:27:26,140 Y resulta que también aquí, si tenemos 2098 01:27:26,140 --> 01:27:28,930 uno de esos libros de texto antiguos eso tiene anotaciones al frente 2099 01:27:28,930 --> 01:27:30,846 o la parte posterior de nuestro libro de física o matemáticas, 2100 01:27:30,846 --> 01:27:35,050 esta es una serie que podemos, que los matemáticos saben 2101 01:27:35,050 --> 01:27:39,370 como sumarle a algo conocido, lo cual es n log n. 2102 01:27:39,370 --> 01:27:42,550 Y no nos adentraremos en la maleza del por qué matemáticamente es así, 2103 01:27:42,550 --> 01:27:45,850 pero si tomamos un problema de tamaño n y le sumamos el tiempo 2104 01:27:45,850 --> 01:27:48,790 de ejecución para la primera mitad, la segunda mitad y le añadimos una n, 2105 01:27:48,790 --> 01:27:51,626 esto es lo que matemáticamente termina siendo. 2106 01:27:51,626 --> 01:27:53,500 Así que, si se sienten más cómodos con eso, 2107 01:27:53,500 --> 01:27:56,980 noten que esto proviene de contar todos esos pasos. 2108 01:27:56,980 --> 01:27:59,600 Y en última instancia, es mucho mejor que eso. 2109 01:27:59,600 --> 01:28:01,422 De hecho, podemos sentirlo aquí. 2110 01:28:01,422 --> 01:28:03,880 Pero podremos percibirlo mejor con otro conjuntos de datos, 2111 01:28:03,880 --> 01:28:07,570 pero sigamos adelante y lo volveré a cargar aquí, continuaré a la misma velocidad 2112 01:28:07,570 --> 01:28:10,315 que tuvimos antes, y elijo el ordenamiento por mezcla. 2113 01:28:10,315 --> 01:28:13,270 2114 01:28:13,270 --> 01:28:16,540 Lo ajustaré a la pantalla de una vez. 2115 01:28:16,540 --> 01:28:21,260 Deberíamos acelerarlo como el original. 2116 01:28:21,260 --> 01:28:22,600 Pero, ¿qué está haciendo? 2117 01:28:22,600 --> 01:28:25,780 Está usando un poco de memoria extra, del mismo modo que en la pantalla, 2118 01:28:25,780 --> 01:28:27,610 utilizamos un poco de espacio adicional. 2119 01:28:27,610 --> 01:28:32,859 Pero noten, que conforme funciona, mueve las cosas de un lado a otro. 2120 01:28:32,859 --> 01:28:34,150 Y en realidad está ahorrando espacio. 2121 01:28:34,150 --> 01:28:36,930 A pesar de que utilicé una cantidad de memoria log n para seguir moviéndolo, 2122 01:28:36,930 --> 01:28:37,600 eso fue tonto. 2123 01:28:37,600 --> 01:28:40,266 No era necesario que siguiera usando más memoria, más memoria, más 2124 01:28:40,266 --> 01:28:42,589 memoria, porque ya no utilizaba las cosas de más arriba. 2125 01:28:42,589 --> 01:28:45,130 Con el ordenamiento por mezcla, necesito el doble de memoria 2126 01:28:45,130 --> 01:28:48,220 como con esos otros algoritmos, porque es la primera vez que necesitamos moverlos, 2127 01:28:48,220 --> 01:28:49,150 moverlos aquí. 2128 01:28:49,150 --> 01:28:51,854 Aun cuando, de manera deliberada, lo hice visible 2129 01:28:51,854 --> 01:28:54,520 para moverlo a otra ubicación, sigue moviendo las cosas de un 2130 01:28:54,520 --> 01:28:55,450 lado a otro según sea necesario. 2131 01:28:55,450 --> 01:28:57,700 Y es lo mismo que pasa con el algoritmo de aquí. 2132 01:28:57,700 --> 01:29:00,430 No es tan fácil de ver con esta visualización, así que 2133 01:29:00,430 --> 01:29:02,860 abriré este otro. 2134 01:29:02,860 --> 01:29:05,050 ¡Ahora, vamos! 2135 01:29:05,050 --> 01:29:08,500 Y veremos el ordenamiento por mezcla todo el camino a la derecha, 2136 01:29:08,500 --> 01:29:10,390 listo. 2137 01:29:10,390 --> 01:29:12,790 Muy bien, el ordenamiento por inserción tiene algo de suerte aquí, 2138 01:29:12,790 --> 01:29:15,310 pero solo porque el orden de los elementos y el tamaño del conjunto de datos 2139 01:29:15,310 --> 01:29:17,809 no es tan grande, por eso quería mostrarles el otro. 2140 01:29:17,809 --> 01:29:22,490 Pero si lo repetimos, podremos ver de nuevo que ese ordenamiento por mezcla 2141 01:29:22,490 --> 01:29:23,770 es mucho más rápido. 2142 01:29:23,770 --> 01:29:25,520 Podemos ver que hace las cosas en mitades. 2143 01:29:25,520 --> 01:29:29,530 El ordenamiento por selección, y el burbuja, también hacen lo suyo. 2144 01:29:29,530 --> 01:29:32,670 Si lo hiciéramos usando, como, ¿qué es eso 2145 01:29:32,670 --> 01:29:35,470 10, en total 20 barras, pero con 100 barras? 2146 01:29:35,470 --> 01:29:36,506 ¿O un millón de barras? 2147 01:29:36,506 --> 01:29:38,380 En verdad, en verdad sentiríamos la diferencia, 2148 01:29:38,380 --> 01:29:43,100 tal como lo hicimos con el ejemplo de la agenda telefónica. 2149 01:29:43,100 --> 01:29:46,399 ¿Tienen alguna pregunta sobre esto? 2150 01:29:46,399 --> 01:29:48,440 No revisaremos el código, pero si les 2151 01:29:48,440 --> 01:29:52,090 interesa ver cómo algunas de estas ideas esquematizan un código en C, 2152 01:29:52,090 --> 01:29:55,220 encontrarán en la aplicación de CS50, en el código fuente de hoy, 2153 01:29:55,220 --> 01:29:59,600 un par de archivos, binary0.c y binary one in linear.c, los cuales 2154 01:29:59,600 --> 01:30:02,620 implementan la búsqueda binaria y la lineal de dos maneras diferentes, 2155 01:30:02,620 --> 01:30:04,370 si desean ver como las esquematizan. 2156 01:30:04,370 --> 01:30:07,010 Con el tiempo que nos queda de hoy, lo que podríamos hacer 2157 01:30:07,010 --> 01:30:10,280 es competir en alguno de los siguientes desafíos algorítmicos. 2158 01:30:10,280 --> 01:30:14,669 En las ciencias de la computación existen magníficas oportunidades 2159 01:30:14,669 --> 01:30:16,460 para interactuar con otros ámbitos, entre los cuales 2160 01:30:16,460 --> 01:30:18,380 están las artes y más específicamente, la música. 2161 01:30:18,380 --> 01:30:21,560 En la música, independientemente de si son audiófilos o incluso 2162 01:30:21,560 --> 01:30:25,400 teóricos musicales, sabrán que hay relaciones 2163 01:30:25,400 --> 01:30:29,030 entre los sonidos y la velocidad en la que escuchamos esas notas. 2164 01:30:29,030 --> 01:30:30,750 Lo cual quiere decir, que siguen patrones. 2165 01:30:30,750 --> 01:30:32,970 Y estos patrones pueden producirse mediante computadoras, 2166 01:30:32,970 --> 01:30:35,480 pueden ser generados por ellas y lo que haremos 2167 01:30:35,480 --> 01:30:37,550 por último, en la serie de problemas número tres, 2168 01:30:37,550 --> 01:30:40,194 será introducirnos un poco en el mundo musical, 2169 01:30:40,194 --> 01:30:42,110 ya sea que tengamos alguna experiencia previa o no. 2170 01:30:42,110 --> 01:30:45,940 Y Brian, si no te importa puedes venir para ayudarnos con este ejercicio. 2171 01:30:45,940 --> 01:30:48,920 Aquí tenemos algunas teclas de un teclado 2172 01:30:48,920 --> 01:30:51,519 y también hay 88 teclas de un piano real. 2173 01:30:51,519 --> 01:30:54,560 Brian nos ayudará en un momento, con algunas de estas definiciones. 2174 01:30:54,560 --> 01:30:57,992 Pero como pueden ver hay ocho teclas, una, dos, tres, cuatro, cinco, 2175 01:30:57,992 --> 01:31:01,640 seis, siete teclas blancas y cinco teclas negras en el tablero. 2176 01:31:01,640 --> 01:31:03,042 Parece ser que los humanos, 2177 01:31:03,042 --> 01:31:05,000 hace algunos años decidieron, al menos en la música occidental, 2178 01:31:05,000 --> 01:31:08,227 estandarizar la manera en que describimos estas teclas, 2179 01:31:08,227 --> 01:31:09,560 de modo que les asignamos letras. 2180 01:31:09,560 --> 01:31:11,690 Probablemente hayan escuchado del Do medio, incluso si nunca han 2181 01:31:11,690 --> 01:31:14,660 tocado un piano antes y es la tecla que se encuentra más a la izquierda 2182 01:31:14,660 --> 01:31:15,170 ahí. 2183 01:31:15,170 --> 01:31:19,100 También tenemos Re, Mi, Fa, Sol y luego La, Si. Por supuesto, en un piano real 2184 01:31:19,100 --> 01:31:21,530 hay teclas a la izquierda a la derecha. 2185 01:31:21,530 --> 01:31:24,284 ¿Quieres tocar lo que sonaría como Do aquí? 2186 01:31:24,284 --> 01:31:26,060 [MÚSICA DE PIANO] 2187 01:31:26,060 --> 01:31:29,472 Ese es el Do. Y luego, si quieres, ¡muy bien hecho! 2188 01:31:29,472 --> 01:31:31,970 [APLAUSOS] 2189 01:31:31,970 --> 01:31:34,545 ¿Quieres tocar todas las notas de la escala de Si? 2190 01:31:34,545 --> 01:31:41,757 [MÚSICA DE PIANO] 2191 01:31:41,757 --> 01:31:44,590 Eso también es algo sin resolver, por lo que debió venir a continuación 2192 01:31:44,590 --> 01:31:45,730 [MÚSICA DE PIANO] 2193 01:31:45,730 --> 01:31:48,340 Eso sería otro Do. Entonces lo que Brian tocó para nosotros es 2194 01:31:48,340 --> 01:31:51,190 una octava completa, así, hace referencia al ocho, 2195 01:31:51,190 --> 01:31:53,777 en este caso del Do al Do. 2196 01:31:53,777 --> 01:31:56,110 Los que estemos familiarizados con la música, 2197 01:31:56,110 --> 01:31:57,860 o con escuchar cierto tipo de música, podremos 2198 01:31:57,860 --> 01:31:59,980 notar que ciertas cosas suenan bien. 2199 01:31:59,980 --> 01:32:03,220 Pero de hecho, hay razones matemáticas o algorítmicas y fórmulas 2200 01:32:03,220 --> 01:32:05,170 para que algunos de estos sonidos suenen tan bien. 2201 01:32:05,170 --> 01:32:06,503 Pero, ¿qué hay acerca de estas teclas negras? 2202 01:32:06,503 --> 01:32:09,740 De hecho, se pueden definir de dos maneras diferentes. 2203 01:32:09,740 --> 01:32:11,759 Seguro alguna vez escucharon de bemoles o de agudos, 2204 01:32:11,759 --> 01:32:14,050 Brian, ¿quieres explicarnos cuál es la relación que hay 2205 01:32:14,050 --> 01:32:16,810 entre las teclas blancas y las negras, y por qué suenan diferente? 2206 01:32:16,810 --> 01:32:17,680 BRIAN: Sí, claro. 2207 01:32:17,680 --> 01:32:19,870 Veamos un poco de terminología primero. 2208 01:32:19,870 --> 01:32:23,890 Un semitono es la distancia desde una nota hasta la nota 2209 01:32:23,890 --> 01:32:26,970 que le sigue inmediatamente después, e incluye ambas notas blancas y negras. 2210 01:32:26,970 --> 01:32:28,870 Y todo lo que signifique para algo ser agudo, 2211 01:32:28,870 --> 01:32:32,500 se representa por el hashtag o el signo de libra como vemos allí, es tomar una nota 2212 01:32:32,500 --> 01:32:35,200 y moverla hacia arriba en un semitono. 2213 01:32:35,200 --> 01:32:39,040 Entonces, si comenzamos con Do y hacemos que esa nota sea aguda, a Do agudo, 2214 01:32:39,040 --> 01:32:41,170 movemos un semitono a la nota de inmediato 2215 01:32:41,170 --> 01:32:46,630 después de eso, la cual es esa nota negra entre Do y Re, ése es el Do agudo. 2216 01:32:46,630 --> 01:32:51,460 E igualmente, si añadimos el Mi agudo, eso es un semitono, o la nota inmediatamente 2217 01:32:51,460 --> 01:32:54,790 después, Mi, que en este caso, es lo mismo que Fa. Entonces, 2218 01:32:54,790 --> 01:32:57,209 Fa y Mi agudos son la misma nota. 2219 01:32:57,209 --> 01:32:59,500 Y mientras tanto, un bemol es lo opuesto a eso. 2220 01:32:59,500 --> 01:33:04,300 Si un agudo significa subir un semitono, un bemol significa bajar un semitono. 2221 01:33:04,300 --> 01:33:09,382 Si tengo un Mi, el Mi bemol es un semitono moviéndose a la izquierda del teclado. 2222 01:33:09,382 --> 01:33:12,090 DAVID: Aunque el teclado de un piano convencional no estaría 2223 01:33:12,090 --> 01:33:14,200 etiquetado como tal, esto sigue un patrón, 2224 01:33:14,200 --> 01:33:16,709 y lo repite, también de izquierda a derecha. 2225 01:33:16,709 --> 01:33:19,750 Y a medida que aprendan a tocar el piano, conocerán cómo suenan estas notas, 2226 01:33:19,750 --> 01:33:21,970 sabrán donde se localizan las teclas y también 2227 01:33:21,970 --> 01:33:25,490 aprenderán cómo leer las notas musicales, las cuales podrían verse así. 2228 01:33:25,490 --> 01:33:28,420 Esta es una canción familiar, que ahora oficialmente es del dominio público. 2229 01:33:28,420 --> 01:33:31,270 Verán que aquí tenemos estas pequeñas formas llamadas notas, 2230 01:33:31,270 --> 01:33:34,030 o pequeños círculos, ocurre que se encuentran en líneas específicas. 2231 01:33:34,030 --> 01:33:36,280 Si una nota está en una línea, 2232 01:33:36,280 --> 01:33:39,880 podría representar la nota La, pero si está en una línea diferente, 2233 01:33:39,880 --> 01:33:44,800 más arriba o abajo, podría representar a Si, Do, Re, Mi, Fa o Sol. 2234 01:33:44,800 --> 01:33:48,250 Si hay un símbolo agudo o un bemol delante de ella, 2235 01:33:48,250 --> 01:33:51,100 eso podría cambiarlo ligeramente, así estarán 2236 01:33:51,100 --> 01:33:53,830 tocando, en muchos casos, también una de las teclas negras. 2237 01:33:53,830 --> 01:33:56,050 Lo que quiere decir que una vez que tenemos el vocabulario, 2238 01:33:56,050 --> 01:33:58,827 y que conocemos el alfabeto, al cual tenemos acceso, 2239 01:33:58,827 --> 01:34:01,660 podemos comenzar a escribirlo, igual a como escribimos programas de computadora. 2240 01:34:01,660 --> 01:34:04,480 Pero esto es lo que un músico vería en realidad. 2241 01:34:04,480 --> 01:34:06,970 Y para darnos una muestra de lo que pueden 2242 01:34:06,970 --> 01:34:10,000 hacer cuando toman en cuenta los diferentes sonidos de notas, 2243 01:34:10,000 --> 01:34:12,190 y los diferentes ritmos en los que tocamos las notas, 2244 01:34:12,190 --> 01:34:14,680 ¿Puedes darnos un poco más que solo una escala? 2245 01:34:14,680 --> 01:34:17,346 BRIAN: Claro. 2246 01:34:17,346 --> 01:34:21,338 [MÚSICA DE PIANO] 2247 01:34:21,338 --> 01:34:34,811 2248 01:34:34,811 --> 01:34:38,080 [APLAUSOS] 2249 01:34:38,080 --> 01:34:40,080 DAVID: Si están un poco preocupados porque 2250 01:34:40,080 --> 01:34:42,030 nos adentramos, no solo en las ciencias de la computación y de la programación, 2251 01:34:42,030 --> 01:34:42,655 sino también en la música, 2252 01:34:42,655 --> 01:34:45,000 definitivamente estoy entre los menos cómodos con esto 2253 01:34:45,000 --> 01:34:47,580 y esa es la razón por la cual Brian, amablemente se unió a nosotros hoy. 2254 01:34:47,580 --> 01:34:49,830 Pero será divertido, esperamos, en definitiva, poder explorar 2255 01:34:49,830 --> 01:34:52,872 estas relaciones y también la interacción de un ámbito con el otro. 2256 01:34:52,872 --> 01:34:54,871 Y para unir estos temas juntos, nos pareció 2257 01:34:54,871 --> 01:34:56,790 que podríamos concluir con una visualización corta 2258 01:34:56,790 --> 01:35:00,150 se trata de aproximadamente un minuto de sonidos generados por computadora, eso 2259 01:35:00,150 --> 01:35:02,940 nos da, no solo una sensación visual de algunos de los algoritmos 2260 01:35:02,940 --> 01:35:06,570 y de otras cosas que vimos hoy, sino también de los sonidos asociados 2261 01:35:06,570 --> 01:35:09,450 con las operaciones de movimiento e intercambio de cosas 2262 01:35:09,450 --> 01:35:13,110 y finalmente tocar números más grandes o más pequeños digitalmente. 2263 01:35:13,110 --> 01:35:16,110 Aquí tenemos primero, el ordenamiento por inserción. 2264 01:35:16,110 --> 01:35:21,400 [SONIDOS DE COMPUTADORA] 2265 01:35:21,400 --> 01:35:26,910 De nuevo, está insertando el número en el lugar correcto. 2266 01:35:26,910 --> 01:35:28,290 Esto, ahora, es el ordenamiento burbuja. 2267 01:35:28,290 --> 01:35:31,692 2268 01:35:31,692 --> 01:35:35,400 En tanto, podemos ver ambos y sentir todos los intercambios 2269 01:35:35,400 --> 01:35:36,090 que está haciendo. 2270 01:35:36,090 --> 01:35:45,750 2271 01:35:45,750 --> 01:35:47,460 Sentiremos la satisfacción esta vez. 2272 01:35:47,460 --> 01:35:55,240 2273 01:35:55,240 --> 01:35:57,330 Esto ahora, es el ordenamiento por selección, mediante el cual 2274 01:35:57,330 --> 01:35:59,910 seleccionamos a través de la lista, el siguiente elemento más pequeño 2275 01:35:59,910 --> 01:36:02,840 y lo ponemos en su lugar. 2276 01:36:02,840 --> 01:36:06,220 Y las barras se vuelven cada vez más y más altas, al igual que las notas, 2277 01:36:06,220 --> 01:36:07,500 o las frecuencias. 2278 01:36:07,500 --> 01:36:11,680 2279 01:36:11,680 --> 01:36:14,370 Este es el ordenamiento por mezcla. 2280 01:36:14,370 --> 01:36:18,551 Observen las mitades que se están desarrollando. 2281 01:36:18,551 --> 01:36:21,426 Este es por mucho el sonido más gratificante, al final de esta. 2282 01:36:21,426 --> 01:36:27,730 2283 01:36:27,730 --> 01:36:30,240 Este es el ordenamiento del gnomo, el cual no vimos, 2284 01:36:30,240 --> 01:36:33,720 pero es muy evidente que también tiene una forma diferente, 2285 01:36:33,720 --> 01:36:35,540 no es tan ordenado como los demás. 2286 01:36:35,540 --> 01:36:46,750 2287 01:36:46,750 --> 01:36:48,330 Entonces, esos son los algoritmos. 2288 01:36:48,330 --> 01:36:49,870 Y Brian tocó hoy para nosotros. 2289 01:36:49,870 --> 01:36:52,520 Por lo pronto, nos vemos la próxima semana.