Información básica sobre ciencias de la computación: domina la teoría detrás de la programación | Kurt Anderson | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Información básica sobre ciencias de la computación: domina la teoría detrás de la programación

teacher avatar Kurt Anderson, Computer Scientist, Multi-Media Designer

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción

      4:48

    • 2.

      Introducción a la complejidad del tiempo

      2:12

    • 3.

      Actualización matemática 1-2: funciones logarítmicas

      11:07

    • 4.

      Actualización de 1-3 matemáticas: funciones factoriales

      3:19

    • 5.

      Actualización de 1-4 matemáticas: expresiones algebraicas

      2:47

    • 6.

      1-5 N-notación

      18:55

    • 7.

      1-6 Notación de Big O

      12:58

    • 8.

      Ejemplo de 1-7 Big-O del mundo real

      9:51

    • 9.

      2-1 Cómo se almacenan los datos

      8:38

    • 10.

      Introducción a los arreglos fijos 2-2

      5:09

    • 11.

      Tiempos de ejecución de arreglos fijos de 2-3

      12:23

    • 12.

      Algoritmo de búsqueda binaria con 2-4 (búsqueda ordenada con arreglo a la matriz)

      9:59

    • 13.

      2-5 matrices circulares

      8:00

    • 14.

      2-6 matrices dinámicas

      15:51

    • 15.

      Revisión de matriz 2-7

      7:57

    • 16.

      Ejemplos de 2-8 array del mundo real

      5:42

    • 17.

      Nodos 3-1

      4:19

    • 18.

      Lista enlazada 3-2

      13:36

    • 19.

      Tiempos de ejecución de listas vinculadas

      14:59

    • 20.

      3-4 listas doblemente enlazadas

      8:07

    • 21.

      Puntero de cola 3-5

      5:14

    • 22.

      Revisión de listas vinculadas

      3:31

    • 23.

      3-7 ejemplos de listas enlazadas del mundo real

      3:00

    • 24.

      Pilas de 4-1

      9:41

    • 25.

      Ejemplo de pila 4-2

      11:05

    • 26.

      4-3 colas

      8:48

    • 27.

      Ejemplos de colas de 4-4

      9:42

    • 28.

      Tiempos de ejecución de cola y pila de 4-5

      6:03

    • 29.

      Ejemplos de 4-6 de apilar y colas del mundo real

      7:01

    • 30.

      Introdcution con algoritmos de clasificación 5-1

      1:40

    • 31.

      Ordenación de burbujas 5-2

      10:12

    • 32.

      Ordenación de selección 5-3

      9:49

    • 33.

      Ordenación de inserción 5-4

      9:03

    • 34.

      Ordenación rápida 5-5

      14:38

    • 35.

      Tiempos de ejecución de clasificación rápida

      10:31

    • 36.

      Ordenación de fusión 5-7

      11:57

    • 37.

      Tiempos de ejecución de ordenación de fusión

      7:39

    • 38.

      5-9 Estable frente a no estable

      6:34

    • 39.

      5-10 ejemplos del mundo real de algoritmos de clasificación

      4:01

    • 40.

      Conceptos básicos de los árboles

      7:37

    • 41.

      Árbol de búsqueda binario 6-2

      8:34

    • 42.

      Tiempos de ejecución de 6-3 BST

      7:36

    • 43.

      6-4 recorridos de árboles

      13:04

    • 44.

      6-5 ejemplos de árboles del mundo real

      4:29

    • 45.

      Timing: preparación de proyectos

      6:47

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

8480

Estudiantes

6

Proyectos

Acerca de esta clase

¡Domina la teoría para convertirte en buen programador! 

Si quieres aprender la teoría que hace a los mejores programadores, ¡has venido al lugar correcto!  Es perfecto para cualquier persona interesada en aprender los fundamentos de la teoría de la informática. 

¡No es necesaria experiencia previa! 

La ciencia y la tecnología de la computación a menudo se consideran cosas solo para mentes análogas. Sin embargo, creo que la tecnología y su teoría son para todos. Así que diseñé este curso para enseñar cada tema de varias maneras fáciles de digerir. A través de estos múltiples pasos de refuerzo, creo que cualquiera puede seguir y tener éxito. 

¿Por qué es importante la teoría de la programación? 

Comprender la teoría de la informática es lo que diferencia a los grandes programadores de la media. La teoría de la programación es algo que trasciende un único lenguaje de programación. Te da habilidades y técnicas que puedes aplicar a cualquier lenguaje de programación que toques. Aprender la teoría de la programación es tan importante, si no más, que aprender un lenguaje de programación singular como Java o C++.

La programación se basa en la resolución de problemas. Analizar un problema y encontrar la manera de que una computadora pueda ayudar con ese problema. La ciencia de la computación es la práctica de este proceso de análisis. Repasa las técnicas y los conocimientos necesarios para diseñar código eficiente y sostenible. 

En esta lección cubriremos lo siguiente: 

  • Sistema de números binarios

  • Notación N

  • Notación de Big O

  • Cómo analizar un programa

  • Arrays y sus ventajas

  • Los nodos y su importancia

  • Listas Linked y sus ventajas e implementaciones

  • Stacks implementados con arrays y listas para enlazarse

  • Colas de trabajo implementadas con matrices y listas vinculadas

  • Diversos algoritmos de clasificación y sus comparaciones

  • Árboles y árboles de búsqueda binaria

  • ¡Y mucho más! 

Conoce a tu profesor(a)

Teacher Profile Image

Kurt Anderson

Computer Scientist, Multi-Media Designer

Profesor(a)

Hello, I'm Kurt.

I am a self-taught multi-media designer and computer scientist who has helped bring the creative vision of clients all around the world to life. Having 8+ years of experience in the Adobe Production Suite has given me a strong tool-set to create anything from videos to websites. Along with this, having a degree in Computer Science has given me a strong analytical mind for dealing with complex problems. Through these two disciplines I create a unique blend of efficiency and creativity. I believe anyone can become a designer or programmer. All it takes is practice.

I am also a world traveler and have lived in and learned from many different countries. During a 6 month stay in Japan, I became fascinated with their people's drive and craftsmanship. I try to i... Ver perfil completo

Habilidades relacionadas

Desarrollo Lenguajes de programación
Level: Beginner

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Introducción: Hola a todos. Y bienvenidos a esta habilidad share Clase de Ciencias de la Computación 101. Este es un video de introducción. Mi nombre es Kurt Andersen. Voy a ser el instructor para tu clase que repasa los conceptos básicos de informática. Una especie de buena visión general de todos los temas que golpea la informática y algunas de las áreas principales , como en notación y tiempo y cosas así. En este curso, vamos a aprender estas siete cosas, y las voy a repasar en sólo un segundo. Pero quiero darle una especie de idea de por qué queremos aprender estas cosas. informática es la forma en que miramos la programación y los algoritmos para que pudiéramos hacerlos más eficientes. Y este término, llamado escalable escalable, significa que nuestros algoritmos se ejecutarán eficientemente si ponemos 10 piezas de datos o si ponemos , por ejemplo, un millón de piezas de datos. Deseamos que nuestros programas funcionen eficientemente con base o esencialmente con la mayor cantidad de datos posible . Piensa, por ejemplo, si estamos construyendo el próximo Facebook, imagina si solo lo diseñaron para 10 personas. Eso sería un problema, porque cuando llegaron hasta 1 millón de personas. De repente hay un gran tema. Hay tiempo, problemas. La gente no puede cargar cosas porque nuestros servidores y son algoritmos son todos ineficientes. Y si es demasiado ineficiente, en realidad podemos crear un algoritmo que haga exactamente lo mismo de dos maneras diferentes. Una de las formas en que podría tardar 10 años en terminar. Y de la otra forma podría tardar 10 segundos. Por lo que no queremos crear los algoritmos que tardan 10 años. Queremos crear los algoritmos que tardan 10 segundos. Estaremos repasando cosas así a lo largo del curso, rompiendo un par de problemas y obteniendo el tiempo para que pueda mostrar la diferencia entre los tiempos en esto, el curso usando estos diferentes algoritmos. Y luego al final del curso, vamos a estar repasando un proyecto. Entonces repasemos esto y hablaré del proyecto. Lo primero que hacemos es un poco de refresco matemático. Sé que podría pasar un poco desde que has estado en una clase de matemáticas, así que solo vamos a cubrir un par de lo básico. Algunas de las cosas que te ayudarán a lo largo del curso. Este no es curso intensivo de matemáticas por ningún medio. Estamos aprendiendo una especie de nuevas áreas, pero te ayudará si tienes una base sólida. Entonces vamos a un rápido refresco de matemáticas sólo para que ustedes puedan recordarlo. Y si tienes un poco de, ah, fondo tembloroso en algo, puedes buscarlo un poco y aprender algo más sobre eso antes de empezar. Entonces tenemos en notación que es una especie de los principios básicos detrás de la informática. Es nuestra herramienta en la caja de herramientas la que nos permite mirar dos algoritmos y decir cuál es más rápido. Entonces si miro a Al Gore que digo que está en log in versus otro algoritmo, que está en cuadrado como una computadora, científicos, sabemos lo que significan esos. Ahora podemos etiquetar las cosas de manera diferente y comunicar las velocidades del dedo del pie de otros científicos informáticos . Eso es lo que el en notación está trabajando sobre el almacenamiento de datos y un aumento. Esta es una forma de almacenar datos, uh, uh, disponibles en cada lenguaje de programación moderno como Java JavaScript, cosas como el desarrollo de IOS, que suele ser Objective C o Swift o Andrew Development, que es trabajo. Son Escocia todo un aumento listas enlazadas, pilas y colas, existen en todos esos. Entonces vamos a repasar nodos y listas enlazadas. Estos ambos hay casi una especie de opuestos el uno del otro. Por lo que hacen cosas diferentes, y te permiten resolver diferentes problemas de diferentes maneras. Pilas y colas que se piensan en un que casi como Cuando estás esperando en fila, hay cosas en cola. Entonces esta persona va, y luego esta persona va, y luego esta persona va, y si la gente entra, todos empiezan a alinearse para que realmente podamos crear eso en un algoritmo, lo que nos ayuda en un montón de situaciones diferentes. Van a ir por encima de los álbumes de inicio. Esta es una especie de línea de base de nuestro contenido en ciencias de la computación. Aquí siempre es donde empieza la gente. Hay un montón de diferentes, y te permite ver una progresión. Iban a ir por algún tipo realmente malo de algoritmos de holograma que tardan demasiado, y vamos a trabajar nuestro camino hasta algunos algoritmos de clasificación realmente buenos que son eficientes pero un poco complejos. Eran ir por encima de los árboles y el árbol de búsqueda binario o el BST. Esos airean dos temas importantes dentro de la informática. Y luego finalmente, vamos a hacer el proyecto. ¿ Fue ese el final del curso? Y el proyecto de producto es esencialmente que vamos a estar tomando todo esto y bajarlo a un solo problema. Hay un problema. Al finalizar el curso, tenemos 10 millones de piezas de datos. Estoy tratando de ordenar esos datos, y quiero que pases por el problema y luego me digas cuánto tiempo tardará en correr. Podrás decírmelo al final de esto y entonces ¿cómo puedes hacerlo más eficiente? Habrá un par de cambios rápidos y fáciles, algunas estructuras de datos. Puedes cambiar cosas así que lo harán más eficiente, y verás que el tiempo va realmente diferente, dependiendo de cómo implementes estos cambios. Entonces esos son nuestros cursos, es lo que vamos a estar aprendiendo. Va a ser un gran viaje. Hay mucho que aprender, y poco a poco comprenderás más sobre el mundo de la informática a medida que lo atravesamos. Gracias a todos, y empecemos con este curso 2. Introducción de la complejidad de tiempo de 1 a 1: Entonces vamos a estar iniciando este curso donde ah comienzan muchos cursos de CS, y eso es en tiempo y complejidad. El motivo por el que empezamos la complejidad del tiempo es porque nos da un estándar, algo con lo que podemos comparar nuestros programas y algo de lo que podemos hablar con otros científicos de la computación. Es una forma en la que pueden, sobre todo los profesores y los que nos enseñan nos pueden comunicar. Por qué un cierto algoritmo de programa, nuestra forma de hacer algo es ineficiente versus otra manera. Por lo que es la forma estándar de comparar diferentes fuera de habitación. A eso es a lo que todo se reduce. Y lo que quiero decir con una forma estándar, es el hecho de que un científico de la computación de digamos, los Países Bajos y de América y de la India todos podrían comunicarse exactamente de la misma manera porque usamos ciertas notaciones como la notación grande O. Entonces, por ejemplo, se vería algo así. Esto es gran notación O, Y así cualquier científico informático entiende lo que esto significa, y más adelante vamos a estar discutiendo eso también y normalmente aprendemos. Utilizas ciertos pequeños aspectos, como en en cuadrado u otros factores escalables. Entonces no estamos usando como si sabes que funciona en 25 unidades tiempo porque no sabemos lo que 25 unidades significan. ¿ Se necesita 25 ciclos de reloj que tardan 25 segundos de la toma? ¿ Se ejecutaría en 25 ciclos en mi computadora verso tu computadora? Es muy difícil comparar cuando vas por eso. Entonces lo que estamos haciendo Estos iban a estar mirando el estándar para esto, una forma que podemos comparar con algoritmos que es completamente independiente de la computadora, que se está ejecutando en la zona, ese mundo, qué tan rápido el La conexión a Internet es sólo poder mirar a dos de ellos y poder compararlos y nos permite descubrir formas en que podemos mejorarnos. Entonces si podemos mirar un cierto tú sabes, una cierta notación, entonces podemos averiguar cómo ser mejor que esa notación y qué cosas son peores que esa notación, y eso nos da mucho margen de maniobra. Nos da la capacidad de mejorarnos un objetivo establecido e investigar en diferentes áreas al igual que cualquier otro aspecto. Cualquier otra ciencia, vamos a estar repasando los fundamentos de esta ciencia y cómo podemos analizarla y tratar de averiguar cómo hacerlo mejor. 3. Refresher: de 1 a 2 Math funciones Logarithmic: la informática se basa en un fundamento de las matemáticas. Básicamente es solo matemática aplicada que arrojas a un procesador y luego lo hace todo por ti. Y ya sabes, puedes seguir construyendo fuera de esto para hacer tus programas. Pero en esencia, es matemáticas, y por eso solo quiero repasar un par de términos matemáticos que se van a utilizar a lo largo del curso. Ahora, no te preocupes. Este no es un curso de teoría matemática pesada como ni nada por el estilo. Ni siquiera va a haber realmente ningún cálculo. No obstante. Vamos a estar haciendo referencia a alguna terminología matemática, alguna nomenclatura matemática, que quería asegurarme de que todos estamos en la misma página antes de avanzar en ese tipo de nomenclatura. Y son sólo algunas cosas que, ya sabes, hemos aprendido tal vez en la preparatoria. O hemos aprendido una o dos veces, y simplemente no usamos realmente en el mundo real. Pero cuando te metes en la informática, se vuelven un poco más prevalentes. Y como dije, no tienes que saber hacerlo todo a mano, sino sólo entenderlos. Eso es lo que quiero llegar al punto de es que puedas entender estas cosas diferentes y donde lo puedes ver como digamos que tenemos un tiempo de ejecución de un algoritmo. Podemos entender lo que significa ese término matemático en relación con el tiempo de ejecución. Y así es en lo que voy a repasar. Esta conferencia sólo está repasando algún material de actualización para que cuando lo volvamos a golpear más adelante en el curso, entenderás a nivel base, y puedes especie de ampliar tus conocimientos un poco más fácil. lo primero que se quiere hablar es de algo que se usa en informática, pero no mucho en otros lugares. Y esa es la idea de log. Entonces aquí mismo se hace referencia, o la nomenclatura para es así. Está basado en registro, algo así como digamos que se basa en de variable aquí o un número es igual a algún otro número. Entonces, por ejemplo, pongamos ocho ahí mismo, y así esta es una función de registro. Ahora, ¿qué es exactamente una función de registro? Bueno, lo que es abreviado es algo conocido como una función rítmica log y una función rítmica log es lo inverso encontrando lo contrario, lo inverso de una función exponencial. Entonces un log es lo inverso de un exponencial. Ahora bien, ¿qué es una función exponencial? Digamos que lo rastreamos a lo largo del tiempo. Seguimos el crecimiento de ambas funciones A lo largo del tiempo. Una función exponencial va un poco algo como esto, donde vas directamente hacia arriba en el aire significa porque después de cada iteración el cambio crece. Entonces, por ejemplo, tal vez de 0 a 1, cambió por uno de 1 a 2. A lo mejor cambió por dos de 2 a 3. A lo mejor cambió por cuatro, luego ocho, luego 16 luego 32 64. Y sigue yendo cada vez más alto y más alto hasta cuando haces uno cambia tus miles de millones o billones de números en movimiento al siguiente. Entonces esa es una función exponencial. Estos son bastante malos en informática. Si estás hablando de tiempos de ejecución porque eso significa que cuantas más cosas le pongas, simplemente sube al infinito de cuánto tiempo va a tardar Now Una función de registro es lo inverso de esto. Es lo contrario de esto, ¿ y cuál sería lo contrario de esto? Bueno, eso es simple. Eso si tomas esto y sabes exactamente lo contrario, así que vamos así en su lugar. Entonces lo que es esto, es que va a tener un gran cambio al principio. Pero con el tiempo, el cambio entre números va a llegar cada vez menos y menos con el tiempo. Entonces donde ésta va casi arriba en una línea vertical recta, ésta va casi hacia una línea horizontal recta. Esto es bueno porque eso significa que cuantas más cosas ponemos en nuestro programa, es casi como si el tiempo de ejecución no estuviera cambiando en absoluto. Se está poniendo cada vez menos y menos hasta que nos está llegando a gustar esa línea horizontal. Y es por eso que las funciones de registro son importantes porque son lo inverso de exponenciales. Y hay algunos algoritmos que se ejecutan en este tipo de tiempo, Así que ese es el lado teórico de la misma. Echemos un vistazo a un par de ejemplos, así que veamos primero. La ecuación para este log de X es igual a nuestro log basado X de por qué es igual a Let's Go b y que, su vez, entra en la función exponencial. Entonces este es un log con mi función. Esta es la función exponencial y la función exponencial es x de B igual. ¿ Por qué? De acuerdo, entonces ensangrémonos algunos números aquí para que salgamos de este tipo de variables abstractas, extrañas y realmente entendemos esto un poco mejor. Entonces si llevamos dos a la B y es igual a ocho, entonces, ¿qué significa esto? Bueno, esto significa que si tomamos dos al algo y si, por ejemplo, lo que estamos diciendo aquí es, por ejemplo, al uno igual 22 a los dos equivale a cuatro. Y eso es porque es sólo demasiado veces para que te lleves 22 veces dos a los tres es igual a ocho. Y eso son sólo dos veces. Dos veces dos estás tomando para multiplicar por sí mismo tres veces equivale a ocho, y así sucesivamente y así sucesivamente. Entonces estamos diciendo es que hay un número ser que existe tal que es igual a ocho. Bueno, por aquí sólo averiguamos eso. Es de dos a los tres igual a ocho. Entonces si enchufamos tres para B, tenemos que a los tres iguales ocho. Este lado equivale a ocho. Esto hace ciclos a. Esa es una buena expresión. Entonces aquí arriba, B es tres. Bueno, ¿cómo nos ayuda esto? ¿ Qué nos dice esto? Bueno, si transformamos esto en una función de registro, en realidad podemos sacar un poco de información de ella. Entonces si obtenemos log of, enchufemos nuestro valor X, nuestra X justo aquí. Entonces es una base larga para. Y entonces ahora enchufemos a nuestros, uh, nuestros escritores B o reales R Y Tanto tiempo, basado dos de ocho. ¿ Qué es eso igual? Bueno, sabemos que es igual a tres. Entonces lo que podemos hacer con la función rítmica log es que en realidad podemos encontrar este número más fácil. Nos confinamos que sea más fácil. Y esto es importante porque con una función rítmica log, podemos enchufar números aquí y podemos conseguir números en el lado derecho donde con una función exponencial, enchufamos números y a la izquierda, y obtenemos números por aquí. Entonces esto nos ayuda porque ahora lo que podemos hacer es que podemos ver la relación de por qué es importante una función de registro. Digamos que tenemos esto o hablemos primero de la base. Entonces, como, ¿por qué? A qué es larga base con base larga 10. El fundamento es justo lo que estamos tomando el número dos. Entonces, por ejemplo, si tendemos a la que tendemos a la a y tendemos a los tres o tendríamos es 10 luego 100 luego 1000 y eso es por esto por aquí tienden a los judíos es 10 veces 10. Así es 110 de los tres es sólo 10 veces 10 veces 10. Es 10 veces tres de sí mismo, así que solo son 1000. Por lo que en esta situación se registraría basado 10 porque el número aquí mismo es un 10 y esto es que no hay importancia esto se puede hacer. Registro basado 27 Log Place 98 Log based 1000 Realmente no importa. Ciencias de la computación. Nos quedamos con el basado en Log, también, y eso lo explicaremos un poco más tarde. Pero sólo se reduce a cómo las computadoras tienen realmente sólo un cero y uno con el que trabajar. Entonces están citando entre comillas dos estados separados aquí, y es por eso que dejamos usar Log base a eso se te pasó por encima de la cabeza. Eso está perfectamente bien. Simplemente entiende que usamos el también. Entonces digamos que teníamos basado desde hace tiempo Digamos que tenemos un algoritmo que se ejecuta en tiempo de registro. Digamos que también hemos basado desde hace tiempo , y esta es la cantidad de información que entra. Entonces digamos que está basado desde hace mucho tiempo. Dos de nosotros tenemos 64. Entonces tal vez tengamos una cuenta de Facebook y estamos ejecutando algún algoritmo en Facebook que pasa por nuestros amigos. Entonces tenemos ¿cuántos amigos en esta situación? Tenemos 64 amigos ¿Y cuánto tiempo va a tardar? Bueno, nuestra ecuación se ejecuta en log, así que completamos ese 60 extranjero, y va a tomar algo de valor por aquí. Y en esta situación, sólo podemos irnos. ¿ Qué será? ¿ Qué es hasta el final que equivale a 64 que sale a ser más o menos dos a la sexta, que es que se puede ver justo aquí abajo. Va a ir 8 16 Así que si vamos al cuarto, van a ser 16 al 5 32 al 6 64 ¿verdad? Al igual que así. Entonces, ¿qué es del 2 al 6? Entonces ahora tenemos a los seis. Y así ahora tenemos por aquí seis. Entonces, en este lado derecho, lo que tenemos es el tiempo de ejecución. Entonces digamos que esto son segundos. Entonces ahora tenemos un algoritmo aquí mismo. Contamos con base de troncos. Dos de 64 piezas de datos equivale a un tiempo de ejecución de seis segundos. Bueno, vamos a hacer que esto vaya. Ah, un poco más en el lado extremo. ¿ Por qué el largo es un algoritmo tan bueno? ¿ Por qué es tan importante en la informática? Bueno, si pudiéramos conseguir un algoritmo que sea así, podemos empezar a ver algunas cosas realmente, realmente aseadas. Entonces sigamos adelante y despejemos un poco de espacio aquí y veamos esto un poco más. Entonces, ¿y si tuviéramos largo de dos de ahora? No lo sé. Uno. Doblemos esto. Entonces 28 Bueno, eso va a igualar siete segundos. Por lo que hemos duplicado la cantidad de información que está llegando, y sólo hemos subido un segundo. Sólo hemos cambiado un poquito. Vamos aún más alto. Digamos que queremos en lugar de duplicar esto o sí, sigamos doblando. Vayamos al 56 aquí mismo y ahora tenemos ocho segundos para que veas que el cambio entre éstos se está haciendo cada vez mayor, pero los segundos sólo van subiendo linealmente. Van por Lee subiendo un segundo cada vez. Vamos a extrapolar esto. Digamos que llevamos dos al no sé, digamos 32. ¿ Y por qué es eso importante? Bueno, a la 32. ¿ Qué es a la 32ª igual? Fue un número muy, muy grande, y ese número pasa a ser de 8 mil 589 mil o 589 millones, 934 mil 592. ¿ Qué tiene de significativo esto? Este es el primer número de esta secuencia que es mayor que la población del planeta . Y si estamos lidiando con Facebook aquí, eso significa que nuestro algoritmo en Max correrá 33 segundos. No irá muy lejos en que no se puede tener más amigos de los que hay gente en el planeta. Entonces simplemente tuvimos esto. Tenemos este increíble algoritmo aquí mismo donde no importa cuántos datos sean. Siempre va a correr 33 segundos o menos ya sean estos milisegundos de aire o estos microsegundos de aire u otro tipo de unidades de tiempo. Esta es una tasa de crecimiento realmente grande. Eso significa que la siguiente versión de esto sería si volviéramos a duplicar esto, por lo que serían 16 mil millones. Entonces tenemos un cambio de un segundo pasando de ocho mil millones hasta 16 mil millones y luego un segundo más para subir a 32 mil millones. Entonces es por eso que los registros son importantes es por esta relación de la que hablamos aquí , cómo no crecen mucho con el tiempo. Y si sigues saliendo al infinito, casi se convierten en una línea horizontal donde puedes poner tantos datos como quieras lanzar y tu algoritmo todavía va a correr básicamente la misma velocidad. Entonces esa es la función rítmica log. Es muy, muy especie de función simple una vez que lo entiendes. Pero sigue siendo bastante raro en el agujero, toda la discusión sobre matemáticas y es algo que realmente no vemos con demasiada frecuencia. Entonces eso es lo primero que quería tipo de tapar justo antes de saltar a ella. Lo siguiente que quiero cubrir es otro que mucha gente ha visto, pero realmente no entienden a nivel base, y eso es algo conocido como factorial 4. Actualización de 1 a 3 Math funciones factoriales: Entonces, ¿qué es exactamente un factorial? Bueno, un poco se veía como algo básico como esto. Faux tres y luego un punto de explicación O tal vez 27 una explicación Punto. Um, ¿qué es exactamente? ¿ Significa un factorial lo que es un factorial? Es justo Si lo desglosas, que sea el número que esté en el spot izquierdo multiplicado por todos los números procediendo. Entonces en este caso, el hecho de tres factoriales va a ser igual a seis. Va a igualar seis, que es una vez 22 veces tres. Por lo que una vez dos equivale a 22 veces tres equivale a seis. Por lo que tres factoriales equivalen a seis. Notarás algo muy importante de esto es que esta tasa de crecimiento es una locura. Entonces si fuimos uno factorial, eso sólo se va a comer uno dos factorial legal una vez 22 Así que es, ya sabes, bastante similar al resto de las tasas de crecimiento. Tres. Fábrica mucho igual seis cuatro factoriales. Entonces tomamos ese seis y lo multiplicamos por un cuatro, que va a ser 24. Entonces en lugar de sólo una vez dos veces tres, tenemos una vez dos veces tres veces cuatro, así que se puede ver que son 24 ahora, cinco factoriales. Vamos a tomar este número, que es este número de aquí multiplicado por cinco. Por lo que sólo podemos hacer unas matemáticas rápidas. ¿ Por qué eso puedes ver que ya estamos sacando el punto en el que vamos a tener que hacer como , um, um, básicamente la mano de matemáticas para que estas cosas se pongan en marcha. Y sólo estamos en el número cinco eran, como con troncos. Podríamos simplemente seguir subiendo y subiendo y subiendo no era demasiado difícil. Seis. Bueno, vamos a pasar por esto por seis. De vez en cuando tenemos 120 así que van a ser 600. Eso me da 720 ahí mismo, ¿verdad? Sí. 720 y se puede ver o 820. Ley No. 7 20 Se puede ver que este número está creciendo en una cantidad sustancial. Cada cambio es cada vez más donde teníamos un cambio de uno justo aquí. Ahora tenemos un cambio de cuatro. Y luego un cambio de, um, aquí abajo tuvimos un cambio de Digamos, vamos a ver 18 aquí. Tuvimos un cambio de 96 aquí. Tuvimos un cambio de 600 se pudo ver que esto se está saliendo de control. Tan factorial ahí algo que nunca queremos encontrar ahí siempre representado por cualquiera como y en, lo que solo significa cualquier número. ¿ Se puede enchufar ahí que solo, como, especie de Si queremos ir genérico, podemos poner una variable en el punto de explicación, o podemos poner un número para obtener una respuesta real. No obstante, esto es lo que es un factorial. Es sólo una multiplicación de cada número procediéndolo Así que como dije, un factorial de un siete es justo o uno son siete. Factorial es sólo una vez dos veces tres veces cuatro veces cinco veces seis veces siete. No hay nada demasiado complicado al respecto. Pero como dije, mucha gente no ve esto, especialmente se les puede ver una o dos veces en clase de matemáticas, pero no de nuevo. En ocasiones hablaremos de factorial es que son algoritmos muy malos. Si tu programa termina en Factorial, pueden tomar Como dije, podrías poner en un programa que quizá sea cuatro factorial y que va a correr muy rápido. Y luego si pones un programa que son, ya sabes, 20 fábricas. Simplemente, ya sabes, 16 piezas más de datos que podría nunca completar. Ya sabes, el tiempo que podría tardar en completar el sol podría quemarse más rápido que eso. Entonces esa es una especie de la importancia de un factorial. 5. Refresher: de 1 a 4 Math expresiones algebraicas: Y luego finalmente, solo quería repasar algún álgebra básico o algunas cosas que podrías ver en el curso. Entonces, por ejemplo, podríamos ver algo como esto, que es N iniciar sesión. Entonces, ¿qué significa esto? Bueno, esto es sólo una especie de función genérica. Es sólo mostrarte lo que una tasa de crecimiento o lo que una función estaba usando en esta situación. Entonces digamos que A es igual a la cantidad de datos, la cantidad de datos. Entonces si tuviéramos una función que es así, todo lo que estamos diciendo es que digamos que nuestra entrada sale a ser 700. No sabemos si va a ser porque, ya sabes, sabes, los programas son dinámicos. Corren en diferentes espacios. En ocasiones una persona podría tener 20 amigos de Facebook. En ocasiones podrían tener 1000. No sabemos cuántos amigos de Facebook van a terminar teniendo. Entonces por eso escribimos algo como esto. Simplemente casi como un marcador de posición. Nos dice lo que vamos a usar cada vez que tengamos este número. Pero antes no sabemos realmente qué es. Este es un principio básico del álgebra, y entonces lo que podemos hacer cuando tenemos una fórmula como esta cuando entendemos el algoritmo, el álbum de computadora o el uso es que una vez que obtenemos un ejemplo concreto, esto es como el abstracto. Esto es algo que aún no sabemos. Podemos enchufar ese ejemplo concreto aquí, y en realidad podemos conseguir un número. Por lo que en esta situación sería 700 veces log de 700. Y digamos que estos base aérea a Vamos con algo que realmente podemos calcular en nuestras cabezas. Digamos que es igual a, um, Vamos con 16 irá un 16. Entonces eso significa que va a ser 16 veces largo, basado dos de 16. Y aprendimos en el último Esto es solo que sale a log de qué? O a la base justo aquí a de lo que equivale a ese 16. Bueno, dos veces cuatro va a igualar 16. Es dos veces dos veces dos veces 22 veces, dos veces dos es igual a ocho. Entonces este es el 48 16. Entonces ahora sabemos que cuatro es la respuesta a esto, por lo que tenemos 16 veces para las que saldrán. Teoh cuatro veces. Entonces van a ser 40 va a ser 64 ¿verdad? Al igual que así. Y entonces eso es lo que tendremos un par de estos. Es decir, se pueden conseguir, ya sabes, se ponen más complicados de lo que podrían estar en cuadrado de log al en tercero o en más para cerrar sesión en más de tres o algo por el estilo. Pero sólo entiende que cada vez que tengas una función como esta, todo lo que significa es que estamos tomando estos dos van a ser el mismo número que ambos son el extremo variable. Entonces ambos van a ser exactamente el mismo número y donde cada vez que obtengamos un número concreto , vamos a enchufar ese número. Creo que eso es bueno. 6. 1-5 N-notation: Por lo que tenemos una buena comprensión de hacia dónde nos dirigimos en esta dependencia. Empecemos a construir ese proceso. Empezar a entender esto un poco más y repasar algo llamado en notación en notación es solo una forma de ver cómo funciona nuestro programa representado como una función de in. Entonces eso es importante aquí mismo. Se representa como una función de en una función de fin. Y entonces lo que esto significa es que vamos a tener un número arbitrario llamado. Entonces, por ejemplo, tenemos justo aquí y ¿en qué está exactamente? Por lo general se juzga por cuántas piezas de datos están siendo procesadas por un programa. Entonces básicamente lo que es un programa es que tienes un montón de entradas aquí mismo, así que llamaremos a estos insumos. Eres un montón de en puntos. Vienen a nuestro programa algo así como una caja negra, si se quiere. Y entonces tienen un montón de salidas aquí mismo. Y así es básicamente como funcionan los programas. Tienes manojo de insumos, se procesan de alguna forma, y luego se almacenan o salen. Ponlo de alguna otra manera. Entonces lo que en es es cuántas entradas estamos obteniendo cuántas veces tenemos que ejecutarlo y en cada proceso. Entonces es básicamente cómo, por ejemplo, en esta situación, es cómo podrían estar los insumos de Maney en cuántos tipos de cálculos necesitamos. Y entonces cuántas salidas salen también podría estar adentro. Entonces es algo que es lo suficientemente arbitrario como para que pueda usarse en cualquier proceso de la ejecución del programa, pero aún así nos permite entender cómo se reaccionaron los programas. Entonces, solo demos un paso atrás y veamos esto de una manera un poco más explícita . Digamos que en esta situación en igual a 100 por lo que ahora realmente tenemos un número aquí. Y así si enchufamos el mental, ya conoces todas estas diferentes versiones por aquí, digamos que esto no está en algoritmo y comparándolo con un algoritmo en cuadrado. Se puede ver que no importa cuál sea este número, este número siempre va a ser mucho, mucho más grande, y en esta situación es mucho más grande, y en realidad es 1000 contra 100. Y la razón por la que no solemos enchufar números explícitamente es porque la cantidad de datos que se están procesando por lo general nunca se garantiza como un número determinado. Por ejemplo, veamos digamos que nuestro programa ingresa la cantidad de amigos de Facebook que tienes. Por lo que nuestro programa ingresa la cantidad de amigos de Facebook que tenemos. Es en poner estos datos en nuestra caja. Pero, ¿cuántos amigos de Facebook tienes? Porque te puedo decir que soy mi número va a ser diferente a tu número. Tu número va a ser diferente a probablemente mucha gente tomando esta clase. Entonces si estamos construyendo un algoritmo para específicamente 250amigos, no va a funcionar para la mayoría de los casos. Entonces lo que hacemos es construir algoritmos que pueden tomar una cantidad arbitraria de datos. Y en esta situación, eso es exactamente lo que en realidad llamamos. Y así se puede tomar en cantidad de datos. Y luego una vez que lo procesa y sale, se va a dar salida en cantidad de datos. Y así con estos, este tipo de clasificación fueron capaces de comparar la de al Berlin sin entender nunca cuántos números van a poner. Y eso es sólo porque aquí estamos viendo órdenes de magnitud. No estamos viendo la diferencia entre 10 y ya sabes, nueve unidades de tiempo o lo que sea. No obstante, sale que estamos mirando en verso en cuadrado. Entonces, por ejemplo, en esta situación, digamos que si ponemos en cantidad de amigos de Facebook que va a llevar en cantidad cuadrada de tiempo. Y ahora entendemos que tal vez si tuviera 10 amigos, esto funcionaría bien y sería solo, ya sabes, saldría a, como, como, ¿qué, 100? Pero, ¿qué pasa si tuviera un 1,000,000 de amigos, entonces cuál saldría a ser ese número? Sería un número absolutamente masivo, y la diferencia de cálculo sería enorme en comparación con si se tratara sólo de una entrada fuera. Y así vamos a echar una especie de vistazo a esto un poco más en profundidad, y se puede ver que hay un montón de maneras diferentes que podemos representar aquí mismo , y esta es una gráfica de su escala a lo largo del tiempo. Y entonces lo que estamos tratando de averiguar es cómo lo hace en escala hacia el infinito? Entonces la razón por la que estamos en cuestión importante es porque, como escala hasta el infinito es la posibilidad de lo que nuestro programa podría ingresar. Entonces no estamos mirando ¿Cómo escala a 100 o 1000 que estamos mirando? Si ponemos un 1.000.000 de piezas de datos o un 1.000.000.000 de datos en esto, ¿cómo va a reaccionar? Y estas gráficas cuentan la historia. Entonces aquí abajo tenemos algo llamado tiempo constante, que es este corchete o esta Ah, columna justo por aquí. Y tan tiempo constante significa que si ponemos el 1110 1 pase lo que pase, siempre va a correr a la misma hora exacta, no hay fin involucrado. Porque pase lo que pase, va a salir exactamente a la misma hora, entonces el de arriba que en realidad es log base to of in. ¿ Recuerdas cuando hablamos del sistema binario? No usamos registro basado 10 como la mayoría de las matemáticas porque no estamos tratando con el sistema de números de decenas . De lo que estamos tratando aquí es el sistema de números de dos. Entonces usamos base larga para y luego por aquí tenemos la raíz cuadrada de in in in log event en cuadrado dos D y en factorial y se puede ver que hay una gran, gran diferencia entre estos dos justo aquí y estos dos justo aquí. Y se puede ver que el ángulo se hace más grande y más grande a medida que esto sube directamente al infinito. Y si realmente sacaste esto, ambos hasta el infinito, esto parecería como si fuera casi recto en el aire. Bueno, esta casa se vería como si estuviera, ya sabes, todavía en el ángulo de 45 grados. Y así es en eso en lo que estamos tratando de enfocarnos. Aquí está, cuando los comparamos, ¿cuánto diferente se van a conseguir con el tiempo? Por ejemplo, esto podría parecer un cambio muy pequeño, pero si ponemos estos números en infinito, empezarás a ver que la diferencia empieza a salir. Entonces echemos un vistazo a un par de ejemplos. Por aquí tenemos el número es cero, um, um, 10 101,000 en igual a 10 1 Así que en esta situación, lo que tenemos aquí es que tenemos el número de la izquierda y luego un algoritmo que corre tiempo de fin y los tiraré que corre en tiempo cuadrado en un algoritmo que se ejecuta en log in time y luego por aquí está el tiempo constante. Entonces si ponemos en una sola pieza de datos, notarás que lo que tenemos es básicamente todos son exactamente iguales y cero no siempre tiene sentido. Por lo que el registro es un poco complicado. En ese sentido , pondrá un cero o indefinido en ocasiones. Pero sólo significa que corre en una sola vez, Así que todos estos son exactamente iguales. Ahora empezamos a escalar más allá de uno. Verías, todos empiezan exactamente en el mismo lugar. Empezamos a escalar más allá de uno en nuestro 10. Entonces, ves, todos están empezando aquí y ahora nos estamos moviendo al 10 que es justo aquí. Empezarás a ver que las diferencias salen, va a apenas 10 en cuadrado, llega a lo más alto de esta tabla a los 100. Por lo que ya hay una gran diferencia aquí. Y luego terminar Log of end se pone hasta alrededor de 33. Ya puedes ver que es justo por ahí Ahora, si subimos una unidad más de Decca a la derecha, digamos que nuestro número está 100 bien adentro. Sube hasta 100 en cuadrado sube hasta 10,000 lo cual es, si pones 100 de estos y los apila encima uno del otro. Es lo grande que se pone el número. Ahí es donde está allá arriba. Entonces esta es una de ellas y hay que poner 100 más de éstas. Entonces esto pasaría por mi techo y luego arriba en el cielo, como probablemente dos o tres pisos recién comparados con los 100 de aquí, que es, ya sabes, justo aquí. Podrías incluso grande en eso en 1000. Y lo que tenemos es en lugar de los 1000 aquí mismo, que nos da así que si solo escalamos esto con el tiempo, probablemente estaría en algún lugar poniendo todo lo grande aquí arriba. Este es un millón, que es si tomaste 1000 de estos y los apilaste uno encima del otro y seguías subiendo al cielo. Entonces esto es como un edificio de 25 pisos. Así que en comparación con como tal vez como aquí, en comparación con una tasa de 25 pisos más, como aquí, tal vez un poco más lejos en esta dirección, comparación con un edificio de 25 pisos. Esa es la diferencia. Y este número sube y sube y sube y sube, sobre todo si consigues unos números realmente grandes, como un 1,000,000 porque entonces éste será un 1,000,000 entonces éste estará en algún lugar , como un par de uno billón o tal vez 100 billones en algún lugar alrededor de esa zona. Y entonces lo que tienes aquí es que tienes una especie de número diferente, y te das cuenta de que estos dos parecen muy, muy similares. Pero cuando comienzas a levantarte en números realmente grandes, la diferencia comienza ahí realmente sale. Entonces verás justo aquí que 10,000 contra 664 y luego un millón contra 9909 165. Hay una diferencia muy, muy grande. Y así que eso es todo lo que estamos tratando de hacer con N es, lo que estamos haciendo es que estamos mirando ecuaciones estaban tratando de saber como y va al infinito . ¿ Qué ecuación es mejor? Y si tenemos una ecuación que está en verso cuadrado, una ecuación que está en, entendemos que ésta va a ser sustancialmente mejor, más eficiente que ésta, y así que yo sólo como que quería repasar si tú no entendía qué registro era realmente rápido. Qué log es Y eso es, por ejemplo, tenemos una gráfica exponencial. Esto es como en cuadrado justo aquí. Por lo que arranca cero. Y luego con el tiempo, su ritmo de cambio sube mawr y mawr y más hasta que es casi una línea recta. Entonces esto de aquí está en cuadrado. Lo que es una gráfica de leyes es que es exactamente lo contrario de eso. Entonces surge realmente rápido, y luego se pasa y casi se convierte en una línea recta con el tiempo. Y, ya sabes, tenemos nuestros ejes aquí mismo. Lo mismo para por aquí. Tenemos algunos ejes, pero básicamente la razón de esto es porque log es lo inverso de un exponencial. Entonces con el tiempo, donde esta la tasa de cambio. Entonces estas pendiente de ella a k cuánto va de aquí a aquí versus aquí para escuchar esto se va a hacer más grande y más grande y más grande hasta que casi va directo al aire mientras que este de aquí se está haciendo más pequeño y más pequeño y más pequeño tiempo. Entonces eso significa que si ponemos este a, ya sabes, un 1,000,000 Cada vez que sube uno este número podría crecer en un mil 000.000.000 o un billón. Bueno, en este caso, una vez que lleguemos al número realmente, realmente grande, podríamos estar yendo de 8.1 a 8.0 05 Ya sabes, algo así, donde el cambio va a ser extremadamente diminuto, y así es como funciona el log. Simplemente piénsalo como el inverso de una función exponencial y notarás que en realidad hay un pequeño tipo de cosa ordenada que sale. Ese entendimiento es que si volvemos a la gráfica aquí, puedes notar que tenemos registro de fin y en tiempo constante y porque éste con el tiempo casi se convierte en una línea recta donde sólo nos estamos moviendo, ya sabes, tal vez 10.1 decimal. Todo el mundo a través de iniciar sesión y temporizador constante en realidad generalmente trataban uno de la misma porque, como dije ahí, su tasa de cambio se ralentiza donde estos ángulos en realidad no lo cambian mucho todo. Donde en lo contrario sucede con en cuadrado a medida que vamos cada vez más lejos y más lejos, el ángulo empieza a cambiar hacia arriba en un punto donde es casi un cambio de 90 grados porque simplemente va recto en el aire. Entonces solo quería explicar que si no entendías lo que significaba un registro, es lo inverso de un exponencial. Y así cuando vamos al infinito, tenemos que pensar en alguna otra una idea diferente. Y ese es el hecho de que si te das cuenta y de que no estábamos hablando, ¿cuál es la diferencia entre dos en verso en? Y eso se debe a que la constante el número al frente no importa. ¿ Por qué no importa? Echemos un vistazo aquí arriba. Entonces lo que tenemos es que tenemos en cuadrado y tenemos que en cuadrado. Y a medida que te haces más grande y más grande, la diferencia entre estos dos comienza a disminuir, donde el número el cambio en él no es tan significativo como solía ser. Y esto todo tipo de bajan fracciones de Teoh y, ya sabes, una especie de números como este. Pero lo que estamos tratando de ver aquí mismo es que comparamos con cosas que no estaban tratando de comparar es un extremo cuadrado adverso y en cuadrado. Mejor porque sabemos que ambos son inherentemente probablemente bastante malos. Lo que estamos tratando de comparar es Es esto en cuadrado Mejor versus un fin. Entonces en esta situación notarás que no importa qué número pongamos frente a aquí, todavía va a ser sustancialmente mayor que este número de aquí. Y así no importa qué constante tengamos al frente Cuando va al infinito, la constante no importa, y sólo miramos a la variable misma, aunque sepa que esto es un poco confuso. Aunque tengamos un 1,000,000 en verso en cuadrado, en cuadrado, seguirá siendo el peor de los casos. Y como dije, esto es un poco confuso al principio solo para envolver realmente la cabeza. Pero todo se reduce al infinito, y el infinito es un número al que nunca se puede alcanzar por lo grande que es una vez que llegamos a ir al infinito. Una vez que lleguemos a un infinito cercano, la constante no significará nada porque este número aún superará a un 1.000.000 veces en él seguirá superando a mil 000.000.000 el billón de veces en algún momento. Entonces tienes que pensar realmente teórico aquí, pero todo se reduce a esta simple regla. Si lo sabes, si no puedes meter la cabeza en torno a la teoría, solo piensa en esta regla civil. Si hay un número al frente, deshazlo. No importa en nuestras comparaciones. Entonces ahora hagamos un ejemplo aquí mismo. Vamos a divertirnos un poco. Y vamos a crear una especie de ejemplo donde realmente podamos ver esto en un aspecto del mundo real . Entonces si cada ciclo de un programa toma 0.1 segundos Así que en esta situación, lo que estamos viendo es nuestro cada ciclo de un programa así están en es que ya sabes, cuando hicimos esa caja están en esta situación es los ciclos y lado o algún tipo de cosa dentro de esta caja, ese es nuestro dentro. Por lo que cada ciclo de un programa tarda 0.1 segundos. ¿ Cuánto más rápido se ejecutará el programa ejecutándose en inicio de sesión que un programa que se ejecuta en cuadrado? Si llegan 1000 piezas de datos y así es realmente donde llega donde realmente se puede ver la diferencia. Entonces, solo pasemos por esto. Tenemos 1000 piezas de datos que vienen a través. Se trata de N iniciar sesión, lo que equivale a que reemplazamos nuestros extremos por lo que están en tarifa se dio aquí. Por lo que son 1000 piezas de datos, que es la que tomará 1000 ciclos de calcetín. Entonces en esta situación, nuestro en es igual a 1000. Por lo que ahora podemos hacer las matemáticas detrás de ella. Nosotros decimos que va a tomar 1000 veces log de 1000 y eso nos va a dar 3000 veces 30000.1 que a su vez nos da 30 segundos. Ahora, vamos a comparar eso con en Squared, que va a ser 1000 a la segunda, equivale a un millón de veces 0.1 segundos porque cada ciclo de reloj toma 0.1 2da Así que por eso nos estamos multiplicando al final ahí. Y lo que obtenemos son dos horas y 46 minutos. Entonces debido a que esos programas lo ejecuta en cuadrado en lugar de en, inicia sesión. Y volvamos a nuestra gráfica aquí mismo y echemos un vistazo. Recuerda, estos dos se veían bastante cerca el uno del otro, pero no lo son. Entonces volvamos a nuestra gráfica nuestro ejemplo aquí porque corrió en cuadrado. Va a tardar dos horas y 46 minutos, o dos horas, 45 minutos más que este de aquí. Y llevemos esto a un número aún mayor. Digamos que tiene en el registro de en tan de 25,000 EU ahí en igual a 25,000 aquí mismo. Por lo que en igual 25.000. Ahora realmente empezarás a ver la diferencia. Entonces en esta situación en Logan equivale a 25,000 veces log de 25,000 que va a águila en algún lugar alrededor de 109,948 veces 0.1 Así que va a igualar a la derecha alrededor de 18 minutos y 32 segundos. Pero echemos un vistazo al final de cuadrado. Por lo que esta lista, ya sabes, se ve larga y mirando hacia otro lado más de 30 segundos. También notamos que es mucho menos que hasta 24,000 menos datos 300.7 al cuadrado. Si vamos a terminar al cuadrado, son 25,000 cuadrados, que Águilas 625 millones veces 0.1 que águilas seis millones, 250,000 segundos, que son 72 días. Por lo que se puede ver que este número realmente empieza a despegar justo por aquí. Y sólo estamos en 25 mil piezas de datos. Hay cuántas personas en Facebook en este momento, Y sus datos hay algoritmos probablemente tienen que correr con cuántas personas hay en Facebook. Entonces imagínate si trataras de poner el uno era que creo que tal vez mil millones cantidad de personas ahí ahora mismo a través de este programa tomaría esto subiría a los miles de millones de años que nunca terminaría. Y así es aquí donde se puede ver como la diferencia de los extremos. Y así, básicamente, todo esto es sólo tratar de reducirse a un par de hechos clave. Fin son sólo cuatro comparaciones. Entonces esa es una especie de nuestro primer hecho está en es sólo para comparar dos programas. Es para comprobar el tiempo de ejecución de dos programas. No es para uso práctico, lo que significa que no vamos a estar corriendo en algoritmo en un, ya sabes, un programa y ver si puede devolver cosas dentro, ya sabes, 20 segundos o algo así como eso. No podemos hacer eso dentro. Y la razón de eso está en es solo un estándar es una forma en que podemos ver un programa una independiente apagado si la computadora es rápida o lenta, donde la conexión a Internet es más rápida, lenta Podemos compararla con otro programa, como en cuadrado o en Iniciar sesión, y podríamos empezar a entender qué algoritmos son los mejores y cuáles no escalarían correctamente. También tenemos que entender que no está mal tener números más grandes. A veces es inevitable. Entonces no solo pienses que ya sabes, la idea de una ciencias de la computación es nunca volver a encontrar en cuadrado. No se supone que use con fines prácticos que estamos tratando de hacer es que estamos tratando resolver teóricamente diferentes problemas. Y así, por ejemplo, todas las espadas de comparación no pueden hacer mejor que en iniciar sesión. Entonces volvemos a este gráfico aquí mismo. Ya verás que todos los tipos de comparación caen en esta línea, así que están ahí en algún lugar de este lado. No están en el resto de esto más fácil, tipos de gráficos y de comparación más rápido son como te gustaría, gustaría, ordenar un montón de números así que incluso como el uso diario, especie de algoritmos aún caen en el inicio de sesión. Además, los múltiplos caen mientras comparan así que entienda de nuevo en esta lección que los múltiplos no importan y luego es exponencial puede ser realmente, realmente peligroso con el tiempo. Y nuestros cerebros realmente no tienen la capacidad de entender las diferencias. Y simplemente te muestra en este donde no pensaríamos que esto sería de 72 días versículo 18 minutos. Sólo porque pasamos de esta gráfica a esta gráfica pero las horas extras exponenciales son realmente, realmente, muy fuertes. 7. Notación de 1 a 6 grandes: Entonces ahora tenemos una buena comprensión de en y cómo funciona exactamente, y se vincula a nuestro análisis de algoritmos. Podemos empezar tipo de sumar a eso. Entonces sabemos que en es una forma de clasificar qué tan rápido en exterior corren, dado cierto número en ¿Cuánto tiempo se va a tomar con respecto a ese número? Entonces, ¿se va a llevar justo a tiempo? Entonces si lo fue, 1000 va a igualar 1000 o va a tomar algo así como en tiempos cuadrados donde cuando es 1000 va a igualar? UM, un millón, y este es un tipo de clasificaciones realmente importante. No obstante, los programas no son tan fáciles. No sólo corren a una hora exacta todo el tiempo. Muchas veces han abundado. Entonces, por ejemplo, tal vez no cargarías. Se va a ejecutar y en cuadrado, pero ejecuta un fin, y en él, ya sabes que exporta en log in y así tenemos que poder ver esto, y hay que mirar el programa y dar una clasificación sobre el programa en su conjunto. Entonces, por ejemplo, este programa, siempre miraríamos el peor de los casos es siempre ir de pie. peor de los casos toma al cuadrado, sin embargo, a ciertos pasos va a correr más rápido. Y por eso, en realidad tenemos este tipo de sistema aquí mismo, que va a clasificar los, um, los límites en nuestra notación. Entonces, solo bajemos esto y echemos un vistazo a esto. Estos de aquí arriba se llaman omicron. Te has desvanecido en el medio y luego omega, y esto es minúscula de mega aquí abajo y así puedes ver que son alfabeto griego. Pero sólo muchas veces en el griego de Matthew porque el alfabeto se vuelve confuso. Entonces usamos el dedo del pie griego, especie de representar simbólicamente las cosas, y en esta instancia, abundan todos estos símbolos griegos simbólicamente. Entonces lo que tienes aquí es dibujar, por ejemplo, por ejemplo, un encuadernado justo en el medio aquí y aquí arriba es más rápido, así que diremos aquí arriba va a ser más rápido y abajo aquí va a ser más lento. Entonces nuestra primera notación es poco. Ah, y se puede ver que simplemente no nos gusta decir omicron como gran notación omicron que sólo toma mucho. Entonces solo decimos el pequeño Oh, grande oh, y tan pequeño Oh, justo aquí. Simplemente significa que va a ser más rápido, que significa que el programa siempre será más rápido que este encuadernado. Entonces, por ejemplo, si nuestro Barón estuviera en cuadrado justo aquí, si tuviéramos poco, oh, de en cuadrado justo aquí, veríamos que significa que nunca va a tocar y al cuadrado. En realidad siempre va a ser más rápido que en cuadrado, así que siempre va a estar justo por encima de esta línea, pero más rápido que en cuadrado. Y entonces lo que podemos hacer es que en realidad podemos usar esto para averiguar el rebote. Entonces el siguiente que tenemos es que tenemos grande Oh, y Big O significa que va a ser más rápido, tu igual a. Entonces eso significa que va a tocar esta línea o ser más rápido, así que va a ser en el peor de los casos, y eso es algo que es muy clave aquí. Esto significa, en el peor de los casos, que va a estar en cuadrado. El siguiente que tenemos son datos, lo que significa que no va a tocar ninguno de estos dos. No se va a bajar. No se va a subir. Lo que se va a ir está justo en esta línea. Entonces no importa lo que vaya a ser en cuadrado, va a estar justo a lo largo de esta línea en alguna parte. Y entonces el siguiente abajo que tenemos es más lento o igual a lo que tenemos. Este es Omega, y éste es más lento igual a por lo que toca esta línea y siempre es más lento. Entonces, ya sabes, nos metimos como en tercero en cuarto aquí abajo, aquí arriba podríamos tener como dentro. Por lo que siempre es más lento que esto, o igual a n cuadrado. Entonces en el mejor de los casos, Así que este es en el mejor de los casos, va a correr a esto si pones esto. Entonces, por ejemplo, si tenemos derecho de n cuadrado, como así cortamos un poco justo ahí pero de en Cuadrado como así entonces entendemos que este programa siempre se ejecutará, o en el mejor de los casos se ejecutará es en al cuadrado, lo que significa que puede correr peor que eso, y luego por debajo de eso tenemos más lento de lo que significa que siempre va a correr peor que en cuadrados. Poco nunca tocan y cuadrada, pero correrá peor que en cuadrado ¿Y entonces por qué es esto importante? ¿ Por qué queremos enfocarnos en este de todas estas? Y eso es porque Big O dicta el peor escenario de casos y nos preocupa el peor escenario de casos porque dada la probabilidad y las estadísticas son, programa podría tocar el peor escenario de casos en un momento y queremos saber, sin duda, ¿cuál es ese peor escenario? Entonces por eso usamos el grande Oh, es ver en lo peor. ¿ Qué va a ser? Y ya puedes ver que voy a volver a subir el gráfico aquí mismo. Cuando tenemos esta idea, cuando tenemos la capacidad de decir, ¿Cuál va a ser nuestro programa? En realidad podemos empezar una especie de llenado de este fin. Entonces si tenemos, por ejemplo, um, um, tal vez big o of in. Entendemos que en el peor de los casos, va a estar adentro por lo que podría estar dentro. Pero también podría ser cualquier cosa mayor que en. que podamos preparar todos nuestros diagramas de tiempo y bocetos y cualquier cosa por el estilo, partiendo de la suposición de que nunca va a ir de este lado de la línea. Siempre va a ir de este lado, y eso es realmente poderoso porque ahora podemos empezar a comparar programas, peores casos, y podemos empezar a ver que puede ser cuando un programa escala el por ejemplo, Si tuviéramos una en iniciar sesión programa versus un en programa, pudimos ver que cuando éste escala, va a ser peor que éste. Así que tomemos, uh, uh, vamos a descomponer esto un poco y podemos ver por qué algunas de estas no tienen sentido . Entonces tenemos un programa que corre ese pequeño oh en cuadrado, que significa que es más rápido que en cuadrado. Entonces eso significa que podría estar en cualquier lugar desde en cuadrado todo el camino hasta básicamente como simplemente más rápido que él. Por lo que no va a ser en cuadrado, pero podría ser cualquier cosa más rápida que en cuadrado. Y este es algo así como grande Oh, pero la cosa es, nos importa lo que nos dan, así que es un poco oh de adentro. En realidad no podemos tocar esto, así que simplemente lo hace un poco confuso. Nos da un atado, pero no lo hace fácil. para que lo veamos. No podemos inmediatamente mirar esto y irnos, Oh, esto va a correr a tiempo. Podemos mirarlo. Tenemos que mirar esto y ser como, Oh, va a correr más rápido que el final. Pero realmente no sabemos dónde, y en realidad no nos da mucho espacio para moverse. Y entonces tenemos nuestra gran notación O y eso es lo que acabamos de pasar es que podemos mirar esto y estaremos como, Oh, Oh, en el peor de los casos, se va a correr en largo en Fada sería genial si siempre pudiéramos usar datos. ¿ Cuál es el? Esto es igual o a veces se usa como el promedio, pero la mayoría del tiempo que significa igual a fin, Así que esto sería genial. Pero el problema es que los programas no siempre se ejecutan exactamente a lo largo de la línea. A veces podrían correr, ya sabes, tal vez en una parte corre un fin. Pero en un momento se ejecuta, inicia sesión y va a cualquier lugar en el medio. Este dato es simplemente demasiado específico para nosotros, todavía realmente como. Y entonces estos no tienen sentido porque no nos dan mucha información . Piénsalo, Este de aquí, que es Omega Tan omega en cuadrado. Eso significa que va a ser más lento o igual a omega al cuadrado, que es como estás diciendo que nuestro programa va a estar o ejecutándolo en cuadrado o va a ser más lento. ¿ Cómo se supone que vamos a planear con eso en mente? Porque más lento podría entrar al infinito. Podría ser lo más lento posible, y nunca podríamos prepararnos para eso porque nunca habríamos abundado. Sería como, De acuerdo, así que sólo va a correr a lo rápido que podría tomar en cuadrado. Podría tomar en factorial. Podría llevar a fin el infinito. No nos ayuda a analizar el programa porque hay lado infinito al mismo. Y exactamente la misma idea con la, um, pequeña Omega aquí también es que se va hacia el infinito por el lado malo, lo que no nos ayuda. Entonces estos nos ayudan porque el lado malo es dejarme borrar algo de esto aquí y hacer un poco más de espacio. Entonces estos nos ayudan porque el lado malo. Entonces digamos que por aquí se va al infinito. Nos da un atado así que cualquier cosa va a estar en el peor aquí mismo. Pero podría ser mejor y no nos importa como si vuelve y corre esa constante, eso está bien. Eso está perfectamente bien. Eso significa que nuestros programas en una gran camisa, pero podemos planear para eso. Simplemente significa que nuestros programas pasando, ya sabes, se ejecutan más rápido de lo que esperábamos. Entonces lo que podríamos hacer entonces es simplemente planear para el peor de los casos. No obstante, si vas del otro lado de esta línea, no puedes planear para el infinito. Entonces por eso Big Oh es tan importante es que es lo más útil de todas estas notaciones . Nos da un peor escenario, y así es como tomar un ejemplo de cómo podríamos aplicar esto a un problema en particular. Entonces generalmente lo que siempre haces es usar el peor escenario, significa en qué momento del programa no va a ser el más ineficiente. Entonces aquí, por ejemplo, digamos que teníamos grande o de en cuadrado. Teníamos un gran, uh in log in big O of in, y luego grande O de Constant time, y así estas de aquí abajo son geniales. Pero la cosa es, es que pase lo que pase, siempre vamos a ser embotellados por este tipo de aquí. Y eso se debe a que nuestra tasa de tiempo de carga aquí arriba está en cuadrado, lo que significa que este programa lo va a ejecutar en cuadrado más en inicio de sesión más en más O dos, el primero, que hace mantenerlo una especie de constante. Aquí iremos más uno. Y podrías estar pensando: ¿Por qué estoy haciendo esto? Y eso es porque en realidad se puede agregar cada parte de los pasos juntos. Entonces porque haces esta parte, entonces haces esta parte. Después haces esta parte, luego haces esta parte para que realmente puedas agregarlas todas juntas. Recuerda lo que estamos haciendo de antemano cuando estamos hablando de cómo estos cómo tratamos de mirar un programa a medida que va al infinito. Entonces si nos fijamos en este número, cuál de éstos va a superar a los demás cuando vayamos al infinito? Bueno, por ejemplo, pongámoslo en un 1,000,000. Cuán significativo es un millón, que está en lo correcto uno va a ser verso un millón va a ser verso. Tal vez en algún lugar alrededor de tres millones va a ser verso uno cuadrillón o tal vez un billón 60 se sienta fue uno y 12 ceros. Este va a ser sustancialmente más grande. Estos van a ser una porción cada vez más pequeña del número ya que va al infinito hasta el punto donde éstos se acercarán a cero como significancia. Entonces empezarás a tener, ya sabes, un número de Google, que es de 100 ceros más quizá, como ocho millones por aquí, algo así. Y eso significa que esta parte de aquí es completamente insignificante en este punto. Entonces lo que hacemos es eliminar a los más bajos, y el tiempo de ejecución de este programa está en cuadrado. Y así vamos a sólo una especie de cemento que con otro ejemplo aquí, digamos que teníamos Big O. Así que tuvimos una gran O de en cuadrado grande O de En Cuadrado Big O de Petróleos aquí Vigo de In Squared otra vez. Y veamos ahora tenemos gran O de fin del tercero. Y así ahora lo que tenemos aquí es que tenemos n cuadrada plus en cuadrada plus en cuadrada plus en el tercero, y así podemos realmente combinar estos abajo a tres y cuadrado plus en el tercero. Y ahora recuerden de lo que hablamos en la última conferencia sobre el en notación. Estos no importan. El constante aquí mismo no importa. Porque a medida que nos adentramos en el infinito, esto se vuelve cada vez menos significativo. Hasta que una vez lleguemos a un número suficientemente alto, se convierte básicamente en cero para que podamos tachar ese. Y así ahora tenemos en cuadrado plus en el tercero. Y entonces, por supuesto, este va a despegar mucho más alto que el otro programa Una llaga acaba por estar en tercer lugar. Y ahora, como esas son todas grandes oh, notaciones que conocemos en el peor de los casos, nuestro programa lo ejecutará en tercero, que ahora estamos. Tenemos este límite de en tercero y el infinito de tiempo de ejecución se va de esta manera, y ahora podemos planear que en el peor de los casos vamos a tener en el tercero. Y podemos planear todo el camino de regreso al tiempo constante, porque ahora todo lo que tenemos es justo aquí. Entendemos que, ya sabes, si ponemos una pieza de 1 millón de datos, podría no funcionar. A lo mejor podemos buscar traer esto, pero nos da algún lugar para empezar. Nos da algún lugar para compararlo con otros. Entonces esa es una gran notación O. Muy importante. Y con el tiempo vas a empezar. Básicamente, esto se convertirá en segunda naturaleza. Tan solo poder mirar esto. En realidad, nunca verás a estos otros. Demasiado a menudo. Verás éste. A veces. Si dice como un cierto punto de un programa es igual a este tiempo de ejecución, entonces verás este. Pero aparte de esa tesis, probablemente nunca verás y probablemente nunca verás al pequeño Omar Khan a. Entonces estas notaciones de aquí solo las memorizaron, entienden lo que significan, y deberías estar bien para ir. Empezarás a entender mucho más de especie de documentos de informática. 8. Ejemplo de gran mundo de 1 a 7 real: no lo es. Hemos aprendido mucha teoría. Sigamos adelante y tomemos un revés y repasemos algún análisis de código del mundo real. Ahora bien, no voy a usar código complejo o cualquier tipo de código que necesites conocer aquí mismo. Todo es pseudo código, y voy a estar explicándolo. Cada paso del camino es si nunca has tocado código antes porque así es como quiero explicarlo. Todo este tipo, por supuesto, es que estamos viendo la teoría detrás de todo. No el código, sin embargo, aplicarlo a algo riel mundo puede ayudar, ya sabes, una especie de averiguar algunos de los conceptos, y por eso lo estamos haciendo. Entonces, solo echemos un vistazo a nuestra primera pieza de código. Voy a seguir adelante y caminar por esto por aquí. Entonces lo que tenemos es que lo tenemos dice lo escribí en pseudo. Esa clase de simplemente lee de la lengua, algo que puedes mirar y entender lo que está pasando. Por lo que dice para cada dato en la lista de datos, por lo que crearemos una lista de datos aquí en una segunda impresión. Datos a pantalla OK es suficiente. Digamos que introdujimos en esto un pedazo de datos una lista aquí que tal vez sea de tres a 10 y luego simplemente iría búfalo. Por lo que se trata de tres enteros y una cadena. Es así como sería técnicamente clasificado. Pero ni siquiera vamos a ver eso. Se trata de cuatro piezas de datos. Y entonces lo que estamos diciendo es que por cada dato, Así que por cada dato de nuestra lista, vamos a, um, imprimir esos datos en la pantalla. Entonces en nuestra situación aquí, ¿en qué hay? Bueno, en esta situación aquí mismo en iguales, el 1234 Porque tenemos cuatro piezas de datos. Entonces en esta situación en igual a cuatro Así que ahora veamos cuál sería el tiempo de ejecución de esto. Por lo que tenemos para cada pieza de datos y luego imprimimos en la pantalla. Entonces bien, vamos a bajar la lista. Aquí. Vámonos ahí. Primera pieza de datos. Por lo que nuestra primera pieza de datos es de tres. Agarramos tres de nuestra tasa de documentos aquí, Así que este es el número cero. Una matriz, o, si quieres pensarlo, es 1234 Los ordenadores suelen ir con 0123 es justo la forma en que funcionan. Entonces vamos a agarrar nuestra primera pieza de datos aquí y luego vamos a imprimir a la pantalla. Por lo que agarramos a nuestros tres que imprimimos en la pantalla. Entonces ese es un tiempo de ejecución. Así son el tiempo de ejecución en este momento es uno. Y entonces ahora vamos a agarrar el a porque vamos a bajar la lista. Por lo que para cada pieza de datos, hemos tocado este. Por lo que ahora pasamos a este. Por lo que ahora agarramos dos e imprimimos en la pantalla. Entonces ahora nuestra pantalla se ve así. Y así que eso es tiempo de ejecución adicional justo ahí. Eso es un tiempo de ejecución. Y entonces ahora imprimimos nuestra siguiente pieza de datos, que es 10. Por lo que ahora tenemos 32 10. Eso es tiempo de ejecución adicional justo ahí. Y entonces ahora imprimimos búfalo, que sería de 3 a 10 búfalo. Al igual Y ese es un tiempo de ejecución adicional porque todo lo que estamos haciendo es agarrar la pieza de datos y lo estamos imprimiendo. No hay un proceso de pensamiento especial entrando aquí sólo fueron agarrar, imprimir, agarrar, imprimir, agarrar, imprimir. Y ahora si sumamos todo esto, veremos que sale a uno más uno más uno más uno más uno, que equivale a cuatro y así lo son el tiempo de ejecución en esta situación es cuatro y verás que nuestro tiempo de ejecución es igual a la cantidad de fin aquí mismo. Y si solo podemos pensar en esto teóricamente por un segundo, si tuviéramos un 1,000,000 de piezas de datos aquí, no habría, en ningún momento el programa en el que alguna vez tendríamos que tocar más de un 1,000,000 de piezas de datos . Entonces no importa lo que hagamos aquí son tiempo de ejecución va a ser cualquiera que sea nuestro fin, que significa que lo que tenemos aquí es un tiempo de ejecución de en esta situación particular, realidad podríamos usar a Fada como en porque en realidad es igual a terminar. No hay ningún tipo de, uh, espacio de meneo aquí, pero vamos a seguir adelante y sólo decir que va a peor, porque esa es la notación que nos gusta usar. Entonces este es un ejemplo de un en el que esto se llama un bucle for. Por lo que cuatro bucles son típicamente, por ejemplo, horno final en una situación. Vayamos a un problema un poco más complejo aquí. Entonces déjenme desglosar este también Lo que tenemos aquí es que dice para cada dato en una lista de datos. Entonces eso significa que en vez de llamarlo papá y ahí fuera, cada pieza de datos de una lista va a estar en jaque si los datos están en la lista. Entonces vamos a ir después por cada dato W en las listas de datos. Si n es igual a w print. Cierto. Entonces vamos a seguir adelante y una especie de derribar este un poco también. Vamos con nuestro mismo ejemplo de antes, que era tres coma, dos coma, 10 coma búfalo como así. Y en esta situación, nuestro en sigue siendo igual a cuatro. Y entonces ahora lo que vamos a hacer es que vamos a ver el primer problema aquí, Así que echemos un vistazo ahora mismo. Digamos que vamos a agarrar del pie cada una de estas piezas de datos, así que vamos a agarrar los tres y eso ya está dentro. Y entonces ahora, por cada pieza de datos en esta lista de datos y se puede ver estos nombres son exactamente los mismos. Entonces eso significa que esta es la lista de datos. Estamos revisando los dos, así que tenemos nuestro tres camino tenemos a nuestros tres agarrados. Y ahora estamos tratando de comprobar si estos tres de aquí es equivalente a algo aquí arriba, y la única forma en que podemos hacerlo es citar la fuerza bruta sin comillas. Entonces vamos a llevarnos estos tres. Vamos a revisarlo con el 1er 1 Vamos a revisarlo con el 2do 1 Vamos a revisarlo con el 3ro 1 Vamos a revisarlo con el 4to 1 Así que van a ser 1234 operaciones . Entonces primero, vamos a romper esto, como, realmente muy lejos aquí abajo. Tenemos a nuestros tres. Hemos agarrado a nuestros tres, y ahora lo estamos revisando. ¿ Es igual? Déjame hacer eso un poco más pequeño va a ser un poco más grande de una gráfica. Entonces estamos diciendo, ¿tres iguala la primera pieza de nuestros datos, que va a ser la tres otra vez? Porque no le dijimos que empezara con un número que no lo es o cualquier cosa elegante como esa . Solo estamos revisando esta lista por segunda vez. Entonces tenemos a nuestros tres y estamos revisando. No es igual al 1er 1 Así que igual a tres. Sí, sí lo hace. Entonces esto es esto imprimirá un verdadero mensaje, y esto tomó una operación. Ahora sí lo hace. Son tres iguales a no lo hace. Entonces no imprimimos nada. Esa es una operación. ¿ Nuestros tres equivalen a 10? No lo hace. Entonces esa es una operación. ¿ Son nuestros tres búfalos iguales? No lo hace. Entonces esa es una operación, y ahora terminamos con los treses. Por lo que hemos pasado. Nos hemos encargado de los treses, así que vamos a crear un 2do 1 aquí abajo. Veamos esto. ¿ Qué? Va a ser el que estamos revisando con su exactamente lo mismo. Pero solo quiero hacer que esto sea un poco más visual para todos ustedes. Entonces terminamos con treses. Entonces pasemos a los dos ahora. lo hace demasiado igual. Tres. No lo hace. Esa es una Operación hace para igualar a ella hace. Esa es una operación hace para igualar 10. No lo hace. Eso es lo que hace la operación para igualar búfalo. No lo hace. Esa es una operación, y luego vamos a bajar la lista. Uno más hace 10 igual tres No eso es uno Operación hace 10 igual a no eso es lo que hace la operación. 10. Igual 10. Sí lo hace. Ahí es cuando la operación hace 10 igual a Buffalo. No lo hace. Esa es una operación lo hace Buffalo. Simplemente lo voy a abreviar como estar aquí, así que quiero seguir escribiendo. Buffalo. ¿ Búfalo es igual a tres? No lo hace. Entonces esa es una operación que sí. Búfalo igual a ella no lo hace. Entonces esa es una operación. ¿ Es igual Buffalo? 10? No lo hace. Entonces esa es una operación. ¿ Búfalo iguala a Buffalo? Sí lo hace. Entonces esa es una operación. Y ahora si sumamos todos estos aquí mismo, lo que vamos a ver es que esto va a ser 123456789 10 11 12 13 14 15 16. Entonces en esta situación, nuestro en fue de cuatro, pero son tiempo de ejecución fue aproximadamente 16. ¿ Y qué sale a ser eso? Bueno, eso sale a estar en cuadrado. Entonces digamos que si tomamos cuatro y lo cuadramos, equivaldría a 16. Y teóricamente podemos pensar en esto también. Si ampliamos esto a cinco, cada uno tendría no sólo cinco más aquí, sino que tenemos que multiplicarlo porque ahora tenemos que revisar uno adicional también. lo que cada instancia individual, tendrá cinco y tendrá un otro cinco entero, que lo cuadra por lo que en esta situación son runtime está en cuadrado. Y la razón de esto es a pesar de que tenemos 24 bucles, existe lo que se conoce como anidación. Hemos anidado 14 bucle dentro de otro bucle de cuatro. Entonces esta parte de aquí afuera, dibujemos esto y leamos esta parte aquí afuera está adentro mientras esta parte adentro también está dentro. Entonces lo que hacemos es tomar el final por fuera, lo multiplicamos por el final, dentro, y nos metemos al cuadrado. Y así será nuestro último tiempo de ejecución para esta situación. Entonces, como dije, este curso no está fuertemente designado en escribir código o hacia afuera, y todavía se define la teoría. Pero pensé que esto podría ayudar a mostrarte de lo que hemos estado hablando todo este tiempo. Cómo se podría analizar realmente el código para que podamos entender estas diferentes piezas. Y se puede ver que pase lo que pase, en realidad acabamos de aprender algo muy importante. Siempre van a estar cuatro bucles, pero anidados para bucles siempre van a ser por muchos anidados que haya. Entonces si este de aquí anidó 1/3 1 esto sería una fórmula en cuadrado, y se empieza a subir en números realmente grandes para empezar a revisar todas estas cosas. Por lo que espero que el este ejemplo práctico te haya ayudado a entender un poco mejor este concepto . 9. 2-1 de cómo se guardan datos: Entonces, empecemos a saltar a uno de los próximos temas principales de la informática, y esa es la capacidad de entender y manipular las estructuras de datos. Las estructuras de datos son la forma de tomar datos básicamente, organizarlos y poder agarrar el acceso, guardarlos de ciertas maneras que encajan con nuestro objetivo. Por lo que algunos son más rápidos que otros en ciertos aspectos. Entonces, por ejemplo, algunos de ellos vamos a ocupar más espacio mientras somos de acceso realmente, muy rápido. Algunos de ellos no ocuparán mucho espacio en absoluto, pero podría tardar un poco en acceder. Algunos de ellos tienen inserciones más rápidas. Algunos de ellos tienen más rápido remover ALS. Todo se reduce a lo que exactamente quieres lograr en tu programa o teoría o cualquier tipo de sección de informática en la que estés entrando. Entonces lo primero que pensamos antes de entrar en esas estructuras de datos, es que necesitamos entender cómo, exactamente se almacenan los datos, porque eso nos ayudará a empezar a entender estas estructuras de datos y por qué uno podría tomar más largo que el otro y por qué uno podría ocupar más espacio que el otro. Entonces lo primero que tenemos que hacer es que primero necesitamos. Como dije, entender los datos. Entonces lo que son los datos es Es igual que, por ejemplo, es algo algún tipo de ceros y unos que significan algo. Entonces, por ejemplo, un tres podría ser una pieza de datos o un texto completo, O tal vez un documento completo podría ser una pieza de datos. Y lo que sucede en una computadora es que este tipo de datos se almacenan en, por ejemplo, como un disco duro, que está en sección en diferentes pequeñas partes y esas partes de sección en las aún más partes Y luego dentro de uno de esos, tienes como cúmulos, que tipo de salen a lucir así aquí mismo. Entonces, por ejemplo, tal vez esto representa todo esto aquí mismo y lo que cada uno de estos representa es una pieza de datos. Y así cada uno de estos tendrá en realidad una dirección en la memoria, como una dirección para donde está tu casa. Si desea enviar un paquete, el equipo utiliza exactamente lo mismo. Por ejemplo, quizá éste. Por lo general usa Hexi decimal para que así voy a usar Tal vez este sea 00 y así éste sería entonces 01 Y este símbolo cero con poco X al lado usualmente significa Hexi Decimal. Entonces eso es lo que estoy usando para esto. Por lo que seguiría continuamente aquí abajo. Esto sería 020304 etcétera. Y entonces por qué esto es importante es porque una vez que tengamos la dirección, realidad podemos agarrar lo que está en esa dirección. Entonces, por ejemplo, si tomamos una pieza de datos, digamos que teníamos una cadena o una pieza de datos que era tres y cuatro, así Y digamos que tres se almacenaron. Cero x 00 y cuatro se almacenó en cero x 01 Así que ahora si queremos agarrar estas piezas de datos, lo que podemos hacer es crear una tabla con este tipo de datos y sus asociaciones. Entonces, por ejemplo, nuestra mesa puede decir tres. Está almacenado aquí. Esto se almacena aquí, excepto que normalmente sería lo inverso. Diría lo que está a las 00 y sería algún tipo de dato. ¿ Qué es eso? 01? Y sería algún tipo de datos. Y así Ahora, cuando realmente queremos recuperar estas piezas de datos, podemos buscar la dirección o viceversa. Si queremos ver qué hay en ello, podemos ir a él y averiguarlo. Entonces digamos que queríamos recuperar. Tres. Queremos recuperar los tres en nuestro conjunto de datos. Por lo que tres se encuentra justo aquí y cuatro se encuentra justo aquí. Y así queremos recuperar tres. Entonces básicamente lo que hace nuestro programa detrás de bambalinas. Muchas veces, a menos que tu programa a un nivel muy bajo, lo que significa dedo del pie muy cercano como máquina, manipulando la máquina completa y totalmente dentro de ti mismo, usualmente lenguajes ensambladores y cosas así. Entonces todo lo que tenemos que hacer es decir, ya sabes, solo var X equivale a tres y con la máquina lo está haciendo diciendo, Vale, ahora estamos asociando X con la dirección cero x 00 Así que en cualquier momento el usuario usa o llama a X , vamos a agarrar lo que alguna vez está en cero x 00 Ahora el usuario entra aquí y él entonces, ya sabes, crea una nueva variable. Por qué es igual a cuatro, Y así ahora por qué se asocia ID con vino cero x cero. Eso es lo que hace el programa es digamos que teníamos que ir el programa. ¿ Qué es X plus? ¿ Por qué? ¿ Qué es eso igual? Bueno, lo que hace es que va OK, entonces X esta a las 00 Vamos a agarrar lo que nunca? A las 00 y vamos, escanea hasta el disco duro. Va todo el camino y encuentra 00 y va, Hey, aquí hay un tres. Por lo que luego se llama a los tres, traídos todo el camino de vuelta en el procesador, y luego se almacena en Ram, que es una memoria más cercana a la computadora real. Pero eso es una especie de eso se está poniendo realmente, realmente nit exigente y cómo funcionan las computadoras. Pero todo lo que hace es agarrar eso y dice, Este es un tres. Y entonces así ahora decimos que queríamos sumar al por qué y así hace exactamente lo mismo . Pasa por su lista. Se encuentra el sector, el clúster, lo que sea que baje y diga: Oh, Oh, es dirección o uno que devuelve. Ah, ¿qué es la dirección o qué cuatro va todo el camino de vuelta arriba y regresa antes Y por supuesto, hace esto en tiempo casi instantáneo, y entonces así entonces podría hacer los cálculos que llamó. Son dos piezas de datos aquí mismo. Y así ahora hace el cálculo de siete. Y así eso es en una base de cómo se almacenan los datos en una computadora. Es sólo un Siri básicamente de una especie de estas direcciones, y hay diferentes formas en que puedes almacenar este tipo de datos. Entonces, por ejemplo, esto es más una forma directa de almacenarlo donde podemos llamar específicamente a la dirección. De qué manera se dijo Queremos asignar, Vamos a eliminar un par de cosas aquí. En realidad, lo que podemos hacer es duplicar esta diapositiva aquí mismo y nos moveremos hacia abajo. Por lo que ustedes tendrán este topside, se duplicarán y luego una especie de borrarlo y hacer un segundo ejemplo aquí. Entonces esa fue una forma muy directa de decir lo que era. Si dijimos que tenemos estos datos, esta estructura que va a estar entre aquí y aquí y su dirección en su conjunto va a ser cero X 00 ahora Si llamamos a cero x 00 digamos, Bueno, pongamos algunos datos aquí. Si llamáramos a cero x 00 no habría datos específicos aquí. Estamos llamando a toda esta entidad, para que eso no nos ayude en absoluto. Entonces lo que podríamos hacer es aquí donde empezamos a una especie de meternos. La siguiente parte es que en realidad podemos especie de en pequeños mini nombres a cada uno de estos pequeños segmentos. Entonces esto es solo 12345 Y podemos usar estos tipos realmente básicos de clasificaciones porque tenemos nuestra dirección principal aquí mismo. Y ahora, ya que tenemos nuestra dirección principal, lo que vamos a hacer es ir a la dirección principal, y luego vamos a usar uno de sus pequeños mini nombres para encontrar cualquier dato que estemos buscando. Y esto es lo que se llama una matriz. Y la próxima conferencia. Realmente vamos a empezar a llevar esto al siguiente nivel, pero esto se llama matriz. Entonces lo que podemos hacer es que podríamos crear, salvar a nuestra X igual y luego crear algo como esto. Y entonces ahora es almacena esa pieza entera de datos en esta pieza de memoria y que ahora si dijimos Retorno X de lo que sea que sea pequeño mini nombre. Entonces digamos X de uno. Ahora ya va a venir. Se va a ir al cero x 00 y luego va a ir al mini nombre de uno, que es un dos. Entonces va a volver a y así esa es una forma diferente de mirar. En lugar de tener acceso directo, podrías tenerlo segmentado en piezas como esta. Y lo que resulta ser es que en realidad suele ser la más común. Porque si tuviéramos una dirección directa para cada pieza en la memoria, estaríamos desperdiciando mucho espacio y seríamos algunas mesas realmente, realmente grandes, porque hay que pensar que la memoria no puede Ah, computadora no puede crear memoria sobre la marcha como no puedes simplemente almacenarla en tierra imaginaria. Si quiere almacenar cada una de estas relaciones, tiene que tener toda una otra sección de memoria que designe específicamente para almacenar memoria. Entonces si intentas hacer almacenar cada pieza de datos como esta, tu espacio empieza a ser realmente grande, y estos son todo concepto. Vamos a empezar a descomponernos a medida que vamos más allá. Pero solo quería una especie de mostrar esto en un nivel superior hacia abajo para que puedas empezar a entender cómo funciona la memoria. Y luego cuando nos metemos en estas estructuras de datos como un aumento, como árboles como listas enlazadas, podrías empezar a entender cómo podría funcionar bajo el tipo de capó encendido. Podemos meternos un poco más de, ya sabes, sólo ese entendimiento, y una vez que lo entiendas, puedes usarlo mejor. Se puede manipular mejor. 10. Introducción de Arques fijos: Entonces vamos a repasar nuestra primera estructura de datos importante, y esa va a ser la matriz y en esta situación, la matriz fija. Entonces, ¿qué es una matriz? Bueno, en una redada, por definición es un Siris ordenado de arreglo. Y así todo lo que eso significa es que es una agrupación de una especie de elementos similares juntos. Y en esta situación, los elementos similares sólo significa que hay pieza de datos así que en un rayo en el mundo de las ciencias de la computación es sólo una recopilación como de datos o una realmente sólo una recopilación de datos que está todos al lado otro. Y lo que quiero decir con eso es que repasaremos diferentes estructuras de datos más adelante donde podrías tener un pedazo de información aquí en un disco duro y luego otra pieza por aquí y luego otra por aquí y por allá, acaba de enlazar junto con algo llamado Pointers. Entonces es como, digamos, si quisiéramos representar lo de abajo aquí abajo, tendríamos algo como esto. Pero podría haber, ya sabes, un montón de piezas diferentes en el medio, y un montón de piezas diferentes en el medio también. Y eso no es lo que en una carrera eso es algo llamado lista enlazada. Entonces en un rayo es cuando están todos juntos y obtienes ciertos beneficios de eso, obtienes ciertas desventajas de eso. Pero una especie de matriz se ve así cada vez que lo representas. Visualmente, tienes este segmento de memoria, y cuando creas una matriz, normalmente siempre asignas cuánto tiempo quieres. Estás preguntando a la computadora. Yo quiero una sección de seis piezas de datos y la computadora esta va a buscar a través de su disco duro, y luego va a encontrar un lugar de seis, y te va a dar esa ranura. Entonces, por ejemplo, en nuestro disco duro, si pedimos un lugar de tres, miraría a través, miraría ahí y como, Oh, aquí mismo tenemos una sección de tres. Por lo que te daría estas tres piezas de datos, y eso sería todo en código. Típicamente está representado por una declaración de corchetes como ese. Entonces dirías algo como X es igual a thes brackets, y esto significa una matriz vacía. Y luego, si quieres ponerle información, podría ser algo así como X equivale a 123 Y eso sólo va a crear una matriz que se ve un poco como esto, donde tienes el primer lote de uno, la segunda ranura de a y la tercera ranura de tres como así. Entonces así es como se representaría en código. Ahora bien, ¿cómo cuenta una matriz? ¿ Qué es? ¿ Sabes qué? ¿ Para qué se utiliza? Una de las partes más importantes es que la matriz comienza en cero. Se llama indexación cero. Eso significa que siempre que queremos agarrar el primer elemento cada vez que queremos agarrar este elemento o en esta situación, este elemento alguna vez querría agarrar uno de esos desarrollos. Tenemos que empezar a cero. Tiene que ser este cero aquí mismo. Esto se debe a que ah, muchas fórmulas informáticas funcionan con cero. En realidad hay discusiones en línea enteras de por qué seguimos usando cero basing. Antes había, ah, ah, un montón entero de diferentes tipos de razones para ello y la razón que empezó a caerse. Pero sea lo que sea ahora mismo, seguimos usando cero basing. Por lo que en array siempre está empezando por cero. Y eso significa que el final es algo llamado en menos uno lo que está en menos una media terminará en esta situación es sólo la longitud de la matriz. Entonces eso significa que el último va a estar en menos uno. Serán sólo seis. Por lo que esto, como se puede ver, sostiene siete pieza de información. 1234567 Sin embargo, si queremos agarrar la última pieza de información, no agarramos siete. Agarramos seis, un poco confuso al principio. Y muchas veces, incluso veteranos científicos informáticos, se equivocan todo el tiempo. Pondrán, pondrán , ya sabes, si están tratando de agarrar el último elemento, pondrán X de siete. Y eso va a devolver algo llamado falla de segue, que es sólo la computadora diciéndote, Hey, estás accediendo a la memoria fuera de los límites. Estás accediendo a la memoria. No te he dado control sobre y más débil lenguaje o lenguajes que no tengan salvaguardias en él. Bueno, en realidad, solo devuelve cualquier basura que haya ahí, así que eso se llama en realidad Ah, ataque de desbordamiento de búfer es que si atacas ese lado derecho, puedes hackear las cosas con eso. Pero eso es lo que les gusta a los lenguajes realmente básicos como C, ya sea en un montón de tipo de salvaguardas. Pero siempre que tratemos de hacerlo en algo así como, Java nos va a decir que la segunda falla estaban accediendo a memoria que no se ha concedido en el disco duro, hay algo más ahí que no deberíamos estar tocando. Y para que, como dije, se llama un apagado por un solo aire. Pon la parte importante que necesitas para salir de esta conferencia. Esta introducción para arreglar un aumento es que uno en array es solo una recopilación de datos en el mismo lugar en el disco duro irá por encima de la ventaja de que en la próxima elección hablamos de los tiempos de corrida. Pero esto es lo que es. Se trata de una recopilación de estos datos juntos. Lo siguiente que sabemos es cuál es la parte fija de esto iba a hablar de diferentes matrices. La parte fija de la misma sólo significa que nunca va a cambiar. Entonces en esta situación, si creamos una matriz de talla cuatro, siempre va a seguir siendo tamaño porque no hay código para hacer un go más grande y hacer ir más pequeño. Una vez que lo llenamos, se llena. O tenemos que sobrescribir algo o eliminar algo o mover algo en otro lugar para poner más información disfrutada. Pero de todos modos, esa es la introducción a las matrices fijas, realmente , realmente necesitan estructuras de datos, y vamos a saltar a algo más de la nitty gritty de cómo realmente usas estas cosas y cuál es su ventajas son. 11. Tiempos de Array fijo: Echemos un poco de un vistazo más profundo a las matrices fijas y veamos su tiempo de ejecución, realmente usando las cosas que aprendimos en la última unidad, ya sabes, el análisis de tiempo mumbo jumbo vamos a estar tomando que estamos en realidad va a estar implementándolo y mirando las velocidades de diferentes tipos de funciones dentro de la matriz. Y entonces podremos tomar ese tipo de velocidades y podremos mirar diferentes estructuras de datos podrán compararlas juntas. Entonces eso es lo que estaremos haciendo. Vamos a estar viendo algunas de las ventajas. Vamos a estar viendo algunas de las desventajas, y sólo vamos a ser una especie de inmersión profunda en lo que es la matriz fija y por qué podrías usarlo. Lo primero que vamos a repasar es la inserción aleatoria. Entonces hay algo con lo que tenemos que juntarnos. lo que vamos a estar hablando cada vez que hablemos de una inserción, de una eliminación o incluso de buscar lo que queremos decir con una inserción es si tenemos un conjunto de datos que queremos mantener en el relativamente el mismo tipo de orden Entonces, por ejemplo, todos los datos son importantes en todos nuestros ejemplos. Entonces si tenemos uno a dos o tres, no tenemos. Cuando decimos insertar, no queremos decir dedo del pie sobrescribe algo que se llama reemplazar. Entonces no estamos hablando de, ya sabes, sólo cambiar esto a un dos. Entonces es de 2 a 3 o cambiando este 1 a 2 o, ya sabes, haciendo lo que sea. No se trata de que una inserción esté insertando entre aquí o insertando en un lugar a su alrededor . Entonces, por ejemplo, en inserción sería Este es un espacio en blanco y queremos insertar un tres aquí. O la inserción podría ser que después de uno, queremos insertar un tres. Entonces, ¿cómo vamos a hacer eso? El producto final? Lo que queremos es que queremos es algo que salga como 132 y así que ese es el en búsqueda, y eso es lo que queremos decir con una inserción aleatoria. Entonces, ¿cuál es el momento de esta inserción aleatoria? ¿ Qué se necesita si queremos insertar al azar algo aquí? Y sigamos adelante y eliminemos ah, par de los elementos traseros. Entonces tenemos algo con lo que trabajar aquí y así Ahí vamos. Entonces, ¿cuál es el tiempo que va a tardar en insertar algo en una matriz fija? Bueno, el tiempo termina siendo O hasta el final o hasta el final. Entonces, ¿por qué exactamente es o hasta el final? Bueno, echemos un vistazo a esto. Este ejemplo aquí mismo tipo de lo muestra. Siempre que estamos insertando al azar, tenemos que asumir que no sabemos dónde va a estar insertando. Podría estar insertando aquí. Podría estar insertando aquí. Podría estar insertando al final o al principio. Pero lo que sí sabemos es que a menos que seaal final, al final, vamos a tener que mover algunos datos. Entonces vamos a tener que tomar estos datos, y queremos cambiarlos todos hacia abajo para que quepan esta otra pieza de datos. Entonces, por ejemplo, digamos que en este ejemplo, aquí arriba tenemos un vamos a extender esto hacia afuera, y digamos que queremos insertar otro número que queremos aquí. Queremos insertar un cuatro. ¿ Qué vamos a tener que hacer, qué cantidad de trabajo o vamos a tener que hacer para meter a esos cuatro ahí para hacer esto, vamos a tener que llevarnos los tres. O en realidad, normalmente vamos a empezar el final aquí. Entonces nos vamos a llevar los dos. Vamos a moverlo, vamos a tomar los tres, vamos a moverlo, y luego vamos a tomar los cuatro, y vamos a insertarlo. Entonces eso va a tomar cuántas operaciones lo harán al máximo, va a tomar toda la matriz. Vamos a tener que mover cada elemento y luego más la adición del nuevo elemento. Entonces, ¿cuántos elementos de eso? Bueno, esa es nuestra confianza en que tenemos uno. Recuerda que en es la longitud de nuestro el tamaño de todas las piezas de datos que estamos tratando insertar. Entonces, ¿cuántas operaciones iban a hacer? Bueno, toda la pieza de datos actual va a requerir una Operación un movimiento para mover tres, mover por movimiento. Entonces eso va a estar dentro. En el mejor de los casos. Va a ser sólo una constante de inserción regular, así que va a ser sólo una. Pero aquí es donde se pone complicado. Tenemos que mirar el promedio. ¿ Cuál es el tiempo promedio que va a tomar para seguir insertando en una gráfica o en una matriz aquí, y ahí es donde obtenemos nuestro escribió el final aquí mismo. ¿ Es ese el tiempo promedio que va a tomar? Es algo así como, Oh, en más de dos y se puede pensar en eso. Si promediamos sobre una distribución normal, ya sabes, los ponemos en un punto aleatorio diferente. Estadísticamente y probabilidad sabia, los va a insertar al, uh, menos la misma cantidad para cada una de las células. Entonces digamos que lo insertamos. No lo sé, 12 veces probabilidad sabia, deberíamos llegar a aquí a aquí, a aquí, a A bajar la lista fuera de lugar diferente para insertar. Y eso significa que aquí arriba, va a tomar tiempos cada vez. Y entonces aquí va a tomar en menos uno en menos dos en menos tres y menos cuatro y menos cinco en menos seis. Entonces va a tomar tiempo constante, y para que eso promedia a todos ellos combinados sobre a lo que nos va a dar luego nuestro en más de dos. Y recuerda, estamos hablando de tiempos de corrida. Tenemos que tachar lo que sea que tengamos. Esto es sólo un 1/2 en el frente. Entonces simplemente lo tachamos. Y entonces eso significa que nuestro tiempo promedio termina siendo justo eso en. Por lo que una inserción aleatoria es a tiempo. Entonces, ¿qué En qué es la inserción al frente? Pero estamos hablando de eso, y esa es en realidad la parte lenta de nuestras inserciones. Inserción al frente va a ser o a la N también. Déjame deshacerme de esto por aquí. Entonces en cierto del frente va a ser O hasta el final. ¿ Recuerdas cuando estábamos hablando del ejemplo justo antes? Dijimos que si nos insertamos en el frente, ese va a ser nuestro peor escenario. Vamos a llevarnos todo y moverlo por uno. Entonces esa va a ser la O hasta el final. Ahora bien, ¿qué pasa si insertamos a la parte de atrás? Entonces, ¿vamos a insertar a este spot aquí mismo? Bueno, esta es una inserción muy fácil. Podemos simplemente poner un tres aquí. Si te queríamos y lo hemos insertado. Es un tiempo constante. Todo lo que se necesita es una sola operación que es tomar número. Ponlo en. No importa cuántas piezas tengamos. Esto podría ser, ya sabes, esto podría ser cero y luego 10 2030 40 50. Y en esos puñado de números en el medio, no hay importa. Sólo vamos a decir, ya sabes que X de 50 equivale a tres y ahora es igual a tres. Siempre es tiempo constante. Entonces por eso, con una inserción de matriz en la parte posterior también es tiempo constante. Ahora, entonces, delish en una eliminación significa que vamos a eliminar el elemento. Pero hay que recordar, mantener la integridad. Levantemos todos los ceros aquí abajo para volver. Eso significa que tenemos que mantener la integridad. Y entonces, ¿qué significa eso? Eso significa que si le quitamos un siete, si quitamos los siete desde el principio, lo que tenemos que hacer es realmente necesitamos asegurarnos de que el resto de éstos caiga hacia atrás hacia eso. Entonces sigamos adelante y nos hagamos un pequeño ejemplo aquí arriba. Digamos que tenemos un montón de números, como así nos dieron una matriz 1234 que es tamaño para, pero la indexación recordar es comienza en cero. Entonces digamos que queríamos eliminar uno de nuestro conjunto de datos. Bueno, lo que sea que eliminemos el del conjunto de datos, no podemos simplemente dejar aquí un espacio vacío que no mantenga la continuidad de nuestros datos . Si tratamos de agarrar el primer elemento, solo asumimos que, ya sabes, tal vez tenemos un algoritmo y siempre intenta agarrar el primer elemento así. Se va a salir al aire. Ahí no hay nada. Entonces lo que tenemos que hacer cada vez que eliminamos del frente es que tenemos que hacer exactamente lo mismo . Tenemos que retroceder, retroceder, retroceder. Y como se puede ver de lo que hablamos antes, cualquier cosa que nos va a requerir que retrocedamos un montón de veces va a ser O hasta el final. Delish al azar también es ir al final también. Entonces si solo tomamos cualquier tipo de borrado aleatoriamente aquí, se le debía. El final ahora en array también tiene ese bonito beneficio de poder eliminar de atrás en tiempo constante porque no tenemos que cambiar nada. Entonces si queríamos simplemente borrar los cuatro de atrás, todo lo que tenemos que hacer es simplemente borrarlo. Entonces en código, ya sabes, podría ser algo así como X de tres iguales no son cotización vacía o lo que sea para hacerlo vacío. Entonces, de todos modos, así de sencillo es. Se Zingale operación. Nada más tiene que entrar, así que también le debe a la mujer tiempo constante. Entonces estos aire estos aire, el corto plazo, que usaré a veces es tiempo lineal. Por lo que todos estos son tiempo lineal. Esto es tiempo constante, lineal, constante. Y yo sólo quiero enseñarte ese voto ahora porque, como dije, podría intercambiarlos en el futuro y diciendo: Oh, Oh, al 10 al N Cada vez se pone un poco aburrido. Por lo que mucha gente solo dirán Constante, Dirán, lineales esos tan exponenciales. De todos modos, veamos nuestro último. ¿ Cuánto tiempo se tarda en buscar algo? El listado de búsqueda y sin clasificar. Esto de aquí está sin clasificar. Tenemos siete. Tenemos 89 10 y luego uno. Entonces no hay ningún tipo de orden aquí. Realmente no conocemos el orden. Entonces, ¿cuánto tiempo va a tardar? Digamos que queremos ver es a es un nueve presente. Bueno, no hay riel. Forma rápida de hacer esto. Lo que tenemos que hacer es hacer el método de la cuarta fuerza bruta bruta. Eso significa que tenemos que empezar aquí. ¿ Se niega este mal? No. Pasar al siguiente. ¿ Es esta secuela esta noche? No. Pasar al siguiente. ¿ El sencillo es el nueve? Sí, lo es. Pero si estamos, por ejemplo, buscando 90 estaríamos como, Nope. No, no. Y vamos todo el camino abajo de la lista hasta que nos quedamos sin. Hasta que lleguemos a un espacio aquí mismo que no tenga información alguna. Y entonces volveríamos. No, no es igual a 90. Por lo que esa operación termina siendo como el resto. Ah, el final. Porque en el peor de los casos, vamos a tener que bajar cada uno de estos y hacerlo todo el camino hasta el final para averiguar si realmente existe dentro de la matriz, podríamos tener suerte. Por supuesto que a veces podría ser al principio mismo. ocasiones podría ser de dos o tres elementos en, pero en promedio, el peor de los casos es que se va a deber hasta el final. Entonces ese también va a ser tiempo lineal. Y luego la última, la última vez. En realidad vamos a decir para la próxima conferencia porque esto va a funcionar previo, un poco de especie de inmersión profunda en por qué sale una matriz ordenada de búsqueda para iniciar sesión. Y así podrías estar mirando eso ahora mismo siendo como, ¿Qué significa eso? Por eso vamos a sumergirnos en profundidad exactamente por qué esa búsqueda ordenada registro igual de fin. Pero sólo quería repasar una o dos cosas más en esta conferencia, y luego vamos a seguir adelante y saltar a esa conferencia. Lo último que quiero repasar es ¿qué nos dice todo esto? ¿ Qué nos dice esto de las ventajas y las desventajas de una matriz podemos ver inmediato del bate que por almacenar datos que todos tienen una especie de integridad para ellos, tal vez en una tasa no es lo mejor para como si tuviéramos Ah, programa que necesita insertar y elite constantemente porque cada vez que insertemos borrar, se va a deber hasta el final, sobre todo si estamos insertando al frente o al azar dentro de él. Y en realidad tenemos otras estructuras de datos que pueden hacer que esos todos los tiempos constantes. Entonces tal vez algo así no es muy importante. Y algo que tipo de no está por aquí pero hemos estado dando por sentado es la capacidad simplemente comprobar lo que hay en cada uno de estos elementos. Yo sólo puedo decir, ya sabes, puedo llamar menos tres. Puedo llamar a este elemento, y me va a decir instantáneamente que hay 10 ahí. Eso es algo más que es una ventaja muy grande para una carrera. ¿ Es este tiempo de acceso constante? Eso es algo más que tal vez no comparamos con otros tanto. Pero se llama tiempo de acceso. ¿ Cuánto tiempo se tarda en llegar a un elemento dentro de la matriz y en esta situación, todos estos tiempos de aire constante? Eso es lo que te da una matriz es la capacidad de simplemente empezar en algún lugar y luego ir a cualquiera de estos elementos y llegar a él de inmediato. Entonces el tiempo de acceso es constante, y eso es muy importante. Si, por ejemplo, digamos que no tenemos un programa que saca e inserte mucha información con el programa que de vez en cuando hace eso. Pero la mayoría de las veces es sólo revisar diferentes lugares. Solo estamos almacenando información diferente aquí, y entonces somos como entonces los programas como, Vale, Vale, necesito el número tres, ¿qué hay en el número tres? Y el número cuatro? Lo que está en el número cuatro y luego es constantemente una especie de mandar esa información de ida y vuelta . Pero la mayoría de las veces. Esto se mantiene cotizar uncomillas estáticas, lo que significa que no cambia. Ahí es donde una matriz puede ser útil. Tenemos ese tiempo de acceso realmente rápido, y hará que todo vaya mucho más rápido. No obstante, como dije, si estamos insertando en liderar todo el tiempo, tal vez quieras mirar una estructura de datos diferente de todos modos, vamos a saltar a eso realmente necesita ejemplo de la búsqueda ordenada, y veamos por qué eso sale para iniciar sesión 12. Algoritmo de búsqueda de Search de 2 o 4 de la barra fija: Entonces repasemos de lo que hablamos en la última conferencia. Y esa va a ser la búsqueda de matriz fija ordenada. Entonces, ¿por qué esto es diferente? ¿ Por qué esto nos ayuda a llegar a ese interesante runtime de log in que es sustancialmente más rápido que el O hasta el final. La versión sin clasificar. Esto va a ser mucho más rápido que por qué cuando lo ordenemos, ¿Tenemos esta ventaja? Y eso es porque hacemos algo llamado tipo binario. Entonces va a ser un algoritmo de clasificación binario o un algoritmo de búsqueda binaria. Mi mal. Algoritmo de búsqueda binaria. El motivo por el que esto nos permite hacer un algoritmo de búsqueda binaria es por la forma en que se configuró. Entonces imagina la antigua forma de hacerlo. Y ese es el método de la fuerza bruta. Digamos que estamos tratando de encontrar ¿existe 19? Entonces estamos tratando de descifrar es 19 existir como Así que para hacer eso con un método de fuerza bruta, sólo vamos desde el principio. ¿ Está aquí? No. No, no, no. Y sólo seguimos bajando por la lista. Y por supuesto, podría no estar en la lista y Por lo tanto, tenemos que pasar por toda la lista para averiguarlo. O podría estar a mitad de camino de la lista o cerca del final, o tal vez justo al principio. De cualquier manera, en el peor, va a tomar Esa lista entera va a llevar O a la hora del final. No obstante, con una búsqueda binaria, podemos garantizar que está en Lee Going to take log of end time and log of in time es como dije, es mucho más rápido. Recuerda cuando estás hablando de iniciar sesión y de los tutoriales anteriores, va así, lo que significa que el al principio mismo, el número fuera del número de elementos que tenemos. Entonces digamos que esto yendo a la derecha aquí, este acceso va a ser el número de elementos en que tenemos. Y así es el tiempo que lleva. El tiempo de búsqueda o de ejecución son tiempo de ejecución. Y entonces lo que eso nos va a decir es que con el Mawr en que conseguimos esta carrera, tiempo se ralentiza para que en algún momento salgamos como 32,000 y va a ser básicamente el mismo tiempo de ejecución a 64,000 que es básicamente el mismo tiempo de ejecución que 128,000. Va a subir más lento y más lento y más lento cada vez. Y así sucede esto por la forma en que funciona la búsqueda binaria. Entonces sigamos adelante y pasemos por ese ejemplo. ¿ Cómo pasaríamos? ¿ Cómo buscaríamos una matriz fija? Bueno, lo que hacemos es seguir adelante y hacemos esta pequeña fórmula. Se llama izquierda más derecha a. Entonces tomamos a la izquierda más a la derecha, y luego vamos adelante y dividimos eso por dos. Entonces esa es nuestra fórmula. Entonces sigamos adelante. Tomemos eso Y en realidad movamos eso ahí arriba porque vamos a estar referenciando mucho a esto mientras hacemos esto. Entonces izquierda, plus, derecha a. Entonces lo que quede a la izquierda va a seguir adelante y ser la porción muy izquierda. Va a ser el número que nos quede de la izquierda, si eso tiene sentido. Entonces en esta situación, es una matriz completa. Están a la izquierda, es cero y están a la derecha es la derecha completa de la derecha aquí, que es el 10. Vamos a tomar esos dos números, vamos a sumar juntos, y luego nos dividiremos por dos. Y ese es el índice Vamos a buscar al principio. Entonces eso significa nuestro primer paso aquí mismo. Vamos a tomar la izquierda. Mantengamos los números iguales aquí. Vamos a tomar la izquierda, que va a ser cero, y luego vamos a seguir adelante y sumar a la derecha, que es la 10. Y lo iban a dividir por dos. cual, por supuesto, sólo sale a 10 dividido por dos, que es cinco. Entonces nuestro primer paso, agarramos el índice cinco aquí mismo. Entonces vamos adelante y agarramos el índice cinco. Vamos adelante, lo tomamos, lo traemos de vuelta y echamos un vistazo. ¿ Qué es? Entonces, ¿qué es ex de cinco? Bueno , regresa 12. Por lo que ahora nuestra próxima decisión es 12. Menos o es mayor que el número que buscamos? Bueno, 12 es menos que el número que buscaban. Y recuerda, esta es una matriz ordenada. Entonces si 12 es menor que el número que buscamos, ¿por qué alguna vez buscaríamos de este lado? Ya sabemos que esto está ordenado, así que me refiero a que todo antes de esto va a ser menor de 12 y sabemos que nuestro número es en realidad mayor a 12. Sabemos que 19 es mayor a 12. Por lo que 19 tiene que estar de este lado. Entonces, por tanto, sólo tomamos todo este lado por aquí y acabamos de salir. Ni siquiera lo miramos. No lo vamos a tocar. No vamos a verificar lo que hay ahí porque confiamos en que esta matriz ordenara. Por lo tanto, vamos a seguir adelante y a ir a la derecha. Vamos a echar un vistazo al lado derecho, y luego vamos a hacer nuestra pequeña fórmula una vez más. Entonces vamos a seguir adelante y tomar la izquierda y la izquierda ahora es un cinco. Normalmente, sin embargo, ya hemos buscado esto. No necesitamos hacer Mira esto. Entonces en realidad vamos a hacerlo ya que es mayor de lo que le agregamos uno. Si fuera menos de lo que nos llevaríamos uno. Pero vamos a seguir adelante y empezar con seis ahora, así que vamos a seguir adelante y seguir con seis, y luego vamos a sumar un, uh, más el lado derecho, que sigue siendo 10. Divide eso por dos. Y esta situación, en realidad vamos a conseguir un 16 dividido por dos, que va a igualar ocho. Y para que veamos aquí la sección ocho o el índice ocho, vamos a decir, ¿Qué es eso? Índice ocho. Echamos un vistazo. Y, por supuesto, X de ocho. Bueno, eso devuelve un 20. Bueno, es 20 mayor que o es menor que nuestro 1920 es mayor que 19. Por lo que nuestra segunda búsqueda fue justo aquí. 20. Echamos un vistazo. Nos damos cuenta de que es lección. Entonces vamos a la izquierda. Y eso significa que Hey, no necesitamos toda esta sección por aquí. Entonces ahora vamos a seguir adelante y tomar el ocho menos por uno, y luego vamos a tomar lo que quede. Por lo que la parte izquierda de esto es seis. La parte correcta es siete. Entonces vamos a seguir bajando la fórmula. Entonces vamos adelante y tomamos el seis y luego lo sumamos a los siete en esta situación sumados a siete. Entonces dividimos eso por dos, y nos sacamos 13 divididos por dos. Ahora bien, esto es importante. Tenemos 13 divididos por dos. Con esto, típicamente hacemos algo llamado truncamiento donde esto no equivale a 7.5 en esta situación . O en realidad, nada de esto sería 6.5. Esto no es igual 6.5 y no lo redondeamos. No lo redondeamos todo. Hacemos lo que le llamamos truncamiento, que es Acabamos de truncar el back end. Sea lo que sea esto, lo borramos y tomamos lo que sea el entero. Tomamos cualquiera que sea el número al principio es el número entero. Entonces, por ejemplo, si tuviéramos un 7.9 , seguiría siendo siete. Teníamos 7.3. Seguirían siendo siete. Si tuviéramos 7.98 seguirían siendo siete. Eso es lo que es truncar. Entonces eso es lo que hacemos. Sea lo que sea que hagamos esta fórmula. Entonces truncamos y comprobamos seis. Vamos adelante y echamos un vistazo a seis. Echamos un vistazo a seis y nos sacamos el número 17. Volvemos a hacer nuestro pequeño proceso. Bueno, sabemos que es correcto de ello y en realidad podemos hacer la fórmula una vez más aquí y por lo general tener como un cheque. Si es el último elemento, basta con mirar el elemento del mismo. ¿ Está ahí? ¿ No es seguir adelante? No obstante, podemos volver a hacer todo el asunto. Podemos hacer. El siete es a la izquierda. Más siete es la derecha dividida por dos. Entonces eso es 14 dividido por dos, lo que equivale a siete. Entonces hacemos nuestra fórmula comprobamos es siete. Aquí mismo es 19 igual a 19. Lo es. Eso significa que aquí mismo vamos adelante y sólo lo comprobamos. Es así que eso es lo que hace esta fórmula. Se lo toma y cada vez que lo divide por la mitad. Y esa es una especie de la parte importante aquí. Entender es que cada vez que dividimos el problema y 1/2 así que eso significa, por ejemplo, si empezamos con oh, no lo sé, como 128 artículos diferentes después de la primera generación solo estaban revisando 64 ítems. Después de eso, estamos revisando 32 artículos y después de eso estamos revisando, ya sabes, 16 y en ocho y luego cuatro y luego dos y luego uno. Y la cosa es, es porque esto se duplica cada vez, el número de pasos sólo aumenta. Aumenta más lento y más lento. Entonces, por ejemplo, cada uno de estos es un paso. Por lo que tenemos 123456 y íbamos a repasar esto múltiples veces a lo largo de este curso porque es tan importante en tantas áreas diferentes. Pero lo que tenemos aquí es que 128 equivale a Onley seis pasos. Ahora, si duplicamos eso, si vamos un paso más allá Así que en lugar de 128 ítems, tenemos 256 ítems Will 256 solo equivale a siete. Sólo hacemos un paso más para llegar allí. Y entonces, claro, podríamos bajar otra, que va a ser 512. Y eso es sólo un ocho igual y así sucesivamente y así sucesivamente y así sucesivamente. Entonces conseguimos que esa gráfica de la que estamos hablando no no no tan fea. Tener una gráfica. Obtenemos esa gráfica de la que estamos hablando, donde sube y termina donde el número de en que obtenemos el cambio, el tiempo de ejecución, este es el tiempo de ejecución de la izquierda se pone cada vez menos y cada vez menos y menos y menos con el tiempo. Y que este patrón aquí, esto se llama Iniciar sesión. Y si realmente aplicamos, si realmente ponemos en registro de 512 realmente nos consigue. Da salida ocho. Eso es lo que es el patrón. Esto es Esta es justamente la forma en que los matemáticos representan. Este patrón es a través de esta cosa llamada log. Y por eso sale el tiempo de ejecución para iniciar sesión. Porque este pequeño patrón complejo aquí, realidad no es demasiado complejo. Una vez que te conectas a una computadora, es como seis líneas de código. Pero este patrón aquí mismo realmente hace todo el asunto. Lo hace y lo corta a la mitad cada vez para que tengamos el log in tiempo. Y por lo tanto, ya que podemos hacerlo ahí dentro, podemos usar esta búsqueda binaria para hacerlo. Nuestro peor caso, tiempo de ejecución, se puede bajar a solo log de n 13. 2-5 Arrays circulares: en la última lección, discutimos un aumento y cómo podríamos sumar restar. Y entonces también discutimos el tiempo de estos rayos, ¿ como qué? Todo tipo de operación, lo que cuesta. Entonces si quisieras contestar al azar, podríamos hacerlo básicamente al instante. Pero si quisiéramos insertarlo en el frente con respecto a, como el resto de la carrera, tenemos que empujar al resto del rayo hacia atrás en realidad tendría que ir todo adentro. Y todo este tipo de, ya sabes, asumen que no estamos anulando. Cosas en las que asumen que estamos gestionando nuestros datos de manera efectiva sobre no estamos borrando o anulando o yendo demasiado lejos de nuestros límites de matriz. Entonces estos son básicamente los límites de la matriz que hemos creado, pero en realidad podemos mejorar en uno de ellos, Y ese va a ser éste de aquí mismo, el inserto al frente creando algo que se conoce como una matriz circular. Entonces, en teoría, lo que estamos haciendo es la matriz y la memoria siempre va a verse así. Siempre va a ser una cuadra que va a ir desde, ya sabes, el mismo principio, todo el camino hasta el final como así se va a asignar y luego se va a llenar, y eso es sobre eso. Realmente no se puede hacer como cualquier otra cosa. Pero teóricamente lo estamos haciendo es que vamos a averiguar una forma de que podamos llevar esto llegar y podríamos convertirlo en un rayo circular, que es así. Entonces, por ejemplo, evidente en este momento y ahora realmente vamos a tomar este array, y vamos a convertirlo en este círculo aquí mismo. En beneficio de eso es ahora que si queremos insertar algo, digamos que tenemos 123 si queremos insertar algo al frente. Entonces digamos que este es el frente. Todo lo que tenemos que hacer es simplemente mirar uno hacia atrás e insertarlo ahí mismo. Y qué rápido con eso. Eso fue tiempo constante, lo que significa que en realidad podemos mejorar la inserción en el frente como tiempo constante creando esta matriz circular. Y entonces lo que vamos a dio es que esto es un poco difícil implementar en código, pero la teoría detrás no es tan difícil. Entonces vamos a tener lo que se conoce como Punteros. Vamos a tener uno que apunte a la parte superior justo aquí. Y iban a tener uno que apunta al fondo justo aquí. Y ambos van a apuntar en el mismo lugar exacto ahora mismo porque este top uno, este top one, va a ser el frente de nuestra derecha. Vamos a tener algo que nos diga que este es el frente, y vamos a tener algo que nos diga que esta es la parte de atrás. Y así ahora, cada vez que insertamos en la matriz y estamos diciendo que no estamos haciendo inserciones aleatorias solo estaban haciendo inserción en la parte posterior o inserción de la parte frontal de la matriz. Entonces estamos insertando en la parte trasera ahora mismo, o en el frente. Ambos están apuntando exactamente el mismo lugar. Vamos a seguir adelante un inserto, un número aquí mismo. Y así ahora que hemos insertado un número en nuestra matriz, entonces podemos tomar la espalda y dependiendo de cómo lo implemente. Entonces, por ejemplo, siempre podríamos insertar uno más lo que sea que se señale la parte posterior, o bien podemos apuntar la espalda al siguiente espacio disponible. Voy a apuntar al siguiente espacio disponible Así que llenamos este ahora y en la parte de atrás en realidad se mueve por aquí. Entonces ahora está señalando por aquí como así Y así ahora tenemos esto están de vuelta, se señala aquí, y así vamos a seguir adelante e insertar otro número. Entonces nuestro programa, podemos simplemente en realidad, si escribimos esto en un programa, realidad podríamos hacer algo como esto. Podríamos volver X atrás, y en realidad nos apuntará al lugar exacto que queremos llenar. Entonces vamos X atrás igual a seis. Y así ahora podemos poner un seis aquí. Vamos a hacer exactamente lo que acabamos de hacer antes. Vamos a seleccionar esto aquí mismo. Déjame obtener una selección aquí mismo para que pueda seleccionar en absoluto. Vamos a agarrar este elemento, y luego lo vamos a mover a la siguiente parte por aquí, y de alguna manera parte de mi flecha no lo logró con eso. Entonces vamos bien, parte de eso me iba a quedar ahí. Entonces lo que tenemos ahora es que la espalda se mueve sobre una. Por lo que ahora están de vuelta se señala aquí, y así todo va bien. Pero lo que podemos hacer ahora es porque tenemos estos punteros diciéndonos a dónde se dirige exactamente todo. En realidad podemos insertar del frente sin hacer um sin tener que empujar todo hacia adelante. Y eso es porque en lugar de empujar todo hacia adelante, sólo vamos a mover el puntero hacia atrás. Entonces insertemos del frente ahora sigamos adelante e insertemos el frente. Entonces, por ejemplo, podríamos ir, um, vamos x de frente equivale a algún número, pero notarás que en esta situación el frente realmente está apuntado al frente. Entonces lo que podemos hacer es que podríamos ir x de frente menos uno, y eso nos va a llevar al lugar justo al lado. El menos un spot. Y pudimos haber hecho lo que hicimos con la espalda donde lo quitaron y dijimos haciendo eso. Pero quería hacer las dos vías aquí, Así que estamos haciendo X de Frente menos uno es igual a siete. Y así eso nos va a conseguir ex de negativo uno igual siete. Pero eso no funciona. No podemos agregar uno negativo inju. Nuestro rayo obtendrá una segunda caída. Iremos fuera de nuestros límites. Los números negativos no aparecen en un aumento. Entonces lo que podemos hacer y decir es que en realidad va a hacer este algoritmo aquí donde vamos a tomar el número cualquiera que sea. Entonces insertamos en uno negativo y vamos a sumar sin embargo muchos, um, spots que haya aquí dentro y así se puede ver hay 123456789 10 11 12 Porque recuerda, esto es en menos uno. Por aquí, esto está en menos uno. Entonces eso significa nuestro en igual a 12. Entonces lo vamos a hacer es que vamos a tomar el atado ilegal y vamos a sumar en él. Y en este caso, Así que es negativo uno más y así estamos sumando como 12. Y así eso nos va a dar la posición de 11. Entonces ahora cuando vayamos a este negativo, vamos a volver a asociarlo, y en realidad vamos a insertar esto en la parte de atrás, ¿ verdad? Al igual que, inserte este siete aquí mismo en la parte posterior del rayo. Y ahora lo que vamos a Dio es que vamos a tomar el este elemento y lo vamos a arrastrar por aquí así Y ahora el frente de nuestro rayo es Déjame ir adelante y correr eso ahí para que no lleguemos a ninguna flechas aquí dentro. Entonces ahora la parte trasera o la delantera de nuestra tarifa está en realidad en la parte trasera de nuestra derecha, y así esto se pone un poco confuso. Eres como, ¿Cuál es el frente? ¿ Cuál es la parte de atrás? Entonces ya no tenemos que pensar en esto así, esta línea recta. Tenemos que pensar en ello como si lo acurrucáramos en círculos. Entonces lo estamos haciendo es hacer que emule ese curl es que realmente estamos tomando el frente y la parte trasera los estamos haciendo un seguimiento, y esto nos permitirá insertar en ambas posiciones simplemente llamando a un número determinado e insertando ahí. Y esto va a seguir así mientras éste va a seguir así. Y, por supuesto, podrías llegar a un punto en el que empiezan a anularse unos a otros. Y de nuevo, eso no es algo que estamos tratando de tratar contigo. Eso es un error. Si alguna vez tienes tu frente y tu espalda algo así como tratar de atacar exactamente la misma zona. Eso es un error de tu parte en la implementación de tu programa y tendrá que ser abordado en alguna parte en el abrigo. Pero esto no se trata del código. Se trata de la teoría. Entonces con esto, lo que hemos creado aquí con este rayo circular agregando los punteros delantero y trasero y, ya sabes, podrían ser sólo variables que literalmente nuestros números. Por lo que ahora podríamos decir frente equivale a 11. Si bien podríamos decir atrás equivale a dos y luego si alguna vez quisiéramos insertar, podríamos simplemente ir x de atrás como lo hicimos ahí arriba equivale a algo. O podríamos ir x de frente menos uno. Y yo hice los dos del menos uno y el exacto en esto porque, como dije, solo quería mostrarles a ambos los caminos, pero quizá quieras mantenerlos como similares. Um, por lo que debe ser atrás menos uno y frente menos uno o atrás y frente. Simplemente será confuso si uno de ellos es diferente al otro. Pero lo que estoy tratando de decir aquí es ahora que tenemos estas variables y son realmente fáciles hacer un seguimiento. Después de crear algo, solo decimos frente más una espalda más una o lo que sea. Nuestro frente menos uno atrás más uno Y entonces podemos seguir simplemente llamándolo. Empezando por la parte posterior en la parte delantera de este rayo, lo hacemos circular. Y a través de todo eso creamos, podemos tachar el o de adentro y con un rayo circular son el tiempo de inserción realmente se convierte en o de uno. 14. 2-6 Arrays dinámicos: hasta llegar a este punto, como que ignoramos caso importante. Y ese es el hecho de que un aumento puede llenarse y lo que hacemos, ganar un aumento, llenarse. Hemos estado discutiendo antes de este punto básicamente lo que se conoce como arreglos fijos, que se plantean que una vez que llegan al final, una vez que están llenos de capacidad, no pasa nada más. Vas a tener que sobrescribir alguna duda, una subvención para eliminar algunos datos. De alguna manera se tiene que hacer un compromiso que va a tener que cumplir. No obstante, existe una especie de matriz que puede crecer con su programa, y esto se denomina matriz dinámica. Y entonces lo que vamos a discutir en esta conferencia es plantear dinámicamente cómo funcionan y algunos de los tiempos de corrida que podrían estar asociados con tal aumento. Entonces lo primero que necesitamos entender es que un lado y Ray se llena. Entonces digamos que tenemos en un rayo justo aquí y una vez que se llena de números o pieza de datos. Entonces tenemos, como, un tres aquí un dos, tal vez un 1 1007 ya sabes, no importa una vez que está lleno. Una vez que nuestro Ray aquí arriba está lleno lo que hacemos para sumar a eso. Muy bien, Entonces si nosotros, ya sabes, etiquetamos aquí abajo las ciertas las áreas aquí. Entonces tenemos la columna 01 234 La única otra forma que podemos sumar a esto es que tenemos que sobrescribir algo. Y si queremos sumar al final, entonces llegamos a un gran problema porque no podemos sumar al y no hay fin. Se va a decir, um, por ejemplo, si tienes un programa que solo incremente ID por uno cada vez, queríamos sumar al final. Una vez que lleguemos a este punto y tratamos de sumar al final una vez más, se va a conseguir una segunda caída. Vamos a tener algo como, ya sabes, um oh, tenemos que sumar hasta ex de cinco ahora es igual a siete. Eso no va a funcionar. Eso va a terminar en una falla de segue porque aquí no hay cinco. Aquí no hay cinco a la derecha, por lo que se va a tratar de tocar datos que no tenga la capacidad ni el conocimiento para tocar, lo que establecerá falla el programa. Se saldrá al aire y nunca se ejecutará. Entonces, ¿qué hacemos en esta situación? Lo que podemos hacer es que en realidad podemos aumentar dinámicamente el tamaño de la matriz. Ahora el problema es, es que una vez que se crea una matriz, se crea el tamaño. Si recuerdas, se creó de nuevo para tener una memoria , por ejemplo, teníamos un montón de segmentos y digamos en cada uno de estos segmentos creó esta matriz aquí mismo. Pero el problema es que este es segmento ya estaba asignado y después de esto fueron datos adicionales . Por lo que no puedes simplemente aumentar el tamaño de la matriz. Eso no funciona porque estarías anulando algunos otros datos quizá críticos del sistema por aquí. Y eso es un problema. No queremos estar haciendo eso. Entonces lo que se puede dio es en lugar de simplemente agregar al final, se puede hacer una nueva matriz y copiar toda la información por ahí una matriz nueva, más grande. Y así esa es la técnica común que se suele usar. Y así ahí. Sabes que hay un par de maneras diferentes de hacer esto. Digamos que en lugar de un cinco, array quería agregar uno hasta el final. Entonces ahora lo que tenemos que dio es crearnos en un raro aquí mismo. Digamos que es en lugar de cinco bigotes, seis grandes. Entonces está aquí. Aquí, aquí, aquí, Aquí estaba ese 123456 Ok, Y entonces así entonces copiamos sobre un dato. Entonces tenemos tres y esto aguanta el problema aquí ¿Es eso lo que tenemos para crear una nueva matriz? Porque de lo que acabamos de hablar, no podemos hacerlo más largo. Entonces tenemos que crear una nueva matriz, pero no hay aumento vacío. Ahora en realidad vamos a tener que entrar y agarrar cada pieza de datos y copiarla . Y así cuando hagamos eso, lo que va a terminar siendo es que vamos a tener que ir una transacción. Entonces un costo aquí es tres, luego un costo para obtener el costo 21 para obtener el costo 11 para obtener el costo 10 1 para obtener el siete y luego el inserto aquí. Entonces, por ejemplo, vamos a crear una inserción. Ahora crea ex de cinco. Dijimos que igual a siete. Y así conseguimos que siete insertados. Pero notarás que en lugar de la inserción normal hasta el final con la que estamos tratando, recuerda, de vuelta en todo esto, dentro a la espalda debe ser tiempo constante. Entonces el Ray dinámico el problema es, es que cuando intentamos insertar a la parte posterior de una matriz que ya estaba llena, agregamos una adicional, pero tomó tiempo. ¿ Por qué tardó en tiempo? Porque ahí en números aquí hay 12345 Así que en esta situación están en nuestro en igual cinco . Pero tuvimos que tomar. Agregamos uno a nuestros extremos con una R N se convirtió en seis, y se necesitaron seis operaciones para copiar todo. Y así imagina si esto fuera una matriz de, digamos, 100 de estos aquí mismo. Se necesitaría 100 operaciones para copiar todo sobre. Entonces eso significa directamente proporcional a cuántos números tenemos aquí. Qué maney dentro tenemos aquí. Eso es exactamente cuántos, um, operación va a tomar. Entonces en lugar de nuestro olor rápido primero, o son tiempo constante ya no es que este inserto realmente se convierte en o de tiempo final, y esto es un problema porque insertar en una carrera debe ser rápido. Esa es una de sus ventajas. No obstante, si llegamos al final de tiempo que algunas de nuestras otras opciones empiezan a volverse mucho más apetitosas, porque ya no tenemos inserciones instantáneas. Entonces, ¿qué nos dio? En realidad hay una manera de sortear esto. Hay una manera para que no tengas que hacer esta implementación para que no tengas que cambiarla de punta o hasta el final. Se puede mantener relativamente esto aquí mismo, y todo se reduce a algunos promedios. Entonces digamos que en lugar de hacerlo de la manera ingenua, que sería insertar una nueva caja cada vez. Entonces si necesitábamos seis, tomaríamos Insertaríamos una caja aquí al final, que hicimos justo aquí. Y si necesitábamos uno, creamos una matriz completamente nueva aquí abajo, y entonces tiene ya sabes, es B B 7 grande, y podríamos seguir haciendo eso. Pero todo lo que el tiempo que hacemos que sí se le debe el final, así que podemos hacer en su lugar debilitar hacer en su lugar es que es el doble del tamaño de la matriz ahora. Entonces si tienes una matriz que se ha creado, pasemos por el doble tipo de gráfico aquí. Entonces tienes una matriz. Ahora está lleno de uno. Ahora insertas hasta el final. Ahora, ahora lo duplicamos. Es demasiado de cuatro que ocho en 16 que 32 en 64 1 28 y así sucesivamente. Sube que le estamos haciendo a Exponential está aquí para hacer la X justo aquí arriba. Eso es lo que estamos haciendo aquí es cada vez que se llenan los cohetes, vamos a duplicar el tamaño de la matriz y la forma en que la razón por la que esto ayuda es porque si notan hay una menor cantidad de tiempo que tenemos que usar sobre el fin. Entonces, por ejemplo, verás que en cada uno de estos puntos, tiene que ser O hasta el final. Tenemos a ti. Tenemos que copiar sobre la totalidad de los datos de lo anterior. Tenemos que copiar sobre los datos anteriores en el nuevo. Pero también notan algo aquí es que hay una cantidad creciente de distancia entre cada uno de estos números. Cada vez más, cada vez es más largo, más largo y más largo, que significa que si no tenemos que redimensionarlo, no tenemos que cambiar el tamaño justo aquí o aquí aquí. Lo que significa entre por ejemplo, 65 65 a 1 27 No tenemos que redimensionarlo, lo que significa que todas esas operaciones un camino al uno porque solo estamos haciendo inserciones regulares en ese punto. Entonces eso es una especie de lo que esto de aquí abajo representa el de abajo justo aquí es Lo que estoy representando aquí es que estamos tomando este tamaño y en lugar de tenerlo cinco, lo estamos duplicando a 10. Por lo que ahora copiamos los datos aquí mismo y vamos a tres, 21 10 107 y a los siete. Y ahora, en lugar de tener que hacer sobre el final para las próximas cuatro operaciones, estos anuncios serán todos oh, al uno porque no tenemos que redimensionarlo debilitarse. Simplemente insertarlo como una matriz normal. Y así esta fue la O hasta el final. Y luego si lo traemos de vuelta, si miramos aquí arriba, podemos pensar en esto para que éste hubiera tenido que ser o hasta el final para insertar, y luego tuvo que duplicar. Por lo que éste hubiera estado fuera hasta el final. Pero entonces tenemos un spot de 02 con uno oh al uno y luego tendríamos un doble. Este era cinco. Deberían ser cuatro. Si lo estamos haciendo de esta manera, veremos que empieza a conseguir cada vez más cantidad de la O a los unos. ¿ Y por qué es tan importante esto? Porque eso significa que en lugar de que toda nuestra operación sea O hasta el final, realidad podemos crear en una especie de promedio. Entonces echemos un vistazo a este promedio. Entonces entramos aquí y pasemos por algún simulacro de creación aquí. Entonces tenemos un inserto 23456 Sólo voy a bajar la lista aquí mismo. Sólo vamos a crearnos aquí una pequeña mesa. De todas las inserciones posibles que podríamos hacer hasta cierto punto y empezarás a ver el patrón aquí, empezarás a entender por qué esto en realidad es realmente bueno hacerlo para duplicar la matriz dinámica , y subiremos hasta 25 aquí mismo. En realidad vamos a subir a 32 porque ese es uno de nuestros bits son uno de nuestros puntos dobles . De acuerdo, entonces cuando insertemos 12 aquí, va a ser una operación constante. Tenemos una matriz. Vamos a crear nuestro derecho y va a ser F talla uno. Entonces esto va a ser constante va a ser uno aquí mismo. Ahora, una vez que llegues a este punto, se correrá con el espacio, así que tuvimos que duplicarlo. Entonces ahora es demasiado grande. Entonces esto fue una oda a la operación en, que, en realidad, fue en realidad un no a la única operación porque sólo teníamos una pieza de datos que teníamos que transferir . Pero técnicamente es una oda al final, así que vamos a sentarnos sin ti ahí dentro. Ahora tenemos un espacio abierto aquí, Así que si solo piensas en esto, voy a dibujar el cuadro por aquí un poco al principio para una especie de ilustrar lo que estamos haciendo aquí. Entonces tuvimos un spot. El problema fue que queríamos insertar un 2do 1 No quedan manchas. Entonces lo que hicimos fue duplicar, copiar los datos. Entonces ahora ya hay suficientes manchas. Ahora queremos ir a tres. El problema es que cuando llegamos a tres, necesitamos duplicarlo nuevamente porque no hay plazas disponibles. Ahora vamos a duplicar otra vez, y vamos a llenar que la insulina va a ser otra O hasta el final. Pero ahora el número cuatro para llenar el cuarto puesto, es Está abierto, así que podemos simplemente ir al que no tenemos que hacer ninguna duplicación de este spot aquí mismo. El índice spot aquí está abierto, y así seguimos adelante, y notamos que cinco van a necesitar duplicarse porque hemos corrido en los spots para poder seguir adelante y duplicarlo de nuevo. Copia todos nuestros datos a la nueva matriz. Y así ahora sigamos adelante y eliminemos la ambigüedad ahí mismo. Y así ahora tenemos todos nuestros datos. Nuestros datos en este punto están llenando este y éste y éste éste éste y cinco, Y ahora, Y ahora, una vez que lleguemos a pelear. Para que esa cinco operación que nos llevó vaya hasta el final, y ahora Una vez que lleguemos a seis aquí arriba, podemos llenarla de inmediato. Entonces ir a la 17 es exacta misma manera sobre la una y son lugar tiene ocho lugares. Entonces es o hasta el final justo aquí o mi mal, mi mal. Sigue siendo uno más con uno porque sí tenemos un espacio abierto aquí con otro O al uno. Entonces ahora tenemos la totalidad de la matriz llena una vez más, esto es 12 12345678 Está lleno, y ahora tenemos que duplicar una vez más, así que lo duplicamos de nuevo. Y entonces ahora lo que tenemos que hacer es crear un no al en operación, y voy a seguir dibujándolo ahora porque ahora se puede ver un patrón. Aquí está así lo hemos duplicado. Y ahora está bien hasta 16 spots, así que podríamos salir con uno. Ah, el que tiene uno. Podemos seguir bajando a esto hasta que lleguemos a la siguiente doble parte. Y entonces ahora estamos a los 16. Entonces ahora se va al final, y luego vamos a seguir adelante Tiempo constante, tiempo constante, tiempo constante, tiempo constante, tiempo constante, tiempo constante, tiempo constante. Ya no voy a escribir Theo. Simplemente voy a arreglar los tiempos constantes constantes, constantes, constantes, constantes, constantes, constantes. Y luego hasta si hicimos 32 constante 33 in y así sucesivamente. Y entonces, ¿por qué es esto importante? Bueno, te darás cuenta al principio, teníamos un montón de operaciones O a la N. Pero después de eso se estaba volviendo cada vez menos así hasta el final. Y cada vez más cabaña de troncos o cada vez más, mawr tiempo constante. Nosotros, por ejemplo, aquí mismo Tenemos tres constantes que un tiempo lineal. Así se llama. Vamos a empezar a llamarlo lineal un tiempo lineal, luego un montón de tiempos constantes, un tiempo más magro que una cantidad extraordinaria de tiempos constantes que una vez. Y lo que sucede es con el tiempo estos tiempos constantes o estos no constantes estos tiempos lineales van a quedar superados en número. Se van a superar. Y eso es porque el hecho de que estamos duplicando en cada vez, así que cuando lo duplicamos, en realidad estamos creando un log ocurrencias rítmicas de O hasta el final. Entonces estamos creando una ocurrencia como esta se puede ver que leer. Al principio, tenemos un montón de deshacernos del principio. Tenemos un montón de diferentes. Va de, como, como, cero dedo del pie. 1234 llamadas de logueado. Pero después de eso, cinco llamadas están por aquí. Seis llama su camino por aquí. Siete llamadas está completamente fuera de la pantalla. Y así se pone cada vez menos con el tiempo. Y todo esto se reduce a una especie importante de, um, una realización importante. Y eso es dejadme seguir adelante y hacer algo aquí mismo. Y ese es el hecho de que si lo duplicamos cada vez que lo doblamos, lo que realmente estamos haciendo es que estamos creando log of en el tiempo, un log de un promedio de cuatro nuestros extremos, lo que significa que este tipo de se mete en algún poquito de un complicado Matthew. Entonces solo voy a decírtelo y sólo una especie de entenderlo. A lo mejor adjuntaremos un documento que entienda un poco más. Pero lo que pasa aquí es ese registro de fin, porque en está asociado a eso, porque nuestras llamadas, porque nuestras llamadas a porque nuestras llamadas a fin comienzan a entrar en un log de in. En realidad podemos bajar esto a tiempos constantes. El promedio se convierte en tiempo constante, lo que significa que el peor escenario general se convierte, para todos los propósitos intensos, tiempo constante. Ahora es un toque por encima del tiempo verdadero, constante, pero para fines relacionales compararlo con otras cosas podemos entender y debilitar. Y se cree muy ampliamente que este inserto se convierte en tiempo constante. Y así, a través de todo esto, solo se puede pensar en ello. Hay un par de maneras diferentes en las que se podría implementar una matriz dinámica, pero hay una forma muy eficiente de hacerlo. Y notarás que mucha informática tiene cosas como esta donde hay una forma muy eficiente de implementar estos diseños y estos patrones. Y hay una manera muy ineficiente. Y así en esta situación, duplicar en cada tiempo es muy suficiente en el hecho de que sale a tiempo constante todo el camino al final por este cambio rítmico log. Y por eso es comprensivo. El matemático es algo importante, porque a través de esto, Matthew podría entender que cuando creas este largo promedio de cadenas a lo largo del tiempo que tu operación realmente especie de promedios a tiempo constante, y que sería la forma más eficiente de hacerlo. Entonces eso es arrays dinámicos y un poco de la teoría detrás de ellos. Un poco de matemáticas detrás de ellos y sólo una especie de buena introducción a cómo funciona el aumento dinámico y cómo se podría crear una especie de tasa dinámica, que es solo crear una nueva y luego duplicar el tamaño y luego llenar todo el información en cada vez que duplica. Entonces esos son dinámicos elevan su realmente, realmente cool porque eliminan parte de esa limitación del tamaño del espacio teniendo que ser constante , y te permiten solo tener mucha clase de flexibilidad ah en tu programación. , 15. Revisión de Array de 2a 7: Por lo que hemos cubierto mucho sobre un aumento en apenas estas pasadas dos conferencias. Y así que un poco quería sólo dar un paso atrás y simplemente volver a repasar todo realmente rápido y especie de empate todo esto juntos en 11 video. Entonces vamos a estar simplemente yendo rápido. Lo que hemos aprendido en las lecciones anteriores una especie de re, ya sabes, re ilustrando lo que hemos aprendido y luego simplemente atar todos estos aspectos juntos para que realmente podamos tener una buena comprensión de un aumento, cómo funcionan lo que sus tiempos de carrera, etcétera. Entonces lo primero que tenemos que hacer es solo recordar cómo funciona la carrera. Entonces raise son solo un punto de datos dentro de nuestro disco duro o nuestro ram o algún otro punto de nuestra computadora. Y esos datos se introducen en un segmento cada vez que creamos una matriz apuntaban a la pieza de datos en su conjunto, y le estamos dando un nombre. Entonces, por ejemplo, tiene una dirección física, una dirección de computadora, pero podríamos estar simplemente declarándola como una variable como, digamos, X es igual a una matriz de lo que es una longitud de rango cinco. Y así en esta situación podríamos estar declarando nuestra matriz del nombre de X mientras en la charla de computadora. Es encontrar una dirección de lugar y memoria específicos, y luego una vez que llamemos a esa dirección, nos va a llevar luego a la matriz misma. Y la matriz tiene estos muchos nombres, que me gusta llamarlos, que son sólo el tipo de la parte de la matriz que queremos contactar. Y entonces así podemos contactar a todos estos y suelen ser como que podrían incluso ponerse en el extremo aquí mismo. Entonces esto podría ser cero etcétera. No obstante, la computadora hace ese tipo de fuera del alcance de este curso, Pero la computadora hará lo suyo para que podamos acceder a cada uno de estos puntos instantáneamente solo dándole su nombre completo. Y luego son muchos nombres. Entonces en esta situación, si quisiéramos, si llenamos la tasa sin pecado y de datos aquí, Entonces, por ejemplo, tenemos, ya sabes, sólo algunos números aquí, y queríamos agarrar un punto específico o un lugar específico aquí. Todo lo que tenemos que hacer es sólo darle el nombre y luego el mini nombre en esta situación, también. Y luego recuperaremos nuestros resultados. Entonces, por ejemplo, esto sería ajustarlo a 10 y luego recuperarlo, diríamos que simplemente lo llamaríamos y lo devolvería y nos daría 10 porque iría. Este es su nombre principal. Está agarrando su nombre melena. Se utiliza en su nombre muchos, y luego obtiene nuestra pieza de datos así y así un aumento también puede tener propiedades adicionales , la matriz en esta situación. Lo que estamos haciendo es que en realidad sólo vamos de una a otra a la siguiente, y lo estamos llamando arbitrariamente diciendo a Debería ser 10 3 debería ser 44. No obstante, si quieres añadir un poco más de un estilo una estructura a esto, podemos empezar a añadir a la parte trasera o añadir al frente y solo por sí mismo. En esta situación, empezamos a meternos en el problema donde si queremos sumar al frente, vamos a tener que tomar todos nuestros datos y cambiarlos hacia abajo por uno porque no hay manera que pudiéramos simplemente asociarnos. Pero este es el frente. Este es el fin. No podemos ir a uno negativo. Negativo es una falla de la SEC que no existe en nuestro programa. Entonces tendríamos que bajar todo. Y eso trae un problema para que podamos dio para arreglar eso. El problema es que podemos empezar a crear una especie de aspecto adicional honore. Entonces si queremos hacerlo circular, recuerda, recuerda, esto fue conferenciado a Si quieres hacerlo circular, solo agregamos un puntero frontal y un puntero posterior sobre él y esto emulará una matriz circular . Emulará este tipo de cosas donde la matriz es en realidad circular en que lo hará si quieres agregar al frente todo lo que tienes que hacer es mover una a la izquierda, saliendo hacia atrás. Todo lo que tienes que hacer es mover uno, o en esta situación, contrario a las agujas del reloj o en sentido horario. Si quieres sumar a la espalda y así podemos entonces mover estos punteros lo que hay en todo podemos entonces mover estos punteros de un área a la siguiente. Si así lo elegimos una vez añadimos un elemento aquí. Podríamos asociar la parte de atrás aquí. Podríamos asociar la espalda a justo aquí. Y luego podemos sumar a la espalda en tiempo instantáneo y sumar al frente y al tiempo instantáneo también . Pero entonces nos encontramos con el caso donde, por ejemplo, son array podría quedarse sin espacio. Entonces, por ejemplo, podríamos tener este derecho, y podría llegar a ser demasiado grande. Y así si nuestro rayo termina haciéndose demasiado grande, lo que en realidad podemos dio es que podemos seguir adelante cuando podemos duplicar su tamaño. Entonces esto lo convierte en una matriz dinámica, debilitar hacer realmente, alguna forma de hacerlo más grande? Podríamos hacerlo ir, por ejemplo, Um, sólo añadir uno hasta el final. Pero aprendimos que eso no lo hace eficiente. Eso en realidad lo hace realmente ineficiente. Entonces si tuviéramos una matriz de a, así podríamos duplicar el tamaño una vez que lleguemos a un punto inválido y podríamos convertirlo en un array de cuatro como este y seguiremos doblándolo arriba y arriba, y veremos que poco a poco se hará más grande y más grandes y más grandes para ajustarse a nuestros datos tiempo, a lo largo del tiempo, y esto nos permitirá crear una tabla o una matriz, que con el tiempo agrega una inserción del final de O de uno por promediar. Entonces tendremos un par de instancias estas instancias aquí mismo donde va a estar en donde va a ser un tiempo lineal en cada una de estas instancias, y eso solo llega al hecho de que tenemos que copiar todos nuestros contenidos de cada vez re tamaño lo. Tenemos que copiar nuestros contenidos de la A más antigua al nuevo rayo y luego agregar nuestro número adicional . Y así cada vez que tengamos que ampliar esto, vamos a terminar teniendo que copiarlo por todas partes, que va a estar en, um, procedimiento. Entonces va a ser un en trámite cada vez que tengamos que hacer eso. Pero si lo duplicamos cada vez que esto en procedimiento se vuelve cada vez menos común hasta que sube un punto infinito en el que básicamente se convierte, vamos a tener que redimensionarlo. Vamos a tener que usar las casi cero veces así que pensando si vamos al infinito en algún momento, va a haber un tiempo en el que estamos usando,ya sabes, ya sabes, un 1,000.000.000 de operaciones constantes y luego una en operación. Y si tomas uno y lo divides por un mil 000.000.000 obtienes un número que es tan pequeño que bien podría ser cero. Y por eso, promedia que los extremos como van al infinito, extremos aquí como van al infinito, realidad terminan convirtiéndose en cero, y se vuelven básicamente inútiles. Ya no los miramos. Entonces sólo miramos el que tipo de uno fuera, y ese es el uso constante del tiempo constante. Entonces si duplicamos nuestro aumento A cada vez que se quedan sin datos, podemos conseguir un inserto de tiempo constante a la parte posterior, y eso hace que nuestro programa sea mucho más eficiente. Entonces eso es sólo una especie de análisis de lo que hemos estado cubriendo en estas últimas conferencias sobre un raise, cómo podrías hacerlos circulares, cómo podrías hacerlos dinámicos, y en algunos de los tiempos asociarte con cada de estos rayos. Entonces esto va a estar probando una especie de estos datos en el siguiente tipo de lección, donde en realidad estamos haciendo un pequeño quiz aquí de sólo una especie de asegurarnos de que todo esto esté cementado en sus mentes y usted entiende al menos lo básico. No tienes que entender todo esto al 100%. Muchos científicos informáticos no entienden todo este asunto al 100%. Nosotros sólo queremos tener una buena comprensión de ello para que si nos olvidamos de algo, podamos ir a buscarlo. Y tenemos una base suficientemente buena para entender lo que no entendemos. Si eso tiene sentido, entendemos la parte de que estamos teniendo problemas para mirar hacia arriba. Y si sólo entendemos un poquito, si tenemos una base que podamos continuar nuestro aprendizaje. Me emociona que hayamos llegado tan lejos que chicos hemos empezado a aprender tu primera estructura de datos en un aumento, y no puedo esperar a verte en la siguiente unidad donde vamos a estar discutiendo listasenlazadas listas 16. 2-8 de la de los ejemplos de mundo real: Ahora que tenemos una buena comprensión de un raise y cómo funcionan teóricamente, veamos algunos ejemplos del mundo real de dónde podríamos haber interactuado con una matriz sin siquiera saberlo. El ejemplo más común, o algo que se usa muy comúnmente es en nuestros smartphones. Ah, muchas veces tanto las listas aquí como el tipo del diseño de APP están todas basadas en array. Entonces lo que hacen es una tormenta en un aumento. Y cada vez que haces clic en esto, llama al comando cualquiera que sea la matriz que tengas. Entonces, por ejemplo, vamos a tener esta cuadrícula por aquí a la derecha. Se puede ver que tenemos 12345678 todo el camino hacia abajo. Y esta es la matriz. Los números en cada uno de estos se almacenan en una de estas matrices. Entonces, ¿qué hemos dado click en un botón? Entonces, por ejemplo, si hacemos clic en la tarifa de Facebook aquí, que se alina con el número 10 va a ir en la matriz y buscar el comando a las 10 . Una vez que vea que el comando a las 10 está abierto Facebook, abrirá Facebook, y haremos lo mismo con si tuviéramos 15. Se irá a volver arriba. Teníamos 19. Se irá a etcétera local, etcétera. Entonces lo que hace es cuando lo construye, crea una matriz con un montón de referencias de lo que debería abrir. Y estos rayos también tienen otra información. ¿ Al igual que qué? El icono deben ser los colores. Ya sabes, um, y otro tipo de información que funcionaría con cada uno de estos, el nombre de la APP, cosas así. Y luego cada vez que hacemos clic en él, entra y encuentra la pieza real de software para abrirse cada vez que hacemos clic en él. Y por aquí también tenemos una lista. Muchas veces estas se crean con un aumento, por lo que tendrás la matriz de cuentas, que tendrá un montón de cosas diferentes aquí. Y entonces tendrás la matriz general que tendrá un montón de propiedades diferentes aquí también. El motivo por el que funcionan los arreglos. El mejor aquí es por lo instantáneos que son. Entonces cuando hacemos clic en 18 no queremos ningún rezago entre esto. Y si hacemos clic en una, vamos a aprender sobre otra estructura de datos en la siguiente lección, que tarda más tiempo cuanto más abajo vayas. Entonces, por ejemplo, si hubiera 45 APS, no queremos que el número 45 tome más tiempo que el número uno. Nosotros los queremos a todos al instante. Lo mismo con por aquí cuando hacemos click en algo, queríamos ser exactamente el mismo tiempo. Y, como hemos estado hablando de un aumento, tener esa habilidad. Se puede llamar al array de dos o cuatro o 10 y obtener ese elemento instantáneamente, y por eso son tan importantes. Y son muy clave para usar. Si quieres ver cuáles podrían ser algunas de las convocatorias para un aumento en diferentes idiomas, realidad hay un artículo de Wikipedia realmente necesario al respecto. Pero hay esta mesa impresionante aquí y se pueden ver todos estos lenguajes, y cada uno de ellos tiene una matriz de alguna manera, forma o forma. Aquí está una especie de los grandes jugadores en programación justo aquí lo tienes sabes, tu ruby, tu python, tu javascript, Java C C plus así que realmente, los grandes jugadores en el mercado y todos se llaman con el nombre de la matriz y en el número de índice Entonces, por ejemplo, esto podría ser matriz AP, y luego esto es Index 10. Entonces esta sería una llamada de APP Array 10 y llamaría a todo dentro de esto, así que esa es solo una especie de forma interesante de mirarlo. Se puede ver que a pesar de que todos estos lenguajes son tan diferentes unos de otros, si todos usan un raise en alguna forma, o alguna forma otro uso común de un raise con bases de datos con bases de datos realmente, realmente grandes, ocasiones no se almacenan en un aumento, sus almacenados en modales ligeramente diferentes, como árboles o cosas así. Sólo porque una vez que tienes una matriz tan grande, te gustan los miles de millones, se pone un poco tedioso y se tiene que almacenar mucho ram si querías almacenar todos esos instantáneos. Entonces lo que hacen es crear cosas que son casi instantáneas pero que tardarán un poco más de tiempo. Pero eso es para una especie de explicaciones posteriores. Esto, sin embargo, es lo que en un rayo podría verse. Si tienes una más pequeña o incluso solo tablas dentro de una base de datos, estarán usando un aumento. Entonces, por ejemplo, si quisiéramos ordenar por utensilios de cocina, podríamos agarrar todos los que igualan los utensilios de cocina y luego simplemente volver a llamar. Will podría hacer tal vez una lista de todos esos números, y luego lo pasamos a una función, y luego simplemente llama a todos esos números. Entonces, por ejemplo, para estar en nuestra lista y luego 13 y 14 estarán en nuestra lista. Y cuando llamamos al 13 14 pudimos construir otra lista con solo utensilios de cocina para poder filtrar esta lista. Las matrices también se utilizan comúnmente en la Web. Este es en realidad uno de mis sitios web que tengo, y esto está usando WordPress. Pero con la parte ordenada al respecto es que he pasado por el código y cada parte de éstos realidad está usando una matriz en alguna forma o forma básicamente lo que hace que llama a todos los artículos como una matriz. Y los coloca aquí al igual que nuestro ejemplo de aplicación anterior. Y cada vez que haces clic en uno de estos, llama a las funciones, los nombres que todo lo que viene con él, y como que pasa por eso. Por lo que esta páginas Web Facebook, Twitter todos usan un aumento en alguna forma o forma para mostrar los datos. Y luego también, quería mostrar algo del código back-end aquí. Entonces esto es en realidad algún código de, um, el sitio web, y esta cosa es muy, muy compleja. Ni siquiera lo entiendo tan bien. Se tarda un poco el campo para simplemente saltar aquí y empezar a entender las cosas. Pero una de las partes aseadas es que se podía ver justo aquí. Este es un formulario de comentarios en WordPress. Se construye en array. Crea una matriz de toda la información que recoge del comentario. Y se usa aquí mismo. Se puede ver. El array se declara justo aquí. Y en realidad hay Honore aquí abajo y array aquí arriba. Hay rayos de en un aumento en una carrera. Como dije, realmente, realmente complejo. Este código es una especie de galimatías, a menos que realmente lo mires y pases horas y horas analizándolo . Pero sólo quería mostrarles que una matriz está presente en todo esto también. Entonces en cualquier lugar que mires eso tiene que ver con codificar un aumento nuestro ahí presentes y se están utilizando un aumento son casi los más. Hazlo si no la estructura de datos más utilizada por ahí. Entonces entenderlos realmente bien y luego entender algunos de sus beneficios como si fueran tiempo de ejecución rápido te demostrará por qué se usan en el mundo real tan a menudo. 17. 3-1 nodos: Entonces, antes de entrar en listas enlazadas, necesitamos entender de qué se compone la lista enlazada de qué están hechas? Y así vamos a estar hablando es de lo que están hechos. Y ahí se llaman nodos. Entonces, ¿qué es exactamente una nota? Una nota es realmente solo un objeto locacional. Se trata de un objeto que hace referencia a otros objetos, y por lo que podría ser un poco una definición confusa. Entonces vamos a seguir adelante y especie de escribir esto. Vamos a ilustrar qué es una nota. Por lo que estas cajas de aquí abajo, estas dos cajas en la parte inferior esta izquierda en esta derecha thes se contarían nuestros nodos. Y aquí arriba tenemos memoria. Por lo que podrían ser una matriz. Podría ser Ram. Podría ser realmente cualquier tipo de memoria aquí arriba, pero lo que sé que hace es que toma que tiene un montón de propiedades diferentes al respecto. Entonces, por ejemplo, podría tener, um, vamos con, como por lo general tiene una propiedad de datos. Entonces esa es la propiedad importante. Por ejemplo, podría tener una pieza de datos así, y tal vez ésta tenga una pieza de datos fuera así, pero normalmente no están dentro de la nota porque se supone que esto es como un objeto locacional. Entonces, lo que realmente hace el nodo es que tiene un spot para los datos en la parte superior, y luego tiene otro tipo de características de la parte inferior, que vamos a ir por aquí en un segundo. Y esta parte superior de los datos, en realidad contiene la dirección a un punto de memoria. Entonces, por ejemplo, digamos en nuestra memoria, aquí tenemos, um tenemos estas áreas y esto no es una matriz estas o simplemente lo hicieron, ya sabes, hay memoria adicionalmente por aquí y por aquí y estos aires apenas puntos reales en la memoria. Entonces, como este es F cero. Este es F uno. Este es F dos, y éste es F tres. Y entonces qué? En realidad está almacenando aquí, es que almacena la ubicación de los datos para que no tenga que estar en orden. Por ejemplo, este podría almacenar cero x f tres. Por lo que tiene un puntero que básicamente lo señala a esta pieza de datos. Bueno, este de aquí quizá podría almacenar cero x f uno Y así va a tener eso significa que Pointer está justo aquí. Y así ahora siempre que queramos nuestros datos cada vez que uno nuestros datos de nuestro nodo. Entonces si queremos los datos de los nodos, lo que podemos hacer es solo podríamos llamar al nodo, y luego como se llame su parte de datos y nos va a dar va a ir y hacer el trabajo por nosotros. Lo encontrará y luego lo devolverá para nosotros. Y así la parte importante sobre los nodos y la razón por la que se usan con tanta frecuencia es porque tienen otra característica especial. Y voy a usar este fondo galaxia Penda mostrar esta característica, y ese es el hecho de que tienen la capacidad de conectarse entre sí. Entonces, por ejemplo, podríamos decir eso Bueno, digamos que tenemos un estrecho entrando aquí y tenemos una flecha saliendo aquí. Podríamos tener tal vez aquí algo así como un siguiente, por lo que podríamos tener una siguiente parte de cada uno de estos nodos. Podríamos tener una parte previa a uno de estos nodos y estos realmente pueden ser cualquier cosa. Este podría ser el frente. Nos salimos de frente en uno de estos lados que siempre apuntará al frente. Podríamos tenerlo siempre apuntando a la parte de atrás. Podríamos haber apuntado siempre a ubicaciones específicas, pero una técnica común es el tenerlo anterior y frente. Y así vamos a seguir adelante y justo a la derecha que un poco claro anterior, siguiente. Y así cada uno de estos tiene anterior y siguiente. Y entonces lo que pasa es que se lo contemos. dónde debe ir el siguiente cuando podamos apuntar a otro nodo? Y en esta situación, podríamos apuntar a una nota anterior, y este nodo anterior podría apuntar en esta dirección hacia atrás como así déjame. Ese fue un mal aire. Déjame leer tu toda esa flecha para que pudiera apuntar hacia atrás así Y entonces ésta podría apuntar hacia adelante, que está justo ahí, y podría tener una flecha que en realidad apunta hacia atrás hacia ella, como así. Y así lo que esto hace es que crea una lista enlazada, y entonces eso es lo que estaremos discutiendo es que estamos usando estos tipos estos nodos aquí mismo para crear listas enlazadas, y así vamos a repasar exactamente por qué las listas enlazadas son importantes cómo nos ayudan, Um, y cómo ellos, ya sabes, se comparan con otras cosas, como la matriz de la que ya hemos hablado. Por lo que en este tipo de conferencias del tipo de unidad iban a estar discutiendo listas enlazadas. 18. Lista de 3-2: Entonces ahora que tenemos una buena idea de cómo funcionan los nodos, investiguemos un poco más y pongámonos detrás de la intuición de las listas enlazadas. Entonces, qué lista enlazada es lo que describí en la última conferencia donde tienes un montón de estas nariz pequeña. Entonces, por ejemplo, podríamos tener un montón de esos. Es decir, estas cosas podrían ser infinitas, así que podríamos tener una nota aquí. Una nota aquí, una nota aquí, una nota aquí, nota aquí, y nuevo lo hace y así sucesivamente. Y la taquigrafía para especie de dibujo estos está dentro va a ser el punto de datos. Y si apunta a algún otro lugar, solo dibujas una flecha. Entonces lo que tenemos aquí es que tenemos un montón de diferentes ubicaciones aleatorias en la memoria que están todas vinculadas entre sí por estos punteros. Entonces estamos en una matriz. Lo teníamos todo en el espacio lineal. Honore, por ejemplo, teníamos en una matriz. Lo teníamos todo en, como un espacio lineal donde era uno tras otro. Entonces eso sería como 34 10 12 y luego 11 aquí mismo, donde teníamos uno Después de la siguiente en, en uno de estos tipos de en una lista enlazada, lo que vas a tener es que van a estar por todos lados de la memoria. Entonces éste podría estar en alguna parte. Al igual que, por ejemplo, estos cuatro podrían ser, ya sabes, aquí abajo mientras este 10 se termina en alguna otra pieza de memoria y este 12 no es alguna otra pieza de memoria y así sucesivamente. Entonces lo que una lista vinculada te vive dio es que te permite conectar datos por todo el lugar juntos. Y entonces lo que esto te da la capacidad de dio es que te da la habilidad. Adelante y deshacernos de esto. Te da la capacidad de realmente agregar continuamente a la lista de longitud sin tener que hacer cosas como la expansión o duplicarla. Y si lo piensas cuando estamos hablando de la matriz, cómo se tuvo que duplicar cada vez para ser eficiente cuando se hizo más grande, muchas veces podríamos encontrarnos con un caso donde solo la mitad de la matriz está llena, lo que significa que tenemos todos sus otra habitación sobre la otra mitad. Eso no está lleno, lo cual es ineficiente. Estamos desperdiciando espacio. Solo está siendo Está a la espera de ser asignado, pero no está asignado. Por lo que la lista enlazada en realidad nos permite tener siempre y constantemente, um la memoria que se necesita para mantener nuestra lista y ni más ni menos. Entonces si necesitamos agregar un número a esto, podemos agregarlo hasta el final. Entonces, por ejemplo, si quisiéramos sumar ah, cuatro a esto, podríamos ir. Y luego simplemente vamos al final y agregamos antes a la lista justo aquí y de lo que estoy hablando aquí mismo son listas enlazadas de Singley. Y lo que eso significa es que tienes un punto de partida, ¿ verdad? Al igual Y así esto se marca como inicio la nota de inicio. Entonces cuando llamas a inicio, vas aquí. Y lo que va a dio es que vas a ir de aquí y vas a básicamente sólo la única manera que puedes atravesar es ir de aquí a aquí, de aquí a aquí, aquí a aquí y sólo siguiendo las flechas una tras la siguiente, todo el camino hasta llegar a la última y luego a ésta la forma en que sabes que estás al final es porque en lugar de éste apuntando a otro nodo, Entonces en esta situación, como por ejemplo, podría apuntar a, podría apuntar a otro nodo aquí. Digamos que este es como un cinco, pero si estamos al final de una lista, va a apuntar a algo llamado No. Y lo que no significa es que no es nada. Está apuntando a nada. No hay memoria asignada. En realidad no tiene una ubicación en la memoria. Está apuntando a nada. Y una vez que entendemos eso, estamos en nada. Entonces cuando insertamos algo, simplemente reemplazamos ese nada con nuestro nuevo nodo. Por lo que hemos creado esta pequeña nota aquí. Es como, por ejemplo, permítanme mostrarles cómo podríamos hacer esto. Hemos creado un nuevo nodo, un nuevo saber aquí abajo llamado 15 y queremos adjuntarlo a esta lista enlazada. Y así en este momento este apunta al No. Y entonces lo que queremos hacer es ganar. Adjuntar esto a ella. Entonces vamos a ir a este inicio. Íbamos a ir al inicio. Voy a bajar, son lista enlazada. Tiene algo. Tiene algo. Tiene algo. Tiene algo. Ah, es que saber. Entonces lo vamos a hacer es vamos a mover esto. No, vamos a Vamos a seleccionar esto. Saquemos esto de aquí para que sea una especie de Vamos a agarrar esto. No, vamos a sacarlo de aquí, y en realidad vamos a agarrar el nuevo nodo aquí mismo, y vamos a dejarlo caer y este nuevo nodo por defecto. Cuando creamos el nodo, es el siguiente spot estaba configurado para saber. Entonces por defecto cuando este aviso creó el siguiente pero dijo saber y verás que esto ayuda porque ahora cuando realmente seleccionamos esto y lo agarramos y lo movemos aquí arriba, notarás que el final nuevamente apunta a saber. Y este ahora se reasignó para apuntar al nuevo nodo. Y el ciclo continúa. Si queremos insertar otro, podemos seguir adelante y 13 aquí, y creamos esto. De forma automática pone a saber que no está en nuestra lista en, ya sabes, sólo todavía. Todavía se está creando. Ahora queremos agregarla a la lista. Entonces cuando vamos al inicio, bajamos, bajamos , bajamos Ahora éste no es un no. Entonces como OK, hay otro. Aquí vamos al 15. Eran como, Oh, no hay aquí. Lo que significa que ahora vamos a hacer 15 en lugar de señalar para saber que entonces vamos a mover su puntero. Entonces vamos a eliminar el no fuera aquí, y vamos a mover su puntero 2.2, nuestro nuevo nodo. Entonces técnicamente, haría esto porque el nodo en realidad no se movería aquí. Sólo le decían que señalara este nuevo pedido que creáramos este nuevo activo aquí mismo esta nueva, esta nueva pieza de datos que creamos y luego como ya creamos para tener ya un nulo del fin una vez que se vaya a escuchar, se moverá al knoll. Y ahora, si queremos contestar algo más, se va a mover derecho a este punto y podemos conseguir, ya sabes, tener un buen tipo de gráfico yendo. Ahora. Entonces, ¿qué pasa si quisiéramos, Por ejemplo, um, eliminar algo de esto en una matriz cuando eliminamos algo de ella. Todo lo que teníamos que hacer era por ejemplo, vamos a tener una matriz aquí mismo. Todo lo que tenemos que hacer es llamar a la ubicación que queremos eliminar. Entonces al 321012 podríamos simplemente llamar a X de dos iguales a ningún o entra en juego algún tipo de algoritmo de eliminación . Y yo era todo lo que hace es que sólo va, Oh, salida a Ya no iguala nada hecho. Nada de qué preocuparse Si queríamos liderar el 1er 1 Fácil hecho. Nada de qué preocuparse con lista de enlaces. No obstante te das cuenta de que hay dependencias de cotización unquote si eliminas si solo eliminamos . Si dijimos que queríamos eliminar 10 era un delete 10 justo aquí. ¿ Qué pasa? Cómo diablos se supone que vamos a llegar al resto de nuestra lista por ya no apunta a nada por solo automáticamente se quedó incumplida a señalar a saber. Por lo que apunta a saber ahora porque 10 está ahí dentro, lo que significa que este no es el fin, y perdemos el resto de nuestra lista aquí mismo. Entonces en realidad tenemos que hacer un poco de un tipo complejo de operación para eliminar déjame simplemente traer esto de vuelta. Entonces borra en cambio lo que podemos dio. Digamos que aquí tenemos un nodo. Una nota aquí mismo y una nota en medio. Tenemos el Singley apuntó los punteros sencillos punteros puntuales. Por lo que aquí es la lista de Liga Singley. Y si quisiéramos eliminar esto les dará todos estos valores para que podamos llamarlos por algo. Si quisiéramos eliminar 10 aquí mismo. Lo que tenemos que hacer es, antes de borrar esto, tenemos que decirle Hey, tres ahora va a apuntar a gustar asi que tenemos que ir a tres. Vamos a borrar el siguiente. Entonces vamos a tres y lo decimos, Hey, Hey, necesitas 2.22 Y luego una vez que se cree esta nueva asignación, ésta en realidad naturalmente simplemente caerá. Ahora es mala práctica. Simplemente deja esto aquí porque esto en realidad sigue siendo un sonido técnicamente. Entonces, por ejemplo, de esto es un inicio, esta gráfica aquí mismo sigue siendo técnicamente sólida. Se va a ir de 3 a 2 y luego por aquí apunta a saber. Y así todo esto aún funciona sigue siendo técnicamente correcto. No obstante, lo que tenemos es que aquí hemos desperdiciado espacio. En realidad no borramos el no. modo que en realidad podemos, antes de hacer eso, en realidad podemos guardar esto en algún tipo de variable como antes. Como podríamos decir, ya sabes, um, han usado Excel. Carrera irá w igual a esta nota de 10. Y luego una vez que volvamos a hacer esta cosa que podemos decir, ya sabes, podemos llamar a borrar sobre ella y en realidad lo estamos quitando de la memoria para que ya no tengamos esta cosa aquí sentada. Pero lo que quería mostrar es que todo lo que tenemos que hacer para eliminarlo es en lugar de eliminar el activo en sí, todo lo que tenemos que hacer es volver a dibujar la flecha. Y en realidad, técnicamente, éste seguiría señalando ahí. Entonces tenemos que hacer es redibujar la nota sobre así y entonces ésta está técnicamente fuera de la lista. No hay forma de volver nunca a 10. No hay forma de ir accidentalmente al 10. Es solo escalofriante ahí, y siempre puede estar ahí, y nuestra lista seguiría siendo sólida. No obstante, la forma eficiente sería entonces eliminar esto para que nuestra lista no esté almacenando datos adicionales que no necesite almacenar. Y así tenemos un caso más para cubrir cómo funciona la lista enlazada, y eso va a ser sobre cómo exactamente uno podría cómo exactamente uno podría insertarse en medio de un rayo. Entonces, por ejemplo, lo que hacemos aquí es, digamos, son el medio de una lista enlazada. Entonces si quisieras insertar en una matriz, di su tasa así en un rayo aquí, ¿qué? Y tenemos un dos aquí tenemos un siete aquí. Tenemos un cuatro aquí, y ya sabes, tenemos 0123 Y si queríamos insertar justo en esta parte de aquí, todo lo que tenemos que hacer es ex de dos igual a siete y ya sabes, va a siete Realmente fácil de hacer. Si desea insertar en cualquier otro lugar. Eso de verdad tienes que hacer es simplemente sobrescribir algo. Entonces si solo queremos que esto sea igual a cero, sólo podemos seguir adelante. Simplemente sobrescribirá esto y lo hará igual a cero. No riel, Otras cosas adicionales necesarias. No obstante, un rayo o listas enlazadas no son tan fáciles con una lista vinculada. Lo que tenemos que dio es que realmente tenemos que hacerlo. En realidad tenemos que especie de reasignar o re puntos y cosas. Entonces al igual que en la élite, teníamos una caja aquí de tres. Se traslada a 10. Y entonces digamos que éste pasa a 25 ahora tenemos una caja aquí tenemos una caja que creamos un nuevo nodo que creamos que tal vez 18 y apunta a saber. Entonces, ¿cómo hacemos que se vaya aquí mismo? ¿ Cómo lo ponemos ahí mismo? ¿ Cómo hacemos que vaya ahí mismo? Bueno, no podemos simplemente insertar. No podemos simplemente llamar al segundo spot. Diga, inserte, no hay los Punteros se van a poner todo en mal estado. Entonces lo que tenemos que hacer es llevarnos este aquí mismo. Tenemos que borrarlo. Tenemos que decirlo ahora apunta ahora apunta a la baja a 18 y después tenemos que tomar este . Tenemos que crear un nuevo puntero que apunte hasta 10 y hay un par de pequeños retos con esto. Porque si notarás algo si volvemos a donde empezó Si eliminamos si primero eliminamos esto, entonces de repente hemos perdido el resto de nuestra lista. No hay manera de llegar al resto de nuestra lista por aquí. Ya no podemos tocar. Entonces lo que tenemos que hacer normalmente es que tenemos que guardar este siguiente, éste de aquí, en una variable. Entonces, um, lo que no pudimos hacer, hay un par en realidad, formas en que podemos hacer esto. El más eficiente en realidad probablemente sería simplemente establecer primero el siguiente de éste. Entonces una vez que llegamos a una vez que tenemos este spot en la memoria, una vez que hemos atravesado son lista enlazada. Y hemos llegado a esta nota por aquí. Debilitar No dijo, Oye, queremos que 18 sean iguales a esto. No, queríamos señalar esta nota. Queríamos señalar esta nota. Entonces podemos dio es que podemos decir esto ahora apunta a esta nota también. Y entonces ahora lo que podemos hacer es que podamos volver al principio aquí. Podemos borrar esto, y ahora podemos apuntar esto hacia abajo. Ahora podemos apuntar esto a R 18 y luego ahora tenemos una buena inserción y no perdimos los datos en el back end. Por lo que las listas enlazadas ahí un poco complicado ahí un poco difícil de entender. Pero sí tienen algunos beneficios, y uno de los mayores beneficios es el hecho de que podemos seguir sumando al final. Y sólo va a crear datos. Eso es como, um que crean datos. Eso es, ya sabes, grande que necesitemos que sea, no tenemos que seguir duplicando cosas y nos permite una especie de anuncio a capricho. Podríamos simplemente agregarlo al final. No tenemos que preocuparnos por la clasificación ni la organización de la misma, y no sobrescribamos las cosas si vamos a insertar nosotros todo lo que es propio pedazo de datos que podemos agarrar y movernos en lugar de tener una matriz donde todo es una especie de encerrado en una caja que especie de limita algunas de las cosas que podríamos hacer con ella, sobre todo más adelante. Y lo que también es algo interesante de este enfoque es que una sola lista a enlazada en sí misma está, ya sabes, solo ligada de manera individual. Pero podríamos, por ejemplo, tener Ramos de nariz señalando a diferentes áreas. Y esto permite tantas cosas. Y aquí es en realidad donde nos metemos en los árboles más adelante, agregando manojo las notas. Pero esto es una especie de los fundamentos de la misma pueden estar vinculados lista por sí mismos. Tan solo de manera individual. La lista enlazada no es lo más útil, pero va a estar construyendo en cosas realmente útiles más adelante. Entonces eso son las listas de longitud Singley. La siguiente parte. Vamos a pasar a vincularlos doblemente y luego una especie de entender los tiempos de ejecución detrás de todo esto y cómo se compara con algo así como array. 19. de 3-3 tiempos de ejecución de la lista: Ahora tenemos una buena comprensión intuitiva de cómo funcionan las listas enlazadas. Vayamos por ahí. Tiempos de ejecución Probablemente dijo en informática, los tiempos de ejecución son importantes porque nos permiten analizar estas estructuras de datos y comprender sus fortalezas y debilidades. Entonces tomemos un rápido refresco sobre los tiempos de carrera de nuestro rayo aquí mismo. Entonces lo que tenemos aquí es que tenemos los tiempos de ejecución que salimos para la matriz y así que solo pondré eso aquí abajo. Esto es para la matriz. Y luego también, quiero designar Esto es para borrado aleatorio. Si estás eliminando, por ejemplo, en una matriz, um, al principio, como, por ejemplo, es una matriz circular desconocida y eliminaste el principio justo aquí. Por lo que borras este y quieres que todo se mueva hacia atrás que también se ove en igual que el en especie del frente. Por lo que este es éste podría ser dos diferentes, dependiendo de cómo quieras mirarlo. Pero borrar aleatorio siempre va a ser sobre el mientras borrar. Básicamente, frente de ladrones se le adeudará hasta el final. Entonces solo quería poner esa pequeña salvedad ahí sola, este tipo de complejidades del tiempo se pueden conseguir un poco de exactamente qué estás mirando, como específicamente Así podrían ponerse un poco confusas en ese aspecto. Pero si realmente solo piensas en ellos intuitivamente puedes entender. Entonces, por ejemplo, en la matriz, si estamos eliminando fuera de la tarifa frontal aquí, todo tiene que retroceder. Entonces tenemos que movernos en número de, um, en número de lugares en el peor. Y vamos sólo tipo de la intuición detrás de eso. Pero podemos ver algunas de estas cosas aquí. Nos dieron la inserción al azar. Nos metimos en búsqueda al frente. Eliminar búsqueda, búsqueda sin clasificar ordenada. Entonces, pasemos por estas operaciones en una lista enlazada. Por lo tanto, vamos a crear un poco de una lista enlazada de ejemplo aquí. Entonces lo que necesitamos crear es que necesitamos crear nuestros nodos. Entonces tenemos el inicio de la lista, que podemos simplemente crear como me gusta, empezar justo aquí para que pudiéramos crear, como Start, y luego apunta al inicio de nuestro primer nodo. Digamos que nuestra primera nota tiene un tres, y luego esta es una lista de enlaces únicos. Todavía no hemos hablado de doble, así que sólo vamos a ir con lista de longitud única. Yo doble sólo mejora pequeños trozos de cosas, cálculos leves, y luego vamos a ir a, como, digamos, 19 aquí o algo así, y entonces este es el final. Entonces esa es una, entonces apunta a saber por aquí. De acuerdo, así que tenemos son listas enlazadas como así, y vamos a seguir adelante y crear nuestro 1er 1 Así que aquí arriba teníamos insertar al azar. Entonces si quieres insertar algo y esto es aleatoriamente así en cualquier lugar dentro de la estructura de datos , en realidad hagamos lo mismo. La notación también es la última. Por lo que queremos insertar aleatoriamente en una matriz que nos llevó tiempo instantáneo porque estaríamos anulando las cosas si estuvieras tratando de calcular la anulación. Entonces tal vez podrías tener algunas adversidades en esto, pero si solo íbamos a sobrescribir algo perfectamente bien, podrías decir ex de cinco es igual a algún número lo que sea, y lo anulará en una lista enlazada. No obstante se convierte en un problema es que sólo se puede entrar desde aquí. No se puede simplemente saltar a cualquiera de estas posiciones. Entonces si quisiera llegar a 19 por aquí, tendría que ir desde el principio más de 123 y luego llegar a él, y tendría que hacer esto por cualquier cantidad dentro de esto. Entonces lo que eso significa es que nuestro inserto aleatorio en realidad se reduce a en O de en notación. Y eso se debe a que nuestro peor escenario de casos está insertando aleatoriamente en la parte de atrás. Lo que significa que va a insertar 1234 están en. Esta situación es de cuatro. Por lo que van a tomar cuatro para volver a aquí, y eso va con cualquier lista de cualquier longitud. Ahí hay 1000 de estos y quieres insertar cerca de la parte trasera. Podría tomar 950 a 1000. Entonces eso significa que nuestro peor escenario para insertar aleatorio en realidad se convierte en O de N. Y eso es sólo porque no hay acceso instantáneo. No hay manera de que sepamos saltar entre estos más rápido que ir desde el inicio y luego moviéndonos hacia abajo como así y así nuestro siguiente se va a insertar en el frente, así que inserte frente y delante, así que con inserto frontal y voluntad hacer insertar de nuevo también con un básico, um, una lista básica vinculada. Va a ser o hasta el final también. O en realidad, la respuesta al frente va a ser un tiempo constante. Bueno, al empezar, la espalda va a ser O hasta el final. Y esto es porque vamos con insertar primero el frente. Si queríamos insertar un nuevo nodo, digamos que aquí tenemos una nota. Una nueva nota aquí de cuatro. Si quisiéramos insertar esto en el frente, ¿cómo exactamente haríamos eso? Bueno, en realidad es bastante fácil. Sea cual sea nuestro frente, sea cual sea nuestro puntero, todo lo que tenemos que dio es que sólo tenemos que decir OK, en lugar de apuntar a este punto a este uno, y luego tuvimos que poner cuatro a nuestro viejo. Por lo que tuve que poner cuatro a nuestro viejo frente. Y entonces lo que eso hace es que en realidad solo lo agregará en 123 pasos cada vez, no importa lo que estés insertando ahí, por lo que siempre va a ser un tiempo constante y la forma en que realmente quieres hacer esto. En realidad hay una forma que debes insertar aquí porque este tipo de entra con perder memoria. Si elimino esto y luego hago este punto a esto así pierdo la habilidad pierdo esta primera nota aquí, ya no tengo habilitada para agarrarlo ya porque borramos el único punto que tenemos al mismo. Entonces si quieres insertar en el frente, lo que tenemos que hacer es tomar nuestro nodo. Tenemos el primero lo dijo a los tres. Y así esto sigue apuntando al frente. Entonces vamos a decir, Hey, cuatro, cuatro, vamos a decir, Hey, cuatro, cuatro, ahora estás apuntando tu siguiente en lugar de No, ahora está apuntando a tres. Ahora está apuntando a nuestro inicio. Vamos a decir que apunta a empezar, y eso lo va a destinar al principio. Entonces una vez que se apunte por aquí, vamos a eliminar fuera de aquí, y vamos a hacer el punto de inicio hasta aquí, y entonces eso va a crear nuestras inserciones o inserto siempre es tiempo constante. Siempre van a ser esas tres operaciones crean asignadas al inicio un signo iniciar dos nuevo no a nueva nota. Entonces siempre va a ser tiempo constante. Entonces ese es tiempo constante. Y luego tenemos inserto en la parte posterior. Entonces insertar a la parte de atrás, sin embargo, nos va a llevar un poco de trabajo porque, como dije, no hay manera de volver aquí a menos que después, voy a ir por encima como puedes crear poco punteros para ayudarte. Pero ahora mismo, con sólo una lista básica vinculada a Singley, no hay manera de que podamos llegar hasta aquí sin pasar por toda la lista. Y así esto siempre va a estar dentro. Siempre va a estar en, lo que significa, por defecto, es el peor de los casos está en también. Entonces es el peor de los casos también estará porque, como dije, no hay forma de que podamos saltar aquí. No podemos llegar desde el principio y luego simplemente pasar al final. No hay nada que nos apunte hasta el final. No sabemos qué hay aquí. No sabemos cuántos nodos aire entre esto. Todo lo que sabemos es por dónde empezar y cómo llegar al siguiente. Entonces vamos a tener que hacer es correr start. Teníamos que crearnos un nuevo nodo. Entonces si quisieron agregar uno al final, digamos que queremos sumar estos cuatro al final. El único modo en que podríamos hacer eso es que tenemos que ir. Está bien. Bueno, ¿qué hay al final? Bajar 4 a 3. Pagar un 2 a 10 este es el No, estamos al final. Genial. Ahora, una vez que estemos al final, tenemos la nota final. Podemos entonces contárselo. Oye, te vas a mover. Ya no sabes que te van a poner a cuatro. Al igual Y entonces, supuesto, por defecto. Cuando creamos esto, esto fue señalado para saber que nuestra lista funciona de nuevo. Entonces una vez que llegues aquí, la operación es sólo como uno o dos tipos de números de creación. Pero llegar hasta aquí se le debe hasta el final. Y es por eso que nuestra carrera puede tiempo será Odeon también. Y así el siguiente que queremos agarrar va a ser borrar al azar. Por lo que queremos eliminar al azar. Y así con una delicia en ella especie de depende de cómo estés borrando y dónde quieras eliminar . Entonces el problema es que si estamos borrando del frente, es realmente fácil. Si eliminamos del frente, todo lo que tenemos que hacer es decir, inicio igual al frente siguiente. Entonces déjame escribir eso porque este tipo de se mete en algunos. Al igual que si comienzas a escribir estas cosas, será como, um, inicio es igual a esta nota aquí mismo. Start dot siguiente. Y esta flecha se llamaría siguiente. Entonces lo que estamos diciendo es que el inicio ahora es igual para empezar siguiente y luego éste acaba de sacarse del ciclo y la flecha consigue re ID de asociado fuera de aquí, y luego va directo de vuelta a aquí. Entonces si eliminamos el frente, es con una sola vez. Entonces si eliminamos el frente, saldrá con una sola vez. Pero si eliminamos aleatoriamente, que está en cualquier parte de aquí, si queremos decir que queremos eliminar el cuarto elemento o el Noveno Elemento para hacer eso, va a tomar odienne porque vamos a tener que atravesar todo el asunto. Y luego si te das cuenta no podemos ir hacia atrás. Entonces si quisieras liderar éste pega. Vas a tener que agarrar el anterior, y luego vamos a tener que hacerlo. Entonces, por ejemplo, si quisiéramos eliminar tres aquí mismo, tendremos que hacer es vamos a tener que ir a dos y entonces tendremos que decirle que es el siguiente va a ser igual a su siguiente va a ser igual a punto siguiente A continuación, que tipo de se complica un poco. Entonces sería como si estuviéramos en el número dos aquí. Estamos en este nodo, ¿verdad? Aquí están todas las acciones, ¿verdad? ¿ Qué? Los números son tan correctos. Nodo cuatro. ¿ Y qué decir? Nodo cuatro punto Siguiente es igual para punto siguiente punto Siguiente. Y entonces lo que estás haciendo es agarrar el siguiente final en el siguiente. Estás diciendo que ahora es igual a esto. Entonces estás pasando por alto este de aquí mismo al pasar por alto esto, lo quitas. Pero para llegar a este punto, para llegar a este punto, hay que saber que va a hacerse cargo del final, lo que significa que el líder aleatoriamente va a estar ot adentro también. Entonces esto será o hasta el final y nosotros sólo pero hemos descubierto que borrar del frente va a ser constante es constante y ya ves un poco de mejora ahí. Entonces hemos tenido una especie de muchas cosas que podrían tardar más. Pero entre la matriz, Si ves que eliminar de frente en una matriz llevará O hasta el final mientras que eliminar del frente en una lista vinculada tomará lo que hace Eso debería ser constante. Eso debe ser constante. Si bien el engaño de esto tomará o será un tiempo constante, que significa que no se escalará, cual es genial. Y pero también se ven algunas otras diferencias aquí es que la inserción aleatoriamente fue instantánea. Si bien la inserción aquí va a ser o hasta el final, Un frente insurgente aquí dentro era odienne. Pero el frente de inserción en una lista enlazada ha terminado con uno. Entonces estamos viendo algunas compensaciones aquí. Algunas diferencias entre estos dos. Y así ahora sigamos adelante y eliminemos ese último movimiento. Ya no estamos borrando este. Va a volver a una bonita lista de enlaces justo aquí, y lo que necesitamos ahora es buscar ordenados y desordenados. Entonces, ¿qué? Tenemos esta búsqueda para ordenados y en búsqueda de desordenados. Y así ambos van a terminar siendo O hasta el final también. Y eso lo voy a explicar en tan solo un segundo. Y la razón es que no importa si esto está ordenado o no ordenado. Todavía tienes que atravesar todo el asunto para encontrar lo que buscas. Si sabíamos que esto era 12345678 entonces no importa porque todavía no hay manera de que podamos simplemente saltar a dos o saltar al número ocho o en cualquier parte de aquí. No podemos saltar. Tenemos que iniciar y luego mover desde el inicio hacia abajo la lista enlazada. que significa que pase lo que pase, si queremos entrar aquí, si, como, por ejemplo, encontrarían los dos que podría tomar para ir hasta el final, podría ser al final de la lista para encontrar esta cosa. Ya sea ordenada o no ordenada. Va a ser una reversión de lista enlazada completa, y por lo tanto va a ser tiempo lineal. Significado va a tener que pasar por cada nodo en el peor de los casos. Por lo que la búsqueda es un poco más lenta en esta situación. Si bien si vamos a una matriz, veremos que la búsqueda sin clasificar tiene lo mismo. No obstante, si ordenamos la matriz podemos levantarnos para iniciar sesión, en realidad podemos mejorarla bastante por lo que hablamos antes, donde lo cortamos a la mitad. Seguimos cortando y 1/2 hasta que terminamos encontrando el número que buscamos. Y así ahí lo tenemos. Esos son los tiempos de ejecución de una lista enlazada. Como decía antes, aquí hay un par de similitudes. Un par de pequeñas, um, adversidades entre los dos y a veces como, por ejemplo, inserción aleatoriamente e inserción en el frente aquí, verás que son diferentes. En realidad, thes el insurgente al azar es más rápido que en la matriz. Si bien la inserción al frente es más rápida en la lista enlazada, la inserción hacia atrás va a ser realmente lenta mientras que en la búsqueda en la parte posterior en una matriz va a ser realmente rápida. Delish in va a ser más lento en la lista enlazada. Pero más rápido en el ah, más rápido en la búsqueda frontal va a ser básicamente la misma si está desordenada. No obstante, si se ordenaba, la matriz sale adelante. Por lo que se puede ver que a pesar de que estos dos son muy diferentes, son completamente diferentes. Se podría pensar que tal vez, como, tal vez prefieras una sobre la otra una era más intuitiva sobre la otra, que todas estas tienen una especie de salvedad muy específica. Entonces, por ejemplo, si ponemos aquí un aumento y por aquí tenemos nuestras listas enlazadas, podría haber ciertas situaciones en las que queremos usar una sobre la otra. Si tuviéramos un programa que insertara en el frente un lote insertado hacia el frente una vez no quisiéramos usar una matriz para eso porque si usáramos una matriz para eso, tendríamos que, uh, desplazar uh, todo y seguir creando nuevo Un raise para que realmente funcione bien, en una lista enlazada, todo lo que tenemos que hacer es simplemente crear un nuevo nodo y especie del frente. Entonces si quisiéramos insertar al frente, éste tendría una ventaja. Inserta frontales programas pesados parte mi escritura aquí. Entonces inserte programas pesados frontales, todo de una matriz, si queremos ordenarlo y luego buscar Sería lo mejor. Entonces, ¿qué podemos tener una matriz ordenada? Y queremos hacerlo. Entonces es como las búsquedas de array ordenadas o surtidos quisieran hacer. Es lamentable en una carrera ordenada búsquedas de datos, y así se puede ver que cada una de estas es buena en un campo determinado y mala en diferentes campos. Y así es como entender esto ayuda a los demás científicos de la computación, porque se empieza a entender cuál se debe usar basándose en las ventajas de uno sobre el otro. 20. 3-4 listas de doble vinculado: no lo es. Tenemos una buena comprensión de cómo funcionan las listas singly enlazadas y alguna de su ventaja algunas de sus desventajas con un raise y otras estructuras de datos. Ahora podemos empezar a una especie de mejora en la idea básica de una lista enlazada, y entramos en esta idea de una lista doblemente vinculada. Entonces, ¿qué es una lista doblemente ligada? Bueno, volvamos a nuestra idea de un nodo. Recuerda dije que teníamos una nota aquí y podemos tener cualquier nota y puede tener, como, como, una pieza de datos en la parte superior. Y podría tener un montón de diferentes tipos de punteros aquí abajo. Y uno de los puntos principales es que puedes sumar es que vas a sumar a continuación. Y esto crea un montón de lista enlazada Singley Singley justo aquí. Entonces no tenemos sólo un puñado de próxima aquí. Permítanme que este sea el mismo formato aquí y por ejemplo, esto es como cuatro. Tenemos un siguiente aquí, pero la cosa es, con apenas lo siguiente, sólo podemos ir en una dirección en la lista para hacerlo doblemente vinculado. Lo que podemos hacer es que realmente podemos sumar en anterior es también. Y esto significa que también va a apuntar hacia atrás, doblemente ligado. Esto significa que por cada época va a haber dos flechas, una entrando y otra saliendo. Ahora bien, ¿cómo nos ayuda esto? ¿ Por qué esto nos ayuda? ¿ Cómo nos permite ir de, por ejemplo, por ejemplo, a empezar hacia atrás a lo largo de toda la lista? ¿ En qué nos ayuda eso? Bueno, si miramos los tiempos de corrida, podemos notar que en realidad no nos va a ayudar tanto en ninguno de los tiempos de corrida. Lo que va a hacer va a hacer un poco más detrás de bambalinas trabajo porque no importa si vamos hacia adelante o hacia atrás. Todavía vamos a atravesar la lista, al menos quiere llegar a la parte. Pero pensemos en un escenario diferente. Pensemos, por ejemplo, nuestro objetivo aquí es, digamos, encontrar siete y eliminarlo y eliminarlo de lista son vinculados. Por lo que tenemos una lista enlazada aquí. Digamos que tenemos uno aquí y tenemos un dos que se mueve por aquí. Tenemos un tres y luego llegamos como 75 25 luego bajamos a siete, y haremos uno más. Por lo que esto sigue vinculando a la baja al 17 y esto apunta a un no. Entonces piensa en esto. Si necesitamos primero encontrar siete y luego eliminarlo, Lo que vamos a hacer es primero buscarlo. Entonces vamos a buscar la cosa. Entonces nos va a gustar, vamos a escribir un pequeño registro de lo que hacemos. Entonces vamos a buscar, y así vamos a tener que irnos. 1234 Encontramos que está por aquí a las siete. Está bien, genial. ¿ Cómo lo eliminamos? Porque la única forma de eliminarlo es que tenemos que tocar la anterior, y no sabemos dónde está la anterior. Una vez que lleguemos aquí, no tiene forma de apuntar hacia atrás. Entonces una vez que lleguemos aquí, si quieres eliminar esto, en realidad tenemos que volver a hacer la búsqueda. Tenemos que volver a entrar de este inicio y luego bajar e ir al anterior y decirle que apunte al siguiente punto. Y así eso realmente causará algo como esto. Por lo que tenemos la búsqueda para encontrar Es oh de en. Y entonces tenemos la eliminación también va a terminar ahora. De lo que esto sale a ser en realidad puede hacer esto. En realidad va a terminar siendo, Si quieres ser realmente técnico sobre esto va a terminar siendo O a la N menos uno porque vas a encontrar al anterior detrás de él. Por lo que realmente no importa a lo que este tipo de Hulk se reduce es que sólo vamos a conseguir este tipo de relación. Vamos a entrar, oh, oh, de en plus en o de en Y así para nuestras comparaciones de otras cosas, recuerda, eso va a llegar hasta el final a simplemente ser básicamente una O de dos en. Y recuerden lo que dijimos al principio es que en realidad acabaríamos de tachar esto, y se acaba de terminar. No obstante, en el mundo real, dos veces en podría realmente ser una diferencia realmente grande, algo que realmente queremos hacer un seguimiento y entender y mejorar. Y si podemos recortar el tiempo que va a tomar a la mitad, queremos hacerlo. Y así por ejemplo, verás que busca. Y entonces ahora tenemos que hacer la eliminación. Y así sólo se pone un poco tedioso de esta manera. Entonces lo que podemos hacer es crear esto y convertirlo en una lista doblemente larga. Entonces ahora tenemos una lista doblemente vinculada aquí donde todos apuntan el uno al otro y déjame en realidad, hagamos el vamos a hacer estas flechas. Hagámosles un color diferente aquí para que quede claro este poco. Y entonces lo que tenemos es una flecha apuntando hacia atrás. Están nombrando de nuevo, ganando de nuevo, apuntando hacia adentro. Entonces hay una flecha que va a ir apuntando hacia atrás. Y así ahora tenemos nuestras listas doblemente vinculadas, y en esta situación, ésta apunta a saber también. Entonces el frente este va a apuntar, um, para saber por aquí y entonces es anterior va a apuntar allá. Y así ahora tenemos todo esto bien arreglado. Y así ahora intentemos rehacer esta operación que es encontrar siete y eliminarla. Bueno, nos vamos a ir. Vamos a arrancar el frente. Vamos a bajar. Vamos a ir por encima, por encima, por Oh, encontramos siete. Entonces ahora para eliminarlo, lo que realmente podemos dio es que podemos ir y usar este tipo de pseudo código aquí mismo, siete puntos anteriores. Entonces ahora tenemos. Estamos ahora estamos en este nodo justo aquí. Siete puntos anterior punto Siguiente equivale a siete puntos siguiente, y así esto podría ser un poco complejos, como, como, especie de entrar en el aspecto de codificación real del mismo. Pero todo lo que estamos diciendo aquí es que vamos a siete estábamos diciendo su anterior siguiente. Entonces estamos seleccionando éste y entonces ahora estamos diciendo ahora, ya que estamos aquí estaban diciendo que es el siguiente, la pequeña parte de aquí estaba diciendo una pequeña parte de 25 que es el siguiente ahora va a igualar lo que sea siete, es el siguiente. Entonces va a igualar lo que sea. Siete. A continuación es lo que se convierte en 17. Yo lo sé. Una vez que hacemos eso, ahora tenemos una conexión. Um , crea una conexión donde cortocircuitos que deshizo. ¿ Hace esta conexión y entonces ahora simplemente se moverá derecho hacia abajo y se conectará por aquí y en esta línea aquí mismo desaparecerá. Y es todo lo que tenemos que hacer ahora es un paso más. Este 17 sigue apuntando al lugar equivocado para que podamos hacer algo como que ahora estamos de vuelta en nuestro 25 acabamos de restablecerlo. Entonces diremos que, como, 25 puntos siguiente punto anterior equivale a 25. Y así todo esto es pseudo código. Esto no es que no puedas poner esto en ninguna donde estas dos cosas de aquí a la izquierda solo significan como sus comentarios como si fueran sólo una especie de pseudo código de qué sería dio? Pero ahora lo que podríamos hacer es decir 20 cincos y siguiente punto anterior igual. Entonces estamos seleccionando la parte anterior de la parte de datos aquí de 17 aquí mismo estaban diciendo que su anterior ahora es igual a 25. Y así entonces se remonta y se asigna como este siete ahora se retira y tenemos nuestro producto final aquí. Y lo que hizo esto en general, dio vamos a todo lo que hizo fue permitir que nuestra búsqueda y borrar aquí se convirtiera en uno hacia el final y que solo nos ahorra un poco de tiempo. El general, en lugar de ser demasiado hasta el final, es sólo ir al final. Y así, como dije, esto no mejora nada de este tipo de velocidades de arriba abajo justo aquí. Pero lo que sí hace es que realmente nos ahorra un poco de tiempo, y nos permite crear un poco más de intuición detrás de las cosas porque ahora no lo somos. No estamos atrapados en este tipo de ir en una dirección. Y si tenemos que ir hacia atrás empezando de nuevo y luego volver a ir en una dirección ahora realmente podemos movernos intuitivamente hacia adelante y hacia atrás a través de esta lista. Todavía va a tomar en promedio Oh, entonces llegar a cualquier lugar. Pero podemos mejorar cosas de minuto como mejorar de dos en adelante para ir más rápido, y hace que nuestra codificación sea un poco más fácil porque no nos gusta lo que dije, no tenemos que seguir con la contabilidad para empezar de nuevo y luego volver a revisarla. Por lo que están doblemente vinculados. Enumera una bonita adición para agregar a tu lista enlazada, y hacen generalmente tu vida mucho más fácil 21. Puntero de la cola de 3-5: Entonces ahora vamos a cubrir una cosita más sobre la lista enlazada y algo que en realidad va a mejorar uno de nuestros tiempos de ejecución. Y esa es la idea de un puntero de cuento. Entonces lo que eso significa es un cuento Pointer nos va a permitir hacer exactamente eso. Nos va a permitir apuntar al final mismo de nuestro tipo de son lista enlazada. Entonces, por ejemplo, sigamos adelante y solo dibujemos el amor realmente corto. Aquí, Vamos de tres puntos a dos puntos a 15 y diremos que esto va a saber. Y por aquí esta va a saber porque en realidad estamos haciendo de esto una lista doblemente ligada aquí. Y, sí, luciendo bien. De acuerdo, entonces lo que hemos estado usando es que hay este tipo de puntero de inicio. Siempre hay uno que nos dice dónde está el comienzo de nuestra lista enlazada, y así que eso ha sido sólo una especie de defecto. Eso ha sido una especie de lo que podemos usar justo al principio, porque si no tuviéramos este punto o bien, sería difícil averiguar cómo trabajar incluso con él porque nunca seríamos capaces averiguar dónde está esto. Entonces tenemos un inicio, puntero. Pero lo que realmente podemos hacer es que podemos seguir adelante y también podemos crearnos un puntero de cuento . Y qué cuento hace Pointer. Entonces, um, vamos a dibujarlo aquí mismo. Pongámoslo. Tal vez como el rojo dirá el puntero de la cola. Entonces diremos el puntero de cola aquí mismo. Lo que hace un cuento Pointer es que te permite llevar siempre un seguimiento de lo que es el último nodo y cómo esto nos ayuda es tener este cuento. Puntero no toma básicamente ningún tipo de energía. Cada vez que creemos uno nuevo, todo lo que vamos a hacer es mover el vamos a mover el puntero de cola hacia el siguiente nuevo nodo y así va a hacer, es en un dedo de operación extra agregando uno al final ahora. Pero lo que nos permite hacer es que nos permita ahora insertar en la parte posterior en oh, dientes, insertar en la parte posterior para que podamos tachar esto si tiene un puntero de cola y nos permitió insertar en la espalda en tiempo constante. Y por qué nos permite hacer eso. Bueno, vamos a correr al tipo de ejemplo de insertar ahora. Entonces ahora tenemos una nueva nota aquí. Tenemos un nuevo nodo de 20 justo aquí, y queremos insertar esto en la parte trasera antes de que lo que tenemos que hacer es bajar el inicio, íbamos inicio, a bajar el inicio y luego pasar por son lista enlazada hasta que llegamos a la parte de atrás. Y eso fue un problema, porque así es hasta el final. No importa lo que siempre vaya a tomar , por muchos que haya en la lista para llegar a la parte posterior, va a ser tiempo lineal. Entonces vamos a hacer ese tiempo constante, aunque en lugar de tener que pasar por toda la lista, sólo vamos a la derecha a donde nos apunta el puntero de cola, que es una operación. Y entonces ahora ponemos esto estos nodos junto a nuestros 20. Dijimos nuestro nodo veinte. Entonces dijimos este quitemos el no, quitamos el norte. Lo movemos para poner a aquí. Creamos esta tarifa fija aquí y en ésta por defecto está apuntando a saber. Y así por esto, lo que nos permite a Dio es todo lo que se necesita es la única operación para llegar hasta aquí. 12345 tal vez operaciones a agregar en la parte. Pero eso va a ser constante. Ya no importa porque ahora, una vez que hemos hecho esto, teníamos en solo un poquito de una adición aquí mismo donde simplemente vamos adelante y volvemos a dibujar pequeño puntero a nuestro nuevo respaldo. Y así ahora, si quieres insertar en la espalda otra vez, va a ser exactamente eso. Va a ser aproximadamente cinco operaciones más o menos para hacerlo, lo que significa que si siempre va a ser 555 no importa lo grandes que sean en es no importa cuánto esten en va aunque sea ese infinito todavía podemos insertar a la parte posterior del infinito y simplemente cinco operaciones. Ya sabes, esto es, por supuesto, teórico aquí mismo. Si pudiéramos insertar en cinco operaciones, eso significa que siempre va a ser tiempo constante. Entonces, ¿qué punto de cuento? ¿ O es sólo un pequeño dato extra que apunta al final de nuestra lista? Nos permite llegar al final de la lista mucho más rápido en una operación y configurar en O a las operaciones N. Y por eso, aumenta nuestro inserto hacia atrás para ir al uno en lugar de, um en lugar de tiempo lineal. Y también podemos pensar en esto como de la misma manera. Yo no escribí esto aquí abajo, pero si quisiéramos borrar de atrás también, Así que agreguemos esto aquí. Eliminar de la parte posterior también. También mejoraría eso porque sin este puntero de cuento, si quisiéramos eliminar desde atrás, tendríamos que ir por el camino de inicio, llegar a la parte posterior, eliminarlo y luego probablemente correrlo otra vez así que podemos reasignar lo que fuera al lado del de atrás. Y así se va a deber hasta el final sin un punteros de cola sin un tell poner es o hasta el final. Pero si tenemos un punto de cola o podemos tacharlo y en realidad se volverá constante, así que no te hace saber realmente, realmente constante. No hace cambios realmente, realmente grandes, pero lo que hace es que mejora solo dos de estos nos permite insertar. Nos permite realizar mejores operaciones en la parte posterior. Y debido a esto, porque ahora que podemos insertar y eliminar desde atrás y con uno son lo hace más rápido , están exactamente al mismo ritmo que una matriz en ese sentido. Entonces ese es el punto de cola. Es realmente, realmente simple. Sólo algo que apunta al final realmente ensamblado tipo de implemento una vez que se obtiene si se mete en el código, pero te puede ahorrar mucho tiempo y en general, asegúrate de que el programa funcione mucho mejor. 22. Revisión de lista de 3-6: Entonces vamos a dar un paso atrás y atar todo lo que acabamos de aprender juntos para que podamos conseguir, ya sabes, un buen refresco de todo y cómo todo tipo de interactuar entre sí. Entonces lo que tenemos es que tenemos cosas llamadas lista enlazada, y una lista enlazada es una serie de nodos. Por lo que es una serie de básicamente piezas que apuntan a cierta pieza de datos y luego también apuntan a otros nodos. Y así nuestra pizza que podrían ser tres y luego no tenemos el siguiente y tenemos una tarifa previa aquí y qué podemos hacerlo. Esos es que luego podemos tomar esos nodos. Podemos crear una lista a partir de esos nodos, y esta lista nos permite enlazar todo un montón de datos entre sí. Y la buena parte de esto es que podemos insertar al azar. No tenemos que, ya sabes, asignar un cierto tamaño para esto. Se expandirá indefinidamente. No tenemos que gustarnos, doblarlo. No hay nada de ese tipo de cosas pasando, lo que significa que podemos seguir vinculando las cosas a ella a medida que las encontramos, y simplemente seguirá haciéndose cada vez más grande dinámicamente. Algo desventajas a esto está justo fuera del bate es que siempre hay que entrar en esta zona de inicio y para pasar por la lista, hay que ir de una a otra la siguiente. No hay rutas directas a nada más allá del inicio en esta situación, lo que significa que puede tomar O de en tiempo hacer muchas operaciones. Podemos mejorar esto agregándolo como un menos doblemente vinculado. Esto nos permite no tener que ir. Um, por ejemplo, si quisiéramos ir justo aquí, le voy a hacer algo al anterior. No tendríamos que volver después al inicio y luego encontrar el anterior. Podríamos simplemente ir y venir en esta lista como nos parezca conveniente. Y entonces lo que podemos hacer para mejorarlo más es que podemos agregar un poco, un poco, um, un puntero de cuento al final sobre lo que el puntero de la cola nos permite hacer es ir directamente hasta el final. Y esto nos permitirá aplicar operaciones hasta el final realmente, realmente, muy rápidamente. Y esto nos permitirá una especie de mejorar un par de nuestros tiempos de carrera. Ahora, cuando una especie de mirar nuestros tiempos de corrida aquí, podemos ver que tiene muchos tiempos de ejecución que son diferentes a raise, y algunos tiempos de ejecución que son iguales. Y luego algunos tiempos de corrida que son mejores. Por ejemplo, insertar en la parte delantera estará fuera del bate justo recto hasta el tiempo constante. No tienes que hacerlo circular haciendo ese tipo de lógica avanzada. Todo lo que tienes que hacer es crear todo lo que tienes que hacer es simplemente insertar al frente y mover el punto de inicio hacia ese nuevo y el mismo. Si creamos este punto de cuento o en la parte posterior, podemos obtener eliminaciones de la parte posterior e inserciones en la espalda en tiempo constante también. Algunas las compensaciones es que no importa si está ordenada. Siempre vamos a tener que ir a buscar esta cosa, lo que significa que tenemos a cuanto más grande sea el conjunto de datos, más tiempo nos va a llevar ordenarlo, lo cual puedes saber si somos si eso es una prioridad para nuestro programa, es encontrar datos, entonces ya sabes, como que piensas que tal vez la lista de longitud es de la mejor manera. A lo mejor una matriz o algunas de las otras cosas en el futuro que pasarán por encima será mejor que eso. Pero eso, en pocas palabras, es o todo esto es listas enlazadas. Contamos con lista de enlaces únicos. Tenemos listas doblemente enlazadas. Tenemos punteros de cola, y todos se unen para formar este tipo de estructura de datos enlazada que nos permite agregar y eliminar dinámicamente nuestra estructura de datos a capricho. Tiene algunas desventajas. Tiene algunas ventajas, pero es una de las estructuras de datos clave, y así que esa es una especie de final de esta sección de lista de enlaces. Estoy muy emocionado de saltar a la siguiente unidad donde vamos a estar una especie de implementando esto en vamos a estar construyendo a partir de estos y creando un nuevo conjunto de estructuras de datos llamado Stacks and Queues. Entonces voy a ver por ahí 23. 3-7 ejemplos de mundo real: Ahora que tenemos una buena comprensión de lo que son las listas enlazadas, sigamos adelante y veamos algunos ejemplos del mundo real de listas de longitud. Ahora esta sección será un poco más corta que la mayoría de las demás secciones porque en realidad vamos a estar hablando a detalle de dos de los usos principales de las listas enlazadas. Y ese es el árbol y la Q. La siguiente sección en realidad va a estar en, creo, pilas y colas. Entonces vas a estar viendo la cola ahí dentro y luego, vamos a cubrir los árboles. Esos son dos grandes usos de las listas enlazadas, pero otro uso de una lista vinculada es con el almacenamiento de datos. Cualquiera que sea tu disco duro llene datos, busca memoria libre, y como que vincula la memoria libre entre sí. Ahora, en un mundo perfecto, tendrías, ya sabes, algún recuerdo asignado en un lugar para cualquier programa que estés almacenando. Pero digamos que al principio mismo del disco duro, solo tienes como un gigabyte. Vamos cada parte de estos es un gigabyte, y todos estos se llenan hasta aquí. Entonces digamos que estos tres de aquí están llenos. Bueno, si solo tienes un gigabyte, el frente y tal vez un gigabyte gratis aquí y un gigabyte gratis aquí y aquí y aquí. Y tienes un 13 gigabyte, ya sabes, descarga que viene. No quieres el programa que Hey, podemos instalar esto. No tenemos mucho en un Siri. Entonces lo que hace es que en realidad vincula estas áreas entre sí. Instalará un gigabyte de los archivos aquí. Entonces apuntará un puntero a esta zona. Señalará fue por aquí, Ponga uno por aquí y por aquí, y lo hace no es de una manera un poco más eficiente de lo que podría ver aquí. Pero esto es lo básico de cómo lo hace. Se va a vincular el programa entre sí a través de múltiples de este tipo de estos bucles, y en realidad sólo te va a mostrar, o va a mostrar que casi en tiempo real va a escanear a través de todo y traerlo de vuelta realmente rápidamente. Pero lo que en realidad está haciendo es crear una lista vinculada para esos datos. Y el tipo de lo ordenado es, es que cuando desfragas tu computadora, realmente quitas algo de esto. Estás tratando de ponerlo justo al lado del otro y estás permitiendo que el disco duro real mismo dedo del pie tenga que buscar, que es donde se mueve para ir. Busca esto. Otras partes de estos podrían estar en lados separados del disco duro. Se los pone uno al lado del otro, por lo que hay menos tiempo con eso además reduce los tiempos de carga. Otro ejemplo del mundo real es en realidad con un navegador Web. Si lo piensas, esta es una lista enlazada. El dorso y el Ford Arrow. Ahora mismo estamos al final de la lista, por lo que no es una lista circular. No puedo hacer click, seguir adelante y volver al principio mismo. Lo que puedo hacer es que puedo recorrer esta lista para poder ir hacia atrás y voy a buscar en Google o la mala ortografía de la búsqueda de Google. Probablemente las cinco veces. Puedo volver a tres atrás para atrás dedo del pie uno, por lo que mi historia es casi ligada listas de tipos. Yo puedo ir hacia atrás y puedo atravesarlo, pero sólo uno a la vez. A menos que, por supuesto, vaya a la pestaña de historia, que sería más como una matriz en ese sentido, pero eso es una especie de la lista vinculada más cercana o la más riel Ejemplo que se me ocurrió que sería más como una matriz en ese sentido, . Que lo más probable es que todo el mundo haya utilizado hasta ahora es la historia en nuestros navegadores Web. Pero eso es sólo un par de ejemplos de listas enlazadas. En realidad saltemos a algunos de los más en pedernal como implementaciones de la misma en una perspectiva de ciencias de la computación con algunas de estas futuras conferencias. 24. 4-1 pila: Ahora que tenemos una buena comprensión de algunas estructuras de datos básicas son array y nuestra lista vinculada, podemos comenzar a construir sobre esas para crear estructuras de datos más complejas pero más útiles. Y de lo primero de lo que vamos a estar hablando es de uno muy importante en informática . Y esa es la pila. Entonces, ¿qué es exactamente una pila? ¿ Qué podemos pensar al respecto? Esto en una especie de forma intuitiva. Un stack es básicamente la forma en que funcionarían las bandejas en un comedor. Entonces digamos que tienes un montón de bandejas en un comedor o como una cafetería o algo así . Y así tienes una pila. Aquí hay un montón de bandejas diferentes, todas apiladas una encima de la otra. Ahora bien, si quieres A ya sabes, si quieres una de estas bandejas, no vas al fondo a agarrarla. Eso sería que tuvieras que levantar todo y luego algo así, ya sabes, agarras todo, lo mueves, lo mueves, luego agarras la botella y luego lo vuelves a poner todo. Entonces eso no es lo que queremos hacer aquí. Lo que hacemos es que típicamente sacamos el 1er 1 de arriba y lo agarramos , ya sabes, , ya sabes, Así que tenemos esta bandeja, y luego la siguiente va y quien agarra eso, tienen una bandeja. Y luego una vez que hagamos que esos se hayan ido. Entonces nos gusta, quitar esos dos de nuestra pila. Ahora bien, si a alguien se le ocurre unas bandejas limpias, no la ponen en la parte inferior, lo ponen de nuevo en la parte superior. Por lo que tenemos unas nuevas bandejas limpias ahí azules esta vez. Y así se suman a la parte superior. Ahora, si alguien quiere agarrar uno, van adelante y agarran uno. Y entonces así ahora consiguen uno como así y así tienen una bandeja bleu y alguien más tiene una bandeja azul, y luego alguien agarra el 3er 1 Así que tienen, Ah, comercio negro. Al igual Y entonces al final de esto, ya sabes, seguimos subiendo y bajando, arriba y abajo a través de este tipo de tasa de estructura aquí. Y cada vez que nos quedamos sin bandejas limpias, se ponen en la parte superior y cada vez que queremos, cuando lo quitamos de la parte superior, así que Onley especie de ejecutar por un lado de este este este stack aquí mismo. Y así es exactamente como funcionan las pilas en informática. Entonces, básicamente, lo que va a ser va a ser una estructura de datos en la que tengamos un montón de información que está una especie de situada así. Entonces tenemos, como, un tres para, um, podríamos tener una palabra aquí. Podríamos tener gato aquí. Podemos tener realmente cualquier cosa que queramos dentro de esta pila. Pero lo que sale de ella es que si queremos agarrar de la pila, no podemos acceder a ninguna parte de aquí excepto por la parte superior. Y si queremos agarrar algo, se llama pop. Entonces no ponemos nada dentro de estos príncipes porque no conseguimos un escoge. ¿ Dónde está sólo estamos estallando? Llamamos a la pila y decimos: Hey, Hey, pop un elemento de ella. Y cuando hacemos poppin elemento de él, obtenemos el elemento superior en la pila justo aquí. Entonces eso significa que este cinco terminará yendo justo aquí. Y yo también pop. Obtenemos un cinco y luego se retira de la pila. Y así ahora, si volvemos a estallar. Entonces si llamamos a un segundo pop como así lo que vamos a terminar obteniendo es que el segundo elemento saldrá y será empujado o Italia agarrado y puesto aquí mismo poner tasa aquí. Y así entonces hacemos exactamente lo mismo eliminamos esta y esta ahora son Stack sólo quedan dos y tres. Pero si le vamos a agregar algo de información, hacemos algo llamado empuje. Y luego en los príncipes, tenemos que especificar a qué estamos agregando. Nuestra pila especificaría lo que está pasando aquí que va a estar yendo justo aquí. Y así debilitar poner ya sabes, algo aquí dentro? Pongamos 107. Entonces estamos empujando 107 a la pila. Eso significa que 100 7 irán luego a la parte superior de la pila, y luego lo ponemos en la pila. Y así es generalmente como funciona una pila. Y lo que llamamos a esto es que lo llamamos último. En primer lugar L I f o.Vamos a estar lidiando con otro llamado F I F. Oh, eso es un taco. Eso va a ser una especie de siguiente en esta serie, pero esto se llama último en primera salida. Ahora voy a admitir que esto es un poco ambiguo. A veces me confundo esto con una Q porque piensas que la última en es quizás la que ha estado ahí, la más larga, y estás pensando que una es la primera 1 salida. Pero no es así como funciona. Se habla de cuál fue el último en entrar. Ese es el que va a ser el primero en salir. Podemos volver a pensar en esto ya que podemos volver a pensar en esto como en lugar de último en primera salida. Este es el más reciente en los más recientes. Por lo que es más reciente en primera salida. Y si eso, ya sabes, te permite pensar en ello más fácil que ir por eso, Sólo recuerda, L I f o va a ser una especie del estándar que van a decir cuando están hablando de una pila. Pero lo que realmente significa es solo el más reciente en es el 1er 1 salida. Y así si acabamos de hacer un empujón, ya sabes, empujamos a 107 nos pop 107 empujamos a 107. Nosotros pop 107. Seguimos haciendo eso infinitamente. Estos dos nunca se tocarán. Estarán hambrientos. Nunca serán sacados de la pila. Y en muchas situaciones, esto es realmente importante para nosotros en informática porque, por ejemplo, esto podría usarse para rastrear como un. Por ejemplo, si estás tratando de resolver un laberinto, esta sería una gran manera de hacerlo, porque cada vez que como tenías un giro, podrías empujar eso a una pila. Y luego si te pillan, como un callejón sin salida, empiezas a salir de la pila y luego, , digamos que hubo un segundo. Había una segunda dirección aquí. Por lo que la segunda dirección aquí. Entonces te fuiste por aquí. Fuiste aquí abajo. Fuiste aquí abajo. Tenemos, como, como, un poco de pila simulada justo aquí, y cada vez que haces uno de estos giros, pones esto en la pila. Entonces, ya sabes, vuelta uno giró para dar vuelta tres vueltas para ti como, oh, oh, nos topamos con un callejón sin salida. Entonces, lo que puedes hacer es en realidad simplemente sacar eso para ir hacia atrás en el tiempo y luego empezar en una dirección diferente y empezar a empujar en tu nueva dirección, que es este nuevo camino azul y una especie de una de las pequeñas aplicaciones que podrían ser usado es genial para, como, como, teoría de gráficos y algunos de los tipos de conceptos más avanzados en ciencias de la computación. Pero ahora mismo, todo lo que tenemos que entender es cómo funciona una pila, y también podemos entender cómo se implementa también, porque no hay clase de, um, ya sabes, forma exacta para hacer esto. Hay un par de formas diferentes en las que podemos crear una pila y sus formas de las que ya hemos hablado. Podemos crear una matriz que sea una pila, y podemos crear una lista enlazada que sea una pila como esa y tienes que pensar en cuál sería Mawr eficiente. Entonces tenemos nuestra matriz aquí y digámoslo. 01234 y así tendríamos que hacer un seguimiento del básicamente el frente de la pila todo este tiempo porque digamos que el frente está justo aquí y luego tenemos un cursor que ya sabes está haciendo un seguimiento de eso. Entonces tenemos un a un 10 y un nueve al frente está justo aquí. Y así cada vez que llamamos a Pop, así que cada vez que llamamos a Pop en esta situación, lo que en realidad va a hacer se va a agarrar lo que sea este número de cursores. Entonces, por ejemplo, este momento este cursor está configurado para llamarlo. El cursor Ver se establece en tres. Entonces cuando estallamos, en realidad sólo vamos a agarrar el elemento en Digamos que toda esta matriz está configurada en X. Vamos a agarrar el elemento en X tres. Entonces conseguimos que ese elemento va a ser, nos va a entregar A. Nos va a entregar un nueve a nueve. Entonces hagámoslo. Nos va a entregar un nueve, y luego lo que hace es, luego toma ese número y lo resta por uno para que pudiéramos ir. Entonces nuestro nuevo R C ahora es igual a C menos uno, lo que significa que ahora es igual a dos, y entonces podemos seguir haciendo eso. Entonces solo apaga esta información. Lo agarramos, y luego tomamos el cursor. Tomamos el cursor justo aquí y lo movimos de nuevo lo retiramos de nuevo uno por aquí. Y así es como podría funcionar en una matriz. Ahora podrías estar pensando, esto va a tener una limitación una vez que lleguemos al final. Si tratamos de empujar más información a este fin, se va a romper. Vamos a tener una falla de segue, y eso puede hacerla un poco peligrosa. Pero si sabes que solo estás trabajando con 10 o más elementos, esta podría ser una forma más rápida de implementar tu pila. Ahora. La otra forma en que podríamos hacerlo es que podemos usar una lista enlazada, y ésta en realidad también es bastante intuitiva. Todo lo que vamos a dio es cada vez que tengamos una nueva pieza de información, sólo la vamos a poner al frente. Entonces lo vamos a agregar al frente como lo hemos estado haciendo con vinculado Menos Solicitous es , pongamos algunos números aquí solo para que esto no sea tan confuso. Y digamos que queríamos sumar un cuatro aquí, así que todo lo que tenemos que hacer ahora es simplemente vincular esto así y luego, por supuesto, cambió nuestra posición de inicio. Para que apunte a para que apunte a nuestra nueva. Y luego cada vez que queremos salir del principio, todo lo que tenemos que hacer es simplemente cambiar. Agarra la información de esto y luego cambia nuestro iniciador de nuevo, vuelve a subir uno. Y así puedes ver que esto en realidad podría ser un poco más rápido en el sentido de que no tienes que arreglar todo aquí, pero, um, y todo especial, porque no tenemos que agarrar cualquier cosa desde atrás. Nosotros no buscamos a través de esto. Estos aire siempre tiempo constante aquí arriba, y podría ampliarse hasta el infinito. Entonces, ya sabes, puedes seguir agregando notas. Esto todo el tiempo que quieras. No tienes que definir lo grande que va a ser. Por lo que esta suele ser la forma típica en que se implementan las pilas. Se trata de algún tipo de lista de enlaces. No obstante, se pueden implantar en un aumento. Yo sólo quería mostrarte eso también. Y muchas veces algo no es, ya sabes, completamente raro que se implementen con una matriz 25. Ejemplo de de 4 a 2 apilado: que tenemos algo de la intuición detrás de una pila. Yo como que quería cimentar la idea de una pila pasando por un par de ejemplos, algún tipo de formas en que podemos ver cómo un programa ingresará los datos, la salida, los datos y luego cómo va a funcionar todo en conjunto. Entonces lo que estaremos haciendo es repasar algunos ejemplos aquí mismo. Entonces aquí mismo, sólo tenemos un ejemplo básico. Dice dar la salida final y los elementos restantes de la pila. Entonces lo que vamos a hacer es que vamos a ejecutar estos comandos y luego ver en qué se convierte nuestra salida y en qué aún queda en la pila al final. Entonces, empecemos haciendo esto paso a paso. Entonces vamos a tener una pila vacía aquí mismo. No tiene absolutamente nada en ella. Y luego nuestra salida. Voy a poner nuestra salida aquí abajo, en realidad, vamos a ponerlo, vamos a ponerlo a la izquierda aquí porque podría ser largo vamos a poner nuestra salida justo aquí, así y así la salida sólo va a tener estos números pueden cafeína el uno al otro. Entonces voy a explicar eso en un segundo, pero ¿las salidas van a estar aquí abajo debajo del fondo y entonces nuestra pila va a seguir cruzando la parte superior? Así es este paso un paso uno dice push for Así que vamos a empujar por aquí, lo que significa que solo agregamos un cuatro debajo de la pila. Y entonces Así ahora vamos a la siguiente que se empuja a Así no ha pasado nada más. No se ha hecho estallar nada. Entonces tenemos una pila de cuatro, y vamos a empujar hacia ella. Entonces empujado para, quiero decir, empujar para escribir va justo ahí. Y así ahora vamos a ir al siguiente paso dice, Empuje 15. Entonces tenemos un cuatro, tenemos un dos, y ahora tenemos un 15 así Y entonces finalmente llegamos a nuestra primera salida. Nuestra primera salida, dice Pop, Recuerda, tiene que haber nada dentro de la olla porque solo va a agarrar cualquier elemento que esté en la parte superior. No tiene un tipo de elemento especificado, se va a agarrar. No se puede agarrar nada debajo de la parte superior. Entonces todo lo que tenemos que decir es solo pop un elemento así que vamos a hacer es que vamos a sacar ese elemento. Y así todo lo que nos queda es un cuatro y un dos, y entonces ese 15 a los 15 viaja hacia abajo a nuestra salida aquí abajo. Y entonces Así ahora tenemos 15 en nuestra salida. Y así fue este paso. Y así el siguiente paso que hacemos es empujar 27. Ahora tenemos cuatro, llegamos a, y luego nos dieron 27 de la parte superior. Y entonces ahora lo que vamos a Dio es que vamos a hacer a pops. Entonces vamos a reventar el 1er 1 que es nuestro 27. Por lo que en este pop, el 27 se moverá hacia abajo y se pondrá en nuestra salida. Entonces ahora tenemos 27 aquí, y se podría separar esto con comas o cualquier cosa. Yo sólo los estoy juntando todos. Por lo que 15. 27 solo vamos a armar todo esto así y luego tenemos que volver a estallar. Entonces este era este pop aquí mismo. Donde ese pop. Ahora tenemos que pop una vez más. Entonces ahora tenemos sólo los cuatro que quedan en la pila y están demasiado bien, Algo así van los dos. Entonces la masticación, que está justo aquí baja y se pone en la salida, ¿ verdad? Al igual que así. Entonces tenemos sólo los dos agregados. Y así fue nuestro segundo pop, ¿verdad? Así. Y ahora se puede ver que vamos a bajar por esta pila una especie de paso a la vez. El empuja los pops y esta pila está siendo como, Dynamic está creciendo, se está encogiendo, y sólo está accediendo desde arriba todo el tiempo. Entonces hagamos nuestro último par de pasos aquí mismo. Vamos a empujar un tres, Así que dibuja aquí mismo porque todo esto de aquí está retomado. Entonces nos dieron cuatro y luego se suman tres, empujamos a nuestros tres, y luego la siguiente que vamos a hacer es que tenemos que empujar a otros cuatro, así que antes de tres y después cuatro. Y así presionamos en que cuatro así y luego Ahora lo que tenemos es que tenemos tres declaraciones pop . Entonces nuestra primera declaración pop va a estar aquí son la segunda declaración pop va a estar aquí, y yo tercera declaración pop va a estar aquí. Y entonces lo que tenemos en el 1er 1 es que vamos a estallar esos cuatro. Vamos a estallar esos cuatro para que se baje a la salida, y luego vamos a estallar esos tres. Entonces todo lo que nos queda es antes para que ese tres vaya a la salida. Y luego finalmente, vamos a estallar el último elemento. Entonces tenemos una pila vacía aquí al final. Y así tenemos los cuatro grandes, así, y te darás cuenta de algo. Te darás cuenta de que al principio agregamos estos cuatro y no se quitaron hasta el final. Había un montón de cosas al frente aquí, pero no se movieron hasta el final, porque es una pila. Y como dije, podría estar hambriento aquí abajo. Nunca podría volver a tocarse. Entonces eso es algo así como una de pequeñas adversidades que viene con una pila. Y así que déjame dibujar estas flechas especie de remate. Este diagrama se va a agrupar un poco aquí, pero así es como va a ir todo. Entonces un paso a la vez. Poco a poco estamos moviendo uno a otro, el siguiente al siguiente, y vaciamos esta pila, y esta va a ser nuestra salida final. ¿ Este número está justo aquí? 15 a 7 a 434 Si queremos poner comas aquí, es todo. Fuera. Ponlo así. Y así, sí, esa es la salida final de nuestra pila. Y entonces nuestra pila final terminó siendo completamente vacía. Entonces hagamos otro ejemplo aquí, y voy a hacer este un poco más limpio. Ahora que no lo hacemos. No voy a intentar volver a dibujar esas flechas. Eso fue bueno para el 1er 1 pero hagámoslo de una manera que pudiera verse un poco mejor. De acuerdo, entonces puse números aquí. Y así ahora vamos. Paso uno. El paso uno es un empuje al 10. Entonces teníamos un saco vacío para empezar, apagar, poner aquí abajo. Entonces tuvimos un empuje de 10 justo aquí. Entonces sigamos adelante y empujemos 10. Paso dos dice Pop. Entonces tomamos ese 10 y lo sacamos de inmediato. Entonces Ahora estamos de vuelta en una pila vacía. Y entonces ese 10 baja hasta aquí. Ese 10 baja derecho a aquí y pongamos el paso que sucedió por encima de él. Por lo que pasó en set a. Y así vamos al Paso tres. Ese es el empuje a Así que vamos a empujar a los dos ahí como así Y luego Paso cuatro dice empujar un cinco a cinco. Paso Cinco dice empujar un C. Así que vamos a estar mezclando diferentes valores aquí cinco y luego ver en la parte superior. paso seis es otro pop, así que vamos a estar haciendo estallar ese mar. Entonces todo lo que nos va a quedar es un cinco y un dos, y vamos a poner la vista aquí abajo. Y luego fue en el Paso seis cuando sucedió esto. Y luego vamos a siete, que es otro pop. Entonces ahora sólo nos quedan los dos en la pila así y entonces también vamos a estallar ese cinco y lo ponemos aquí abajo. Este no es el paso siete, y así estamos en el Paso ocho ahora. Ocho dice que necesitamos empujar un 14 Así que tenemos un dos 14 nueve dice que necesitamos empujar a perro. Entonces ahora tenemos que 14 y luego perro en la parte superior aquí. Y entonces ahora vamos a estallar los tres elementos. Entonces 10 va a bajar a y 14 y vamos a sumar perro aquí abajo. Y esto fue en 10. Y luego vamos a seguir adelante y vamos a parar a 11 aquí mismo, que sale del 14. Entonces todo lo que tenemos es demasiado común, y eso fue en el paso 11. Y vamos a terminar es a menudo podemos terminar esta gráfica aquí abajo. Es un último pop, así que es una pila vacía. Entonces llegamos o mi papá 11 11 debería ser 14 11. Deberían ser 14 aquí mismo, y esto también debería serlo . Y entonces esto es en el paso 11 y 12. Digamos sin embargo, que no teníamos el paso 12. Way salió exactamente a la misma cosa al final aquí se nos ocurrió una pila vacía, mismo que hicimos en el último ejemplo. No obstante, vamos a llegar a un no vamos a terminar en una pila vacía. Entonces, ¿digamos qué? Nos tachamos Paso 11. Digamos que somos el paso 12. Entonces tachamos el Paso 12 y no estamos usando eso. Eso significa que esto va a terminar en una pila no vacía por lo que sólo podemos borrar todo este asunto. Y esto es que esto pasa mucho a en este tipo de ejemplos es que la pila no tiene que estar vacía para terminar. El problema es que aún puede tener un valor dentro de ella. ¿ O aún podría tener múltiples valores dentro de él? Y en esta situación, tenemos una salida aquí de 10 c cinco perro 14. Pero también nos queda algo en la pila, y eso también es importante. Por eso tenemos que hacer. Por lo general ambas situaciones fueron para obtener la salida y la pila reinante en estas situaciones. Debido a que la pila podría no estar vacía, podría no ser capaz de simplemente empezar como hicimos con este con anti Stack. Si volvimos a esto cuando tenemos que entender que todavía quedan dos en la pila y hagamos un ejemplo ligeramente diferente, digamos que intentamos algo donde estallamos para 12 y luego 13. Volvemos a pop si hacemos un pop en una pila vacía. Entonces hay una pila vacía y tratamos de implementar este último pop para que esto vaya con el caso original donde estamos en una pila vacía. Y entonces ahora estamos tratando de sacar algo de una pila vacía que dará como resultado un aire . Si intentas estallar de una pila vacía, vas a conseguir un aire masivo algo a lo largo de las líneas de un aire de falla de segue o no existe aire, cualquiera que sea el tipo de programa que lo use va a lanzar un aire diferente. Pero básicamente lo que pasa es que estás tratando de agarrar información que no está ahí, y así podrías escribirla en el código donde solo va a decir, Oye, um, va a ignorarla o lo que sea. Esa no suele ser la mejor práctica de codificación porque eso significa que estás ignorando el problema , que tu código estaba mal la inocencia, donde está tratando de hacer estallar algo que no está ahí, lo que significa inocencia que por qué ¿estaba tratando de hacer estallar algo que no estaba ahí? ¿ Qué tipo de cosas provienen de eso? A lo mejor el diseño estaba mal en el código. A lo mejor está tratando de agarrar algo que no tiene, así que no usamos. Yo quiero ignorar eso. Queremos dejar pasar el aire y luego podemos arreglar nuestro código. Podemos arreglar los datos que entran y salen para arreglarlo. Entonces sólo entiende, sin embargo, que estallar. Si intentas estallar de Empty Stack, obtendrás un aire de eso. Pero esos son los ejemplos y especie de la intuición de cómo podrías bajar un ejemplo de pila empujando, copilando realmente, realmente algo así como simple, sobre todo si lo dibujas. Te recomiendo encarecidamente que lo dibujes para que veas lo sencillo que realmente es esto. Tu agregando cosas a la parte superior. Lo estás sacando de arriba y solo estás listando la salida al final 26. 4-3 coloreados: Ahora que tenemos pilas bajo el cinturón, vamos con su hermano. Y esas son las señales. cues son muy similares a Stax, excepto que tienen una diferencia importante, y así es como se extrae la información de la estructura de datos. Entonces hagamos exactamente lo que hicimos con las pilas. Y vamos a repasar una especie de intuición detrás de lo que es una Q. Y la mejor manera de hacerlo es en realidad sólo en Gran Bretaña, como la lengua británica y, creo, lengua australiana. Ellos llaman Q a lo que los estadounidenses llaman una línea, y eso es por una buena razón. Por ejemplo, digamos que tenemos, ah, cajero bancario justo aquí. Esta es una cajera de banco y hay una línea, que es lo que decimos en América, Um, una línea de gente esperando. Ahora tendrás a esta persona, esta persona, esta persona, esta persona y esta persona. Y la forma en que funciona esta estructura de datos es que sale la primera persona que está aquí . Se les sirve, les quita, y luego a cualquier nueva gente se le agrega hasta el final por aquí. Y esto funciona de una manera que crea exactamente una cola. Las primeras personas en entrar son las primeras en ser servidas por aquí. Entonces este es el Recuerda cómo en la última vez que hablamos de l i f Oh, éste es f i f o.Y esto significa primero en primera entrada, primero en salida. Entonces los primeros que llegaron son los primeros que van a salir, um, um,otra vez. Y así, como dije, éste, tipo de terminología podría ponerse un poco confusa. Entonces si quieres pensarlo de una manera diferente, esta es la, um, la um espera más larga, la espera más larga es la 1ª 1 salida. Por lo que la persona más larga ha estado esperando es el 1er 1 fuera, Y por supuesto, esa sería la persona del frente aquí. Y así la forma en que implementas eso en una estructura de datos es en lugar de dibujar una pila como esta porque eso es lo que solo te permitirá agarrar de un extremo es que puedes dibujarla una especie de lado. Y así es como yo suelo dibujar es que tienes este tipo de estructura de datos donde tienes , um, , como, una especie de lados aquí, Y si alguien, esto podría ser la parte posterior de la misma, y éste podría ser el frente. Y si a la gente se le agrega, se les agrega a la parte de atrás. Entonces digamos que ahora tenemos algunos datos aquí. Si a la gente se le agrega se le agregará a este lado de la misma, y cuando la gente sea sacada de ella, les sacará de este lado. Entonces, por ejemplo, tenemos una nueva persona que entra. Por lo que hay 31 persona que se sirve. Por lo que este tres se retira y las acciones se mueven hacia abajo así. Y ves que es un poco más difícil dibujar porque no es exactamente estacionario, es solo Se sigue moviendo a medida que avanzas. Y eso es sólo una especie de la naturaleza de a de a que en esta situación. Y así, por ejemplo, siguen existiendo el push y las operaciones pop, sin embargo, solo funcionan un poco diferente. El pop siempre va a agarrar del frente en lugar de la parte trasera, por lo que el pop agarra del frente en lugar de como en una cola donde va a agarrar, o en lugar de como en una pila, donde va a agarrar del mismo lado exacto que empujó . Por lo que Pop va a agarrar de frente. Empujar va a empujar hacia atrás. Y esa es la gran diferencia de esto. Y podrías estar pensando ¿cómo exactamente? Con esto, ¿Sabes qué? ¿ Qué? Algunos. los beneficios de esto. Imagina una computadora. Tenemos un procesador aquí mismo. Ah, procesador. Entonces una CPU, ¿cómo obtiene datos? Bueno, ¿cómo se pone, en realidad instrucciones de lo que debe hacer? Bueno, la cosa es, es que si usara una pila para obtener instrucciones, tendrías un problema Donde si, por ejemplo, digamos que este top one era como, ah, Navegador web. Y entonces éste era algo que necesitaba hacer para el justo procesamiento general. Y luego aquí abajo había un documento de palabras. Imagínese si esto fuera un saco y estos dos seguían viniendo en nuestro documento de palabra se congelaría porque nunca se tocaría. Sería lo que se conoce como hambriento en la parte inferior aquí, y esa no es una buena implementación para una CPU. Ah, mejor implementación sería si en lugar de que esto sea una pila, en lugar de ser una pila, lo que realmente hicimos fue una Q porque ahora se va a ejecutar. La primera tarea va a ejecutar la primera tarea y en la segunda y en la tercera tarea . Y luego, si algo necesita ser ejecutado a continuación, esos se van a sumar aquí. Y este Q simplemente seguirá envolviendo alrededor y alrededor con nuevo tipo de cosas que necesita dio y nuestra CPU solo logrará uno después del siguiente después del siguiente después del siguiente después del siguiente después del siguiente después del siguiente después del siguiente. Y podrá recorrer en ciclo todos los programas que necesitamos. Ya sabes que necesita lograr los cálculos que necesita dio sin morir de hambre alguna tarea determinada. Y así es como funciona una CPU. Es un poco más complejo que esto, sólo porque me refiero a que tiene que estar haciendo esto como algo así como tres millones de veces segundo o algún número loco como ese, y ciertas cosas tienen prioridad sobre otras cosas. Pero en el sentido básico, es por eso que usarías una Q sobre una pila es cuando quieres que todo tenga la misma cantidad de valor y quieres lo que más tiempo ha estado esperando para ser atendido primero. Entonces, veamos una especie de mirada a las implementaciones. Cómo podríamos hacer esto podríamos usar de nuevo una lista enlazada o en array hasta ahora son lista enlazada. Estábamos por nuestro Ray, mi papá por array. Tendríamos algo así aquí. Y la cosa es que esto tendría que ser una matriz circular. Esto tendría que ser circular. Recuerda cuando hablamos de las pilas que solo podíamos usar el derecho normal cuando teníamos que hacer era tener una maldición. Son una especie de Sí, un cursor que apuntaba hacia abajo, hacia atrás, y luego simplemente se movió hacia arriba y hacia abajo. El problema es, es que el frente y la espalda siempre van a estar moviéndose por todo el lugar. Entonces, lo que necesitamos hacer es que realmente implementemos. Tenemos que implementar una derecha circular para que el frente y la espalda puedan moverse. Entonces lo que hacemos es tener como, digamos, alguna información aquí, y tendríamos un cursor que apunta al frente y un cursor que apunta a la parte posterior solicito diría, Quizás ese es el frente. A lo mejor esta es la parte de atrás. Y ahora, cuando agregamos datos en, se agregaría en la parte trasera o el frente realmente no importa siempre y cuando los lados estén opuestos. Habías agregado en un lado y tomas datos del otro lado. Entonces moverías cada uno de estos por encima. Entonces si tomabas o si agregabas a la espalda, entonces se movería la espalda. El dorso dentro de mí se trasladó a la nueva pieza de datos poco duro ahí mismo. No obstante, se movería así, y entonces el frente no se movía. Y si te saltaste del frente, entonces agarras este y mueves éste también. Entonces es exactamente como hablamos de la matriz circular. Tenemos que hacerlo circular. Para que funcione de lo contrario se encontrará con situaciones en las que tenemos que seguir usando O al n dedo del pie, mover todos los datos de ida y vuelta. Y eso se pone muy, muy tedioso final realmente intensivo en recursos. La siguiente opción debilitar a Dio es que podemos usar nuestra lista enlazada para que podamos tener aquí nuestra lista enlazada y la forma en que vamos a hacer esto es que necesitamos tener tanto ese puntero de arranque , el punto de arranque normal que tenemos. También necesitamos tener ese puntero de cola del que hablamos. El motivo por el que necesitamos el puntero de cola es para que sepamos exactamente qué hay al final de la lista por aquí. Y si sabemos lo que hay al final y si podemos llegar a él de inmediato, entonces debilitarlo, agárralo, debilitarlo, eliminarlo y podemos apagarlo. Pero aquí hay un problema es que si solo tenemos un puntero de cola y tratamos de apagar esto , éste no se va a restablecer y eso va a ser un problema. Nunca podemos ir anteriores, por lo que esto en realidad va a tener que ser típicamente una lista doblemente vinculada. Esto nos permitirá no sólo movernos hasta el final, sino también retroceder uno y restablecer todo esto para saber para que no tengamos problemas donde esto siga contactando a un no, eso ya no existe. Entonces vamos a tener que usar la lista enlazada más avanzada de la que hablamos , que es una lista doblemente vinculada con un puntero de cola. Y ahora cada vez que queremos agregar algo a esto, acabamos de sumar al inicio. Por lo que acabamos de sumar más. Simplemente lo agregamos así y rehacemos las flechas y se agrega al frente cada vez que necesitamos eliminar algo, solo lo quitamos de aquí y luego reajustamos el puntero de cola a la parte trasera todo en tiempo constante . Y eso es esencial para todos estos. Vamos a estar hablando del final mismo de esto, de cómo son los tiempos de corrida de los todos estos. Pero en este momento sólo necesitamos entender, y esto va a ser. El punto principal de eso es que todos necesitan terminar como tiempo constante. De lo contrario, empieza a hacerse demasiado intensivo en recursos y sobre todo porque si simplemente lo haces bien , todos pueden ser tiempos constantes, por lo que no hay razón para hacerlo al final. Si todos pueden ser tiempo constante. Entonces esa es una Q. Y esa es la intuición detrás de una que en la próxima conferencia. Hagamos exactamente lo mismo que hicimos con sacos y repasemos algunos ejemplos 27. de 4-4 Ejesde de cola: no lo es. Hemos repasado la intuición detrás de Cues. Pasemos a algunos ejemplos para que veamos cómo interactúa la estructura de estado con los datos que se le dan. El primer ejemplo que vamos a hacer va a ser muy familiar. Es idéntico de uno de los ejemplos que hicimos por las pilas, y la razón es que quiero mostrarles cómo saldrán los datos de manera diferente para que lo vean aquí mismo. Lo que tenemos es la salida de pila que esto dio. Y luego aquí abajo está exactamente el mismo conjunto de instrucciones que hicimos con la pila para obtener este resultado. Entonces vamos a ver qué se le ocurre una Q. Entonces todo lo que tenemos que hacer es básicamente lo mismo que hemos hecho con las pilas en el pasado, donde vamos un paso a la vez y al ir un paso a la vez, somos capaces de, um, capaces de ver cómo estas pilas se están construyendo o en esta situación, cómo se está construyendo la Q, y luego cuál es la salida final. Entonces bajemos aquí y vamos a anotar salida también. Y así las salidas van a estar aquí abajo. Todos están numerados para nosotros. Para que podamos, ya sabes, crear esta cuadrícula por aquí de los pasos. Entonces, empecemos. Voy a dibujarlo de lado. Es hora de asegurarnos de que parezca una Q, y vamos a empujar un 10. Entonces ese es nuestro primer paso aquí mismo. El segundo paso va a ser para pop, así que tenemos que pop in element off. Aquí sólo hay un elemento, así que saltamos el 10. Entonces ahora que la Q se vuelve vacía, la 10 baja aquí y luego también podemos justo en el paso en el que sucedió esto. Y luego vamos a tres. Entonces estamos empujando en un a cuatro estaban empujando en un cinco y luego cinco. Estamos empujando a un C. Oops. Probablemente deberíamos asegurarnos de que también tenemos a los dos ahí. Y luego cinco estaban empujando una C, así que van a ser demasiado cinco. Ver, Y luego seis ahora seis estaban estallando y en una pila estaríamos saliendo del lado derecho aquí, del lado que el que entró aquí el más reciente. Pero esto se acusa. Entonces saltamos el que lleva aquí más tiempo. Y verás que la diferencia aquí está por aquí en la pila. Nosotros lo hicimos. Nos saltamos del que consiguió su primero el mar. Pero en esta situación en la que vamos a estallar el a Así que los dos van a justo aquí y esto ahora sólo tiene cinco y ver a la izquierda en ella. Y entonces podemos seguir adelante y decir: ¿Qué número? Los científicos, ese Paso seis, esto sucedió. Y en cambio, siete, vamos a estar haciendo otro pop. Entonces todo lo que queda ahora en la pila es el mar. Y así ponemos el mar aquí y seguimos adelante con un ocho. Por lo que con un ocho estaban empujando a un 14. Entonces ahora son 14. Por mi mal es, Ver está a la izquierda, Ver está listo para ser popped siguiente. Entonces es C y luego 14 pasa por atrás, y luego vamos a nueve y estamos empujando a perro también. Y así ahora tenemos C 14 y perro, y luego finalmente, sólo vamos a estar estallando. Entonces tenemos un pop. Se va a quitar un elemento, el siguiente Pops podría quitar otro elemento. Y luego finalmente, tenemos una cadena vacía. Entonces el primer pop, vamos a quitar el 1er 1 aquí, el que más ha estado esperando, el mar. Entonces todo lo que vamos a tener aquí arriba es que vamos a tener un cuatro, y luego un perro o 14 14 14 y perro. Y entonces todo lo que nos queda aquí es perro. Y tendrán una cola vacía justo al final por aquí. Entonces el C se quita, luego es el 14 se quita, y luego el perro se quita. Entonces lo que tenemos aquí es que vamos a tener Oh, cometí un error. Cometí un error. Esto no debería ser Ver, Debería haber cinco porque salimos de los cinco. Ahora éste es C y luego es 14. Y luego es perro. Perdón por ese error, chicos. Y entonces Así sucede esto a las 10. Esto lo que sucede a las 11 y éste sucede a las 12. Y así ahora se puede ver salvo otros errores que pudiera haber cometido, se puede ver que estos son en realidad muy distintos el uno del otro. Sus salidas hay una especie de reverso el uno del otro donde se puede ver que los dos está casi por aquí, mientras que los dos están en el extremo mismo. Por aquí, perro es completamente diferente. Entonces en realidad no hay realmente tanto de un patrón aquí, Pero se puede ver que el estado de salida fue el mismo, porque empujar un pop siempre va a ser lo mismo, si se trata de un apilador que justo uno tras otro. Pero en lo que empiezas a conseguir más datos ahí. Lo manejaron de una manera completamente diferente. Entonces esto es si esto fuera como, por ejemplo, un procesador de computadora o algo así, estas tareas se cumplirían de maneras muy diferentes. Y en esta situación, los dos fueron empujados en la parte superior. Pero no se ejecutó hasta la última declaración. Por lo que éste hubiera estado esperando mucho tiempo. Bueno, éste fue mucho más justo. Lo que fuera primero fue esperar más tiempo. Los promedió. Por lo que los tiempos de espera fueron todos relativamente promedio en general. Y por eso esto es mejor para, como hacer procesamiento por computadora y cosas así. Entonces ese es el primer ejemplo de la Q es bastante fácil. Todo lo que tienes que hacer es Pop y luego empujas o empujas y luego te sacas del extremo opuesto y obtienes este tipo de lindo al igual que cómo funcionaría la línea. Entonces ahora hagamos otro ejemplo, y notarás que por aquí los nombres han cambiado y esto se debe a que se pueden usar pop y push . Pero también la gente usa en Q y D. Q. Y la razón de esto es para que no se confundiera con, por ejemplo, otra pila en el programa por lo que la pila tendría popping push, y luego el el Q tendría en Q y D. Q. Y entonces ¿qué hace esto? ¿ Es, como dije, separa a esos dos. Podrían ver que tal vez no, pero sólo quiero presentarles estos conceptos para que entiendan. Si ves un ANC, eres de que qué exactamente es. Y ahora en este, voy a hacer un poco de taquigrafía cómo podría resolver este problema porque esto podría ponerse muy, muy ver presume. aquí, es Toma mucho espacio en mucho escribir así que te voy a mostrar una forma más rápida de hacerlo donde te lleves donde no tienes que escribir los pasos cada vez y puedes tener exactamente la misma cantidad de precisión. Entonces sigamos adelante y empecemos. Lo primero que vamos a hacer es que sólo vamos a dibujar una Q realmente grande aquí mismo. Al igual que vamos a, ya sabes, hacer esto realmente, realmente grande. Y entonces vamos a tener una salida aquí abajo y empecemos. Entonces lo primero que vamos a hacer es ir en Q A 10 un 15 y un 17. Por lo que incluimos esos tres números. Entonces ahora estamos abajo a esto aquí arriba, y ahora nos pollamos tu 1er 1 Así que lo que podemos hacer es simplemente tachar el del lado opuesto al que estamos sumando y ponerlo en nuestra salida. Y entonces podríamos simplemente pasar al siguiente paso en Q y l Así que ahora estamos en Q a este lado. Y entonces ahora le vamos a hacer a Deke. Usa ridículo uno. Estamos en un d lindo, también, también, Así que va a ser este 15 y en este 17 para que solo podamos tachar 15 17 y escribirlos aquí abajo . El 15 llegó primero, y después el 17. Y así ahora estamos aquí. Y entonces lo que vamos a hacer es en Cuba 14. Entonces ponemos un 14 por aquí, y luego tenemos dos más uso de polla, así que vamos a seguir adelante y de que la L d. Q. El 14 l 14. Arregla ese 14 aquí abajo l 14 y luego finalmente ahora, justo en el fondo. Aquí estamos, justo en las dos últimas operaciones, el en q de cuatro, y luego vamos a de que eso para. Y así ahora lo que nos queda es que tenemos nuestro, um y de hecho, Q. Y entonces esta es nuestra salida y te darás cuenta que tomó sustancialmente, ya sabes, menos tiempo. Y esta es una buena manera de explicar el concepto, porque se puede ver cada paso del camino. Y si quieres volver a mirarlo, puedes ver qué pasó entre cada empuje y cada pop. No obstante, cuando estés resolviendo estos problemas, es posible que quieras ir con una versión de mano más rápida y rápida como esta en la que solo puedes tener una Q de la que vas a entrar y salir . Por lo que quieres seguir redibujando señales y haciendo un seguimiento de las cosas, y eso te ayudará mucho. Porque incluso en esta situación, ¿ recuerdas cómo metí la pata aquí mismo? En realidad no puse un cinco y puse un c ahí. Incluso en esto, no me salvó de eso hasta el final donde tenía que ir. En realidad, vuelve a comprobar esto. Tiene exactamente la misma cantidad de precisión, y acelera su flujo de trabajo. No te muestra los conceptos también, pero te va a conseguir el resultado final mucho más rápido. Entonces ese es este ejemplo aquí mismo. Como dije, mucho más rápido. Cuando lo haces de esta manera y puedes ver que es igual que todas las otras señales que pones en este lado. Y entonces tú, um bueno, realidad estás poniendo en el lado derecho por aquí. Esto sería como nuestro frente y luego tu Esta es nuestra espalda. Entonces salimos de este lado, empujamos hacia un lado, y esta cosa se mueve aquí abajo mientras lentamente hacemos eso. Entonces eso son algunos ejemplos en pistas estructura de datos realmente, realmente ordenada que se puede construir a partir de otras estructuras de datos y que tiene tantas aplicaciones del mundo real y es realmente esencial para aprender un científico informático za. 28. de 4a 5 tiempos de que cortas de la 4-5 y con apo: Por lo que antes de que termináramos esta sección, quería discutir algo que hemos estado discutiendo y todas las demás secciones. Y esa es la corrida Tiempos de pilas y colas y los tiempos de ejecución no son tan cortados y secos como, por ejemplo, las listas de elancet o la matriz. Y eso se debe a que estas estructuras de datos no son estructura de datos que ellas mismas. Están construidos a partir de otras estructuras de datos, por lo que eso significa que son tiempos de ejecución dependen en realidad de cualquier estructura de datos en la que la construya. Entonces si bajamos aquí y miramos nuestras acciones, tenemos un empujón en un pop y nuestros tacos no han en Q y D. Q. Y ya sea podemos usar para ambos o bien podríamos usar en array. Para que conozcas el array clásico, o podemos usar una lista enlazada, así que tenemos la opción en cada uno de estos. No obstante, si lo piensas, cada uno de estos la matriz y la lista enlazada todos tenían la capacidad de si eliges uno de los otros dedos tienen un olor, el inserto que significa inserción de tiempo constante y un tiempo constante eliminación al final, lo que significa que necesitamos disparar para en nuestro tiempo de ejecución de todos estos, necesitamos disparar por tiempo constante porque se puede hacer en tiempo constante. Entonces ya que se puede hacer en tiempo constante, necesitamos asegurarnos de que toda nuestra tinta usada acusada Pushes y Pops también estén en tiempo constante . Si ha corrido en tiempo lineal o en tiempo cuadrado o cualquier otro tipo de tiempo más largo que nuestro Q y Stack sería horriblemente ineficiente porque, como acabo de decir, ya hemos demostrado que estas operaciones se pueden hacer en tiempo constante, entonces ¿por qué hacerlo más lento que eso? Y entonces, ¿cómo pudiste hacer eso? Entonces vamos al ejemplo de una pila realmente rápida. Entonces digamos que aquí tenemos una pila. Y si usamos, por ejemplo, una matriz con una matriz, todo lo que tenemos que hacer es hacer un seguimiento de un extremo. Entonces tenemos que hacer es digamos, tres a tenemos que simplemente empujar hasta el final, y luego podemos pop desde el final, empujar hasta el final, pop desde el final. Podemos seguir haciendo eso de ida y vuelta y recordar que una matriz siempre es constante, insertando el tiempo si sabes el número del spot aquí. Entonces, por ejemplo, como 123 Si conoces el ejemplo del foco, entonces solo puedes ir a ese borrar uno apagado, ir a ese push one de nuevo encendido, lo que significa que la eliminación y la inserción son ambos se van a terminar con uno. También puedes hacer eso con una lista vinculada siempre y cuando tenga un puntero de cola. Entonces solo tienes que el puntero de cola apunte al final. Y luego cada vez que llegues ahí, probablemente va a necesitar estar doblemente ligada lista para que podamos hacer de ella una inserción y eliminación rápida . Acabamos de quitar el extremo y luego mover el puntero hacia atrás uno. Y si quisiéramos agregar uno, hacemos exactamente lo mismo donde solo agregamos uno por aquí. Y luego movemos el puntero de cola sobre uno también. Y así ambos como probamos antes, pueden ser tiempo constante también. Entonces eso significa que tanto pop como push deben ser, Oh al uno, y así es como sabes que tienes una pila eficiente o Q. Y entonces solo podemos hacer el tipo rápido de ejemplo también para el, um para el Entonces sigamos adelante y pongamos cola aquí arriba y ahora ésta es un poco más compleja, y aquí es donde podrías tener aire o algo así. Si eliges el diseño equivocado, tendrás algo realmente lento. Por ejemplo, si tuviéramos Si implementamos, es sólo por una matriz normal. Por lo tanto, implementa esto solo por una matriz normal. Tenemos que empujar y pop desde extremos separados, así que tenemos que empujar hasta este fin. Y tuvimos el pop de este extremo. Pero el problema es con una matriz. Si no es circular, cuando saltamos de esto en, tenemos que desplazar todos los elementos hacia abajo para hacer un seguimiento de todo. Y cuando volvemos todo hacia abajo, eso se convierte en una oda a la en operación. Y como dijimos, eso no es lo que queremos. Entonces tenemos que asegurarnos de que si estamos usando una matriz para esto que necesita ser circular , necesita tener punteros delanteros y traseros. Podemos simplemente dibujar el carril circular justo aquí. Necesita tener punteros delanteros y traseros para que, como discutimos antes, pudiera ser esa circular donde pudiera ir en cualquier dirección. Y no necesita mover todos sus datos para mantener esa integridad. Entonces eso es una especie de pequeño escollo al que la gente puede entrar donde intentan hacer un que, uh implementado a través de una matriz. Y el problema es, es que necesita ser circular. Si no lo tienen. Circular, tendrán una muy ineficiente o justo aquí. Y ahora la siguiente es una lista enlazada, que en realidad es muy común para una Q. Y eso se debe a que es muy intuitiva con una que por lo que necesita estar doblemente ligada con un puntero de cola, y luego tiene la normal punto de partida también. Y así si estamos empujando, vamos a empujar hacia este fin. Entonces se va a ir, ya sabes, por aquí y luego si estamos estallando, vamos a estallar desde este extremo, o si quieres, esto es en Q. Y este es Deke. Tú y ambos de estos punteros son bastante comunes. Como expliqué antes, el punto de cola es muy fácil mantenerlo solo un poco de código extra, un poco de tipo extra de mantenimiento, y el puntero de inicio siempre está ahí. Por lo que sabemos dónde está la lista enlazada. Y con esos dos elementos que podemos empujar, podemos Pushor en Q y Popper. Dick, tú de verdad, realmente simple y siempre en tiempo constante. Entonces esa es solo la base del tiempo de ejecución. Simplemente entiende que siempre deben ser constantes. Tiempo de empujar y de pop. Q y D. Q. Si llegas a una situación en la que se le debe el final, entonces es un algoritmo ineficiente y se puede repensar para que sea más rápido, realmente bonito, simplemente normalmente solo se topa con él en un caso así. Pero sólo quiero que ustedes, ya saben, ustedes, ya saben, una especie de entender ese concepto porque, como dije, como dije, este es un curso de ciencias de la computación y entender los tiempos de ejecución. Todo es muy esencial para entender, ganar y dónde usar todo 29. 4-6 de la pila y los colas del mundo real: para que tengamos una buena comprensión de las pilas y los acusados. Repasemos algunos ejemplos del mundo real de dónde podríamos haberlos visto en una aplicación ordenada o dos de ellos. Entonces el 1er 1 que todos hemos visto antes es el deshacer y rehacer. Entonces, por ejemplo, en un documento de palabras, si decido ir hacia atrás, se puede ver que puedo deshacer las cosas. Pero si decido no hacer ningún cambio, podría retroceder y eso funciona con dos pilas. Entonces aquí mismo tenemos, como, nuestra activación o pila de comandos. Y por aquí es la pila de reducción. Por lo que actualmente estamos en el fuego de mando. Hemos entrado en algo al programa y queremos volver al mando por lo que hacemos es que se salta ese cinco y lo inserta. Lo empuja a esta pila derecha. Digamos que queremos ir a los comandos de vuelta. Se le quita a los cuatro y lo empuja por aquí a la pila correcta también. Entonces ahora lo que tenemos es que tenemos esta pila a la izquierda, que es nuestra activación, o nuestra pila de comandos. Y ahora estamos en el Comando tres, el tercer mando que ingresamos Ahora no se borraron estos datos. Simplemente está sentado en este acto reducido. Si queremos rehacer las cosas, sólo lo rehacemos. Se lo arranca de esto y lo trae de vuelta. Digamos que no queremos leerte. El 55 fue donde un error. Waas Queremos sumar un nuevo 16 hasta este. Entonces lo que hacemos es tomar y sumamos 60 aquí. Pero ahora si hacíamos clic en redo, tomaría este 500 pop it en la parte superior de seis y destruiría la integridad de esta pila por aquí. Entonces cada vez que agregamos algo, cada vez que no rehacemos, Así que por ejemplo , aquí mismo, si esta d f g justo aquí, si elimino todos esos y escribo algo más, no hay manera de que podría volver a eso. Lo que hago es, cada vez que agregamos un nuevo cambio que no es una radio, en realidad simplemente despejamos la pila correcta. Por lo que quitamos todo y lo hacemos así de nuevo. Y ahora podemos comenzar nuestros deshacer y reducir una vez más moviéndose de ida y vuelta. Y si alguna vez volvemos a hacer otro cambio, todo esto será despejado y removido de nuevo. Entonces así es básicamente como funciona deshacer y rehacer. También hay una cosita ordenada es si alguna vez has entrado en, como, como, un documento de palabras o algún otro programa, y sigues haciendo clic en el control Z, que es indebida o haciendo clic en el botón de deshacer y llegas al final de lo indebido. Eso es porque llenaste la pila. Entonces si ampliamos todo esto, ya sabes, ponemos un digamos que tenemos el mando, ya sabes, seis y luego cinco realmente van aquí. No deshicimos nada. Y, ya sabes, ponemos un siete aquí arriba. ¿ Qué fue? Si quieres poner un ocho Bueno, para poner ocho, no queremos,ya sabes, ya sabes, sólo decir, ¿ sabes qué? Ya no vamos a seguir haciendo un seguimiento de eso. Lo que hacemos es tomar el uno y lo borramos, fueron retirados de la pila, y luego tomamos todo y lo cambiamos hacia abajo. Entonces ahora tenemos 2345678 Y así notarás que el mando uno ya no está rastreado. Eso significa que podemos Onley deshacer al mando, y cada vez que hagamos otro comando, va a tomar esos y quitarle el fondo y luego empujar todo a la parte superior también. Entonces es una especie de Ah, pila modificada en el hecho de que podemos quitar de abajo, pero eso son sólo cuatro desbordamientos en la pila. Tan sólo una especie de salvedad de, si alguna vez te preguntas por qué no puedes deshacer más es porque tu pila se llenó y no tiene más memoria para almacenar esos comandos. Una especie ordenada de su uso de la programación es o el uso ordenado de cuse es la programación. Entonces, ¿qué es exactamente la programación? Bueno en cualquier tipo de computadora, se le dan comandos, y muchas veces se le dan muchos comandos a una computadora, y tiene que entender a Win para usar esos comandos. Pensemos en un ejemplo de impresión. Digamos que tenemos 100 computadoras en una oficina o una biblioteca, todas conectadas a una impresora, y todos están tratando de imprimir al mismo tiempo. ¿ Cómo se trata con cuáles imprimir primero? Lo que hace es que tiene una que quien llegue primero consigue su trabajo terminado primero. Entonces, por ejemplo, digamos que estamos en este lugar de la cola. Tenemos 345 El siguiente trabajo por completar es en el lado inferior, y esto es una especie de que construyendo. Entonces tenemos tres. Se va a seguir adelante y a imprimirse. Y entonces ahora, durante mientras se estaba imprimiendo, decidieron que querían tener un trabajo de impresión, y luego uno decidió que querían un trabajo de impresión también. Entonces lo que hace sólo los pone en el fondo de la lista, y luego continúa hacia abajo. Una vez que termina un trabajo y se mueve, sin embargo, tengo un siguiente trabajo arriba para justo aquí va de cabeza en Prince, y va a los próximos 15 y luego, ya sabes, gente puede volver al otro extremo. Entonces digamos que esta Q sigue expandiéndose o en realidad podemos hacerlo circular. Entonces ponemos los tres ahí se le va a imprimir que trabajo cuatro tiene otro trabajo, así que se lo pusieron ahí. Ahora se va a completar uno y va así. Entonces es solo una forma de programar todos esos comandos en un bonito tipo de fila justo ahí . Por lo que es justo si imprimes primero. El tipo que imprimió 10 minutos después de que no debería conseguir su trabajo antes de que cosas así . Es solo una forma de programar para que sea justo. También hay una forma de atravesar un laberinto con una pila. Esto es sólo una especie de ejemplo divertido. Aquí, digamos que tenemos una pila con esta grilla no se alinea exactamente aquí, pero es suficiente para hacer el punto qué se puede hacer con asombro si digamos que nos movemos por el laberinto y cada movimiento, ponemos en la pila. Entonces ya sabes, pasamos por todo aquí. Llegamos a este punto, o bien podemos ir a la derecha. Bajamos Bueno, si vamos a la derecha, nos vamos a poner lo que sea este azulejo. Entonces digamos que este azulejo es siete y este azulejo es ocho. Entonces vamos a poner siete aquí y vamos a subir ahora. Hemos tenido un muro. No hay más opciones y no más direcciones que podamos ir. Entonces lo que hacemos es empezar a salir de la pila. Empezamos a retroceder hasta llegar a un punto en el que podamos tomar otra decisión. Entonces volvemos a este punto y estamos como, Bueno, Bueno, esa manera no fue buena. Entonces bajemos por este camino. Ahora tenemos tres decisiones. Entonces digamos en la primera decisión, decidimos, Vamos a la izquierda, se mueve hasta aquí abajo. No reach dead in pop off, pop, pop, pop, pop, pop, pop pop pop volver a éste. No obstante, aquí podemos tomar más decisiones. Bajemos aquí ningún doctor pop y luego movamos todo el camino en esta dirección. Tenemos que tomar decisiones. Ve a la izquierda. No. Muerto en pop, pop, pop, pop, pop, pop. Y luego vamos, Tomemos esta decisión sin embargo la hicimos del laberinto. Es una forma en que tu programa puede correr por un laberinto y encontrar todo el camino a través de él. Tu compañero, Tu programa podría ser realmente rápido. Digamos que toma decisiones correctas cada vez que adivina bien. Es como ir aquí. Vamos a bajar. De acuerdo, tenemos más decisiones aquí Vamos a la derecha. Y luego vamos todo el camino. Vayamos a la izquierda. No. Vayamos Abajo. Encontramos una salida. Si esto no fuera una salida, yo estaría como, OK, vamos a ir todo el camino de vuelta hasta aquí. Vayamos aquí. Se quedaron sin decisiones para ir aquí y digamos que ahora volvemos a subir a ésta, y empieza a mirar en ésta también. Por lo que es solo una forma en la que puedes hacer un seguimiento de dónde has estado y qué direcciones puedes ir dentro de un laberinto. Es, ah, una especie de forma divertida de usar una pila para hacer una especie de cosa de juego. Esas son algunas aplicaciones aseadas de pilas y colas. Se usan por todo el lugar en Internet sólo porque son Internet y cualquier programa realmente sólo porque las colas son geniales para la programación? Las pilas son geniales para una especie de poner las cosas y luego sacarlas de una manera que funcione, por ejemplo, como con deshacer y rehacer grandes estructuras de datos y grandes cosas que aprender. Si vas a entrar en ciencias de la computación 30. 5-1 de clasificar la introducción de la algoritmo: Por lo que ahora tenemos una buena comprensión de algunas estructuras básicas de datos, sobre todo de un aumento debilitar. Empieza a discutir cómo ordenar las estructuras de datos y de las que vamos a estar hablando en esta unidad en particular están ordenando diferentes matrices. Y podría estar pensando, ¿Por qué es tan importante ordenar una matriz? Bueno, recuerda cómo estamos hablando del algoritmo de búsqueda, el tiempo de ejecución de búsqueda para nuestras matrices, y dijimos que el tiempo de ejecución de búsqueda se debe hasta el final. No obstante, si está ordenada, entonces se debe al log of in. Y entonces aún más dijimos que sobre el registro de la misma es básicamente tiempo constante. Entonces eso significa que aproximadamente podemos obtener oh, tiempo constante de buscar una matriz, es decir, que está surtido. Lo que significa que la clasificación mejorará nuestro tiempo de ejecución en general, todo el lote. Entonces, por ejemplo, si tuviéramos, ya sabes, un tres un uno un seis y un siete aquí en lugar de ser así, si lo ordenamos, si usamos un algoritmo de clasificación en él, entonces realmente saldremos con algo que hace un poco más desde 1367 Y esto nos permite volver a aplicarle ese tiempo de ejecución de búsqueda más rápido, y nos permite aplicar un par de otras operaciones que son un poco más rápidas también. Y así, ordenar una matriz es extremadamente importante. No obstante, hay una tonelada de formas diferentes de hacerlo, y así es lo que vamos a estar discutiendo en esta unidad es todos los diferentes ritmos de clasificación , sus tiempos de corrida cuando podrías usar uno que complejidades y simplemente consiguiendo una mejor comprensión de cómo podríamos ordenar algo así como una matriz para hacerlo más rápido en el en diferentes aspectos. 31. Orden de burbujas: Entonces el primer algoritmo de clasificación que vamos a cubrir es un algoritmo de clasificación conocido como Bubble Sort y bubble Sort es un notoriamente fácil de implementar pero muy mal ordenarlos, y vamos a discutir por qué es eso. Entonces repasemos la intuición de cómo funciona exactamente el tipo de burbujas. Entonces digamos que tenemos, por ejemplo, en un rayo aquí y lo haremos una matriz simple. Haremos seis largos seis grandes aquí, así que separados, thes y como, tal vez como uno aquí uno de aquí. Claro, ahí hay seis pequeñas columnas diferentes. Y digamos que tenemos un 7 a 10 153 Y entonces lo que hace el tipo de burbuja es que empieza por un lado de esto, por lo que empieza por el lado izquierdo y sube y agarra el número más alto que ve. Entonces por defecto va a agarrar el primer número, y luego pregunta, ¿Este número es mayor que este número? Si es así, intercambiaron sus posiciones, y luego una vez que se intercambian, pasa a la siguiente. ¿ Este número es mayor que este número? Si es así, cambia sus posiciones y sigue subiendo y bajando así. Entonces, solo repasemos un par de ejemplos aquí. Entonces lo que tenemos es que tenemos este siete aquí mismo. Y así siete es ahora son alérgicos. El número es siete mayor que dos. Por qué, sí, lo es. Entonces lo que hacemos es seguir adelante y cambiamos sus posiciones a siete. Y déjame en realidad sólo poner esos en rojo. Entonces somos bastante consistentes aquí. Por lo que cambiamos las posiciones a siete. Ahora son siete mayores a 10? No, no lo es. Entonces lo que hacemos es mantenerlos en el mismo lugar, y ahora 10 se convierte en nuestro número más grande. ¿ Es 10 mayor que uno? Por qué, sí, lo es. Entonces intercambiamos sus posiciones y luego tenemos el 10 por aquí y el que va justo aquí . ¿ Es 10 mayor que cinco? Sí, lo es. Intercambiamos sus posiciones por lo que cinco van aquí. El 10 va aquí y luego finalmente, lo hacemos una vez más, donde van los 10 aquí, y luego los tres retroceden. Por lo que notarás que ahora tenemos un spot. El estaño ordenado es nuestro mayor número. Se ha ordenado. Está en el muy, muy arriba aquí. Y Entonces lo que hicimos fue tomar el 10 que originalmente comenzó por aquí, y lo movimos todo el camino hacia arriba. Y así ahora tenemos el primer número. Tenemos un spot ordenado. Y así ahora lo que podemos hacer es que podemos hacer otro paso aquí. Podemos hacer otro paso aquí mismo. Vamos a redibujar esto muy rápido. Y entonces empecemos con nuestro son dos es un mayor que siete. No. Entonces los dos se van a quedar donde está, y entonces diremos es el siete es ahora nuestro número más grande es siete mayor que uno. Sí, lo es. Entonces vamos a intercambiar el al revés y vamos a movernos. Estos siete arriba es siete mayor que cinco. Lo es. Entonces vamos a intercambiar sus posiciones. Entonces ahora cinco está aquí y siete está aquí, y sólo dibujaremos el resto. Y aquí mismo hay siete mayores que tres. Lo es. Entonces cambiamos sus posiciones una vez más y ahora tenemos 37 Así que ahora tenemos dos partes ordenadas . Tenemos dos áreas por aquí ordenadas. Sigamos aquí. Sigamos adelante aquí mismo. Y voy a estar así de poder copiar. Vamos a destacar esto en CV de control y mover eso hacia abajo y luego arreglar la pequeña línea ahí mismo. Deberíamos ser buenos Dogo. De acuerdo, entonces el siguiente paso es hacer una y otra vez es una gris que a ella. ISS Así que ahora movemos estos y los cambiamos alrededor de 12 es a mayor que cinco. No lo es. Por lo que ahora cinco es nuestro número más grande. Cinco es ahora nuestro número más grande. Por aquí son cinco mayores que tres que son. Entonces intercambiamos esos 35 y luego ahora esos están en la posición correcta. Y entonces ahora te darás cuenta que vamos a correr por él una vez más y notamos que uno no es mayor que 22 no es mayor que 33 no es mayor que 55 no es mayor que 77 no es mayor que 10. Y ya hemos terminado. Nuestro pequeño um nuestra matriz aquí se ha ordenado usando clase de burbujas. Entonces la razón por la que se llama Bubble Sort es porque estás burbujeando el número más alto hasta el final y lo estás ordenando uno por uno a la vez. Permítanme mostrar un poco más de una forma intuitiva de ver. Este es un gran sitio llamado Visual Go y así no te estaría mostrando es su representación del algoritmo aquí mismo. Entonces déjame seguir adelante y hacer clic en el botón de reproducción en esto, y así te darás cuenta aquí es que está haciendo exactamente lo mismo. El cuatro es más grande, y simplemente sigue comprobando y lo que sea cuanto más grande se intercambie. Por lo que el 47 es más grande que todos los números hasta ahora, por lo que sigue intercambiándolo, y luego 50 se convierte en números grandes. Entonces ahora tenemos un área ordenada que viene en amarillo, y ahora lo hacemos de nuevo. El 44 ahora es nuestro número más grande, por lo que va subiendo y poco a poco va intercambiando uno a la vez, y luego 46 se convierte en el más grande, y ahora tenemos un garantizado a spots que están ordenados. Hazlo otra vez. Seguimos subiendo con un 38 y se ve eso despacio. Se está poniendo cada vez más surtido como nosotros G o.Ahora tenemos tres spots garantizados, y va a seguir así hasta que termine para que realmente podamos acelerar esto una pestaña aquí mismo y ahora puedes ver que cuando lo haga, esto lo va a hacer casi instantáneamente. Um, va a correr a través de todo su realmente, realmente rápido. Y esta es la esencia de lo que está haciendo el tipo de burbujas, y ahora todo está ordenado. Entonces eso es una especie de burbuja en pocas palabras. Entonces ahora vamos a romper esto y ver por qué es este un algoritmo tan malo? Bueno, si sólo tenemos una simple especie de mirada a esto, digamos que tenemos tal vez cuatro aquí mismo. Si solo echamos un vistazo simple a lo que necesita dar dio, echemos un vistazo al peor de los casos. Entonces el peor de los casos es que va a tener que tomar un elemento y luego moverlo a la cima cada vez. Por lo que el peor de los casos sería en realidad un gráfico completamente inverso un gráfico completamente inverso, lo que significa que se ordenaba en la dirección equivocada. Entonces en esta situación, lugar de ser, en lugar de ser 37 a 1, sería 7321 y así esta es una especie de la dirección exacta opuesta. Y eso significa que cada vez que burbujee, va a tener que tomar esto, moverlo todo el camino, tomar el siguiente y moverlo todo el camino. Toma a continuación, muévelo todo el camino. Y así verás que el número de operaciones requeridas en realidad sube bastante exponencialmente. Entonces tenemos que tomar esto y moverlo. 123 y entonces ahora los tres están por aquí. Entonces tuve que subirlo. 12 después uno. Y luego estamos ordenados. Y eso realmente sale, también, porque el peor de los casos es que tenemos que tomar esto y tenemos que compararlo en número de veces y moverlo en número de lugares que sale a una ecuación que es oh, de tiempos de fin. Ah, de in. Lo que significa que el peor de los casos para esto es en realidad en cuadrado. Y si realmente haces algunas matemáticas detrás de esto, en realidad entenderás que el escenario promedio del caso es bastante similar. El escenario de caso promedio para la clasificación de burbujas también está en cuadrado, lo que significa que se trata de una especie en cuadrado de clasificación. ¿ Recuerdas cómo hablamos de Exponential? Si tienes algo sobre tal vez como, 1000 o 10,000 cosas que necesitas ordenar esto puede empezar a tomar minutos, horas, días en completarse. Y así si nos metimos debajo de una mesita aquí, esta la mesa se estará llenando a lo largo de esta cosa. Bueno, podríamos ver nuestro tipo promedio aquí. Usaremos la notación para ello son promedio es en realidad en cuadrado y nuestros grandes fantasmas o escenarios en el peor de los casos en cuadrado. Ahora, veamos el mejor escenario de casos. Entonces digamos que esto vino completamente ordenado. Bueno, aún tendrías que asegurarte de que estuviera completamente ordenado, lo que aún tendrías que bajar y revisar. ¿ Es esto mayor que esto? ¿ Es esto mayor que esto? ¿ Es esto mayor que esto? Entonces si estaba completamente ordenado, por ejemplo, digamos que tenemos este aquí mismo. En lo que entramos en esto fue como, Vale, hora de ordenar esto. ¿ Esto es genial en esto? No. Nop, Nop, nope, nope. Ok, está ordenado. Eso está dentro. Todavía tiene que tocar toda la longitud de la matriz al menos una vez, así que eso está dentro. Entonces eso significa que nuestro mejor escenario es O hasta el final es en realidad Ah, este es el mejor caso. Por lo que queremos utilizar la notación adecuada para esto, que es el Sigma o el Omega. Entonces lo que tenemos aquí es esto el tiempo de ejecución de la burbuja se disparó por su naturaleza, donde tiene que comparar en número de números en número de veces, nos metemos está en relación cuadrada, y en promedio, es va a tener que compararlo. Entonces si no hicimos promedio aquí, en realidad podemos calcular eso realmente rápidamente. El promedio es en más de dos veces en más de dos, que va a igualar en cuadrado sobre cuatro. Hacemos caso omiso de lo exponencial, y todavía sale en cuadrado solo un poco rápido de matemáticas ahí. Si no lo haces, está bien. Simplemente entiende que el escenario promedio y el peor de los casos están en cuadrado y el mejor casos está en. Y así este es uno de nuestros peores algoritmos. No obstante, es muy fácil de implementar en código, todo lo que tienes que hacer es tener una especie de es esta mayor que Déjame solo mostrarte un pequeño fragmento de código del mismo aquí mismo. En realidad tiene el código escrito, y se puede ver que es sólo como cinco o seis líneas aquí. Básicamente, sube todo el elemento. Y si los elementos izquierdos del que seleccionó es mayor que el derecho, cambia su lugar y luego lo mueve y sigue haciendo eso una y otra vez. Entonces es un código muy, muy simple para implementar muy, muy simple. Pero por eso, aquí es donde hablamos de complejidad y tiempo. Por su simplicidad, en realidad se encuentra con ser uno de los peores algoritmos aquí. Entonces eso es tipo de burbuja. Vamos a empezar a pasar a los diferentes tipos a medida que bajamos, y empezaré a mostrarte cada vez más clases eficientes. Podrían llegar a ser un poco más complejos, pero su eficiencia definitivamente subirá. 32. Orde selección de 5-3: por lo que el siguiente pensamiento que vamos a cubrir es el tipo de selección. Entonces, ¿qué es exactamente el tipo de selección? Entonces repasemos la intuición de la misma. Y luego también vamos a hablar de los tiempos de corrida y luego buscar representación individual también. Por lo que la espada de selección es ligeramente diferente al tipo de burbuja. En realidad es bastante similar, pero definitivamente es diferente. Entonces digamos que aquí tenemos una matriz. Entonces nos metimos en un rayo como normal, y tiene cuatro números en él. Y esos cuatro números son, digamos, 17 18 2 y luego cuatro. Entonces lo que selecciones o hace es que tiene una porción sin clasificar y una porción sórdida. Entonces sigamos adelante y dibujemos una porción sin clasificar y ordenada. Y básicamente lo que vamos a hacer es que vamos a estar moviendo esta porción justo aquí , como si, como si, selecciónela, vamos a estar moviéndola. Entonces todo a la izquierda de esto, todo a la izquierda está ordenado. Todo a la derecha está desordenado. Y entonces lo que hacemos es pasar por esta lista y buscamos el valor mínimo. Una vez que encontramos el valor mínimo, lo cambiamos al primer espacio que está a la derecha de éste. Y luego movemos esto una y otra vez y seguimos haciendo eso. Entonces vamos a pasar por un ejemplo aquí mismo. Entonces vamos al 17. Nosotros decimos que no. 17 ojos ahora son nuestro número mínimo. Ahora es el número más pequeño que tenemos porque no lo hemos comparado con nada más. Por lo que tomamos ese 17 lo podemos comparar con el siguiente es 18 menor que 17. No, compararlo con el siguiente es con menor que 17. Sí, lo es. Entonces ahora también es nuestro número más pequeño. Y así ahora estamos comparando dos con todo lo demás es a más pequeño que cuatro. No es así que significa que es nuestro número más pequeño. Entonces ahora lo que hacemos es tomar este número y lo cambiamos por el número o la posición que está a la derecha de nuestra sórdida porción. Entonces tomamos esto y lo cambiamos por lo que está a la derecha, que es nuestro 1er 1 Entonces eso significa que vamos a tomar los 17 y los dos iban a cambiarlos . Entonces los dos van aquí y los 17 van aquí, así que ahora lo que podríamos hacer es tomar esto y nos vamos a mover, están ordenados porción, ¿ verdad? Al igual que así. Y ya sabes, todo lo que queda está ordenado. Tenemos el 1er 1 que tipo de nos enteramos que es el más. Es el número mínimo en esta lista. Por lo que va a entrar en nuestra primera posición. Entonces ahora lo hacemos de nuevo. El 18 es ahora un número mínimo. Llegamos a escuchar 17. Un 17 más pequeño es ahora un número mínimo. Llegamos a escuchar por una fuerza menor en nuestro número mínimo y no hay nada más que comparar. Entonces ahora tomamos nuestro número mínimo, que resultó ser cuatro, y lo cambiamos por el 18 de aquí porque es el 18 es la posición a la derecha del lugar iniciado. Entonces lo tomamos y lo cambiamos. Entonces ahora renuncia aquí 18 va aquí y luego tomamos nuestra sórdida porción y la movemos a justo aquí. Por lo que ahora sólo nos quedan dos números a Dio. Tomamos 17 lo movemos, decimos que es 17 menor que 18. Sí, lo es. Entonces tomamos esto. Lo movemos sobre 18 de su último número. Entonces tomamos esto y lo movemos, y ahora estamos confirmados que se ha ordenado. Por lo que funciona así. Se escanea a través para el número mínimo. Después lo cambia por el primer espacio disponible, y luego la sórdida porción se mueve, y sigue haciendo eso hasta que se completa. Entonces sigamos adelante y veamos una representación visual de esto y lo puedes ver como yendo en movimiento rápido, como así Así Así tenemos esto aquí mismo. Es una, um otra vez, por visual go dot net porque aquí tengo algún material realmente bueno, y sólo vamos a hacer clic en el botón de reproducción y podemos ver esta cosa, hacer su hacer lo suyo. Entonces, tres, ves, es el mínimo que encuentra es un mínimo intercambiado a la primera posición. Esto más de la izquierda es ahora la posición sin clasificar. Podríamos ralentizarlo un poco si quieres, y se podía ver a los cuatro. Ahora lo está comparando de una a la vez. Cuatro es el mínimo, lo intercambia. Todos los amarillos están en el tipo de posición, y vuelve a empezar. Empieza a las cinco, es el mínimo, y ahora lo está comparando con cada uno de estos. Con el tiempo, cinco termina siendo el mínimo. Nada cambia compara, encontró. El 15 no es el mínimo con el que se está comparando, y va a seguir adelante. 15 es el más pequeño en esta menos izquierda. Por lo que lo va a cambiar con la siguiente posición disponible y mercado según ordenados. Y va a seguir haciendo esto a lo largo del tiempo hasta que termine la producción aquí , lo que ahora la acelerará de nuevo para que podamos ver este tipo de ir en movimiento rápido y verás que se mantiene intercambiando, así, encontrar el mínimo, cambiarlo a la derecha del tipo de posición hasta que se ordene todo el asunto. Y ahí vamos. Ahora está ordenado. Entonces, ¿cómo exactamente cuál es el tiempo de ejecución de algo como esto? Entonces vamos a repasar el tiempo de ejecución aquí mismo. Pensemos en este tipo de intuitivamente tratar de averiguar cuál es el tiempo de ejecución con sólo mirar esto. Entonces nos conseguimos uno aquí y digamos que nos tenemos esto y vamos a dibujar se ordenan bien así Y luego algunos números aquí a un vino 17 para cosa sin clasificar aquí. Y entonces ¿qué tenemos que dio? Tenemos que correr a través de esto por cada número de aquí. Vamos a tener que correr por esto a lo sumo n veces, al menos en menos los tiempos de descanso. Entonces eso significa que no tendremos que correr por esto en promedio, en promedio, en más de dos veces. ¿ Y cómo llegamos a terminar de nuevo también? Bueno, esto tiene que hacerlo por dentro. Esto tiene que hacerlo por fin menos uno. Esto tiene que hacerlo por en menos dos en menos tres. M menos cuatro. Y así lo que puedes ver es que del lado izquierdo aquí, vamos a tener cosas que van ponderadas hacia dentro y por el lado derecho de la arena. Estamos teniendo cosas que son una especie de ponderadas hacia una. Y eso significa que en el centro aquí, el tiempo promedio va a tomar todas estas dos corridas va a ser en más de dos. Es el promedio de todas estas clases combinadas de cómo funciona el promedio y Así que básicamente, cómo sale esto es que el tiempo de ejecución de esto va a ser para cada punto de aquí. Va a ser en más de dos. Y como tenemos en números que tenemos que hacer eso, los multiplicamos juntos. Entonces van a estar en número de valores aquí, multiplicados por en más de dos, y eso significa que va a salir como en cuadrado. Por lo que el tiempo promedio de ejecución aquí está en cuadrado, que también es el peor tiempo de ejecución de los casos. Pero hay que pensar en otra cosa. Esto es ligeramente diferente en tipo de burbujas, en el sentido de que no lo hace. No hay posibilidad de que en realidad pueda simplemente verificar y confirmar que la totalidad de la matriz ha sido ordenada. Tiene que hacer este tipo de movimiento sobre el que tiene que tomar, ya sabes, la porción sin clasificar, y tiene que moverla y comprobar por cada número. Incluso si nos metemos en un número completamente ordenado, Ah, array aquí. Entonces si tenemos, si esto sale ordenado, por ejemplo, si tenemos del 1 al 8, déjame solo poner esto aquí. Hagamos un pequeño ejemplo aquí. Vamos a crear una matriz completamente ordenada aquí. 12345 Así que nos tenemos un derecho completamente ordenado. ¿ Cómo sabemos que está completamente ordenado? Bueno, nuestro programa, todo lo que sabe hacer es correr y revisar. Este es el número mínimo es un menor Sí, Sí, sí, sí. Está bien. Es más pequeño que todos ellos. Eso significa que puede decir en su lugar que se mueve sobre el tipo de calificación. ¿ Esto es más pequeño? Sí. Sí, sí, sí. De acuerdo, lo movemos. Sí, sí, sí. OK, lo movemos. Sí, sí, sí. OK, lo movemos. Sí. Está bien. Nosotros lo movemos. Y así lo seguimos moviendo, sin importar cuántos. No importa qué tan ordenado, en realidad empieza a ser. Y entonces eso es importante. Porque eso significa que eso significa que incluso en el mejor de los casos, incluso en el mejor de los casos, todavía va a estar en cuadrado. A diferencia del tipo de burbujas, que puede correr a través de esto e inmediatamente comprobar que se ordena diciendo: Es esto más pequeño que esto? No. ¿ Esto es pequeño en esto? No. No. No. Una vez que se pone el y es como, Oh, ya estamos ordenados. Termina el programa. No puede hacer esto. Tiene que mover esta cuadrícula ordenada. Y así el problema con la clasificación de selección es que nos metemos en los tres valores están en cuadrado . Entonces nuestro mejor escenario de caso, nuestro mejor escenario de caso, um, va a estar todavía en cuadrado, el tiempo de ejecución promedio aún va a estar en cuadrado, y luego el peor tiempo de ejecución va a ser en cuadrado o La notación Big O está en cuadrado también. Por lo que este programa es en realidad muy, muy ineficiente. Es el álbum de inicio más ineficiente con el que vamos a tratar, y se puede ver que la intuición detrás de él es en realidad bastante ordenada. Estás creando porción surtida. Estás moviendo números de ida y vuelta. Es, ya sabes, suena como si funcionara realmente bien. El problema es, es por esta sórdida porción estaban teniendo este caso donde siempre va a estar en cuadrado. Y así al final de todo esto, obtenemos otro que está en cuadrado, en cuadrado y cuadrado, sólo una especie de tipo de burbuja. Estos dos son bastante malos. La selección son algoritmos de clasificación bastante malos y estos son ya sabes que son buenos para aprender porque te muestran formas intuitivas de hacerlo. Ya sabes, formas en las que puedes, um, formas que ese tipo de tiene sentido, pero no son las mejores maneras de hacerlo. Entonces estos son los malos ritmos de clasificación, y a continuación, y a continuación, vamos a estar moviéndonos a algunos mejores algoritmos de clasificación que en realidad tienen tiempos de ejecución más rápidos . Y va a ser más complicado porque así es como funciona la programación. Por lo que no puedes simplemente tener esto, ya sabes, canjear donde solo puedes conseguir tiempos de ejecución más rápidos y sea más simple. Por lo general va a ser un poco más complejo, pero aún así tienen sentido una vez que lo atravesamos un par de veces . Entonces, sí, eso es tipo de selección. Y vamos a saltar a algunos algoritmos de clasificación más rápidos. 33. Orde inserción de 5-4: la última conferencia hablamos de cómo vamos a estar entrando en algunos algoritmos que fueron un poco más rápidos y mentí sólo un poco porque todavía tenemos que ir sobre Insertion Sort, que sigue siendo insurgentes bastante lentos. O es el siguiente paso lógico porque especie de construye a partir de la burbuja corta y la selección especie de juntos en este nuevo tipo de algoritmo de inicio. Eso suena un poco más como si se hubiera de hacer. Pero aún tiene esas tendencias lentas. Y así vamos a estar repasando este. Vamos a repasar cómo funciona que mostrar la visualización y luego hacer los tiempos de ejecución como el resto de ellos. Entonces empecemos con esto. Lo primero que vamos a hacer es que sólo vamos a crecer un poco de Ray justo aquí para que pudiéramos una especie de mirar esto de manera intuitiva así y así tengo esta matriz aquí y ahora pongamos algunos números aquí. Ocho para 17 así Y así lo que los insurgentes o hace es como dije, como funciona fuera de selección donde tenemos esta porción ordenada y sin clasificar. Excepto a diferencia de la selección. Lo que hacemos es realmente sacar el número y luego insertarlo de nuevo en la sórdida sección. Aquí no buscamos el mínimo. Acabamos de agarrar el 1er 1 y en ordenarlo de nuevo. Entonces hagámoslo justamente. En primer lugar, vamos a tomar nuestra sección ordenada. Vamos a moverlo. En realidad, deberíamos sacar primero nuestro número, así que lo guardamos como una variable o algo así. Lo sacamos y luego tomamos esto y lo movemos. Entonces ahora todo por aquí es la sórdida sección. Entonces entonces volvemos a insertar esto, pero lo insertamos en un punto donde debería ir. Entonces lo que hacemos es volver a insertarlo en este nuevo espacio vacío. Um así técnicamente, como en teoría, lo sacamos y lo volvemos a poner. Pero en toda realidad, si viste lo que pasó ahí, realidad no se mueve. Entonces solo estamos moviendo esta porción y porque siempre a la derecha de la sórdida porción, todo lo que tenemos que hacer es mover esto, luego agarrar esto y ya está en la posición que debe ser Entonces lo que hacemos es tomar esto y ahora lo comparamos y especie de hacer una burbuja ordenar al revés para averiguar a dónde debería ir. Entonces bueno, digamos, ¿se va? ¿ Es esto más pequeño que esto? ¿ Por qué? ¿ Ayer? Entonces tomamos esto y lo cambiamos con esto, y luego simplemente lo movemos de nuevo así? Y entonces lo que hacemos es hacer exactamente lo mismo. Agarramos esto, lo movemos y citamos uncomillas, sacamos esto y luego volvimos a insertar en esta sórdida matriz. Pero en código, simplemente lo guardamos aquí mismo, y lo cambiamos hacia abajo hasta que encontremos el lugar que necesita para ir. Entonces tomamos esto y fuimos como estos para intercambiar así, ¿ Es esto aún menos? Sí. Entonces bajamos esto, cambiamos esto hacia arriba, y luego cambiamos éste de vuelta a aquí, y luego hacemos exactamente lo mismo para terminarlo. Agarra estos, muévelo. Entonces, no, todo está en nuestra sórdida porción. Agarra. Esta es esta lección. Esto lo es. Entonces lo bajamos y luego tomamos este canje. Y esto no es menor que eso. Entonces terminamos con nuestro algoritmo de clasificación. Entonces echemos un vistazo a una visualización de cómo se hace esto en un poco de una escala más grande. Entonces solo tienes que hacer clic en el botón ir y verás que lo agarra, lo saca, y luego básicamente lo inserta en la sórdida porción. Por lo que está buscando a dónde debe ir. Insertado en lo saca. Si está en lo exacto ya está en los lugares correctos, ordénalo simplemente lo pone de nuevo y dice que no estamos ordenados, y luego los cambia hasta llegar al punto donde está ordenado. Y así lo hace todo el camino hasta que se haga. Simplemente tomando el 1er 1 cada vez y luego haciendo algo así como una especie de burbuja inversa para ponerlo en el lugar correcto y así se puede ver que tipo de combina como dije, selección ordenar porque tenemos una porción ordenada y sin clasificar y clase de burbuja, porque burbuja es como la estamos poniendo en estos lugares por aquí. Y así ahí lo tenemos. Ahora tenemos algoritmo surtido aquí mismo. Vamos a repasar el tiempo de ejecución. ¿ Cuánto tiempo tarda esto? ¿ Cómo se compara con los otros? Bueno, básicamente, esto va a ser casi lo mismo que la burbuja Sort. ¿ Y se puede pensar en por qué? Porque se escapa de burbuja Sort. Pero vamos a repasar sólo una diferencia clave, lo que en realidad hace que sea algo así. Entonces lo que tenemos aquí es que tenemos porción surtida y recuerda, con seleccion sort, se hizo a todos en cuadrado y la razón por la que salió a todos en cuadrados porque tenías que encontrar el mínimo. Tenías que encontrar el valor mínimo aquí a la derecha, y para hacer eso tomó cotización unquote en cantidad de tiempo, en promedio, promedio, alrededor de en más de dos, que sale a tiempo de fin. Por lo que tuvimos que buscar el mínimo. Y luego lo pondríamos en el lugar ordenado surtido sin tener que buscarlo . Porque es una vez que encontramos el mínimo, sabemos que es el siguiente paso lógico. Pero hacer eso por aquí lo hizo para que no importara si estaba arreglado o no, siempre salimos a terminar al cuadrado. Pero ahora si tenemos algunos números aquí, lo que esto hace es que nos permita realmente llegar a entrar, ah, un poco más rápido,en ah, un poco más rápido, un poco más rápido, mejor de los casos. Entonces si lo piensas, tenemos que tomar en cantidad de datos. Por lo que tuvimos que tomar en cantidad de datos en la cantidad de datos, y tenemos que compararlo en cantidad de veces. Um, porque tenemos que insertarlo por aquí. Por lo que lo máximo que podría tener que hacer es intercambiar en cantidad de veces. Y esto en realidad como en los otros ejemplos, sale a terminar más de dos. Pero los dos se quitan y sólo terminamos teniendo en cuadrado aquí mismo. Y así eso sale sobre el peor de los casos. Y el caso promedio aquí es que el promedio en el peor de los casos, siendo el peor de los casos que está completamente invertido. Y tiene que hacer el máximo fuera, que es este fin por en más de dos. Y el tipo de caso promedio es que tiene que hacer tal vez menos. Ah, trabajo. No tiene que ir siempre a la cantidad más lejana de swaps. A lo mejor le da suerte un par de veces y los coloca justo entonces es un poco menos que en cuadrado, pero sigue en el orden de en cuadrado, así que podemos poner a esos dos en nuestro gráfico aquí mismo. Por lo que el promedio está en cuadrado y el peor de los casos es en cuadrado. No obstante, le va un poco mejor en su mejor caso. Y echemos un vistazo a eso aquí mismo. Vamos a borrar. Esto no dibuja aquí. Vamos a borrar esto. Esto y esto y vamos a hacer esto ordenado. Entonces conseguimos este algoritmo y ya vino ordenado ya. Vino ordenado. Entonces lo que hacemos es agarrar el 1er 1 y nos insertamos aquí. Bueno, no hay nada que hacer. No hacemos ningún swaps. Entonces, ¿cuánto tiempo tardó eso? Bueno, se tomó esta operación para moverla y esta operación para comprobar si estos dos si éste es mayor que éste. Por lo que salió a dos operaciones volverían a hacer esa misma cosa exacta. Nosotros movemos esto, agarramos esto y lo movemos. Agarra esto y lo movemos y revisamos notas aún ordenadas. Agarra esto y muévelo y comprobamos nota, aún ordenados. Entonces cada una de esas veces sólo tomó dos, um, para especie de ciclos. Todo lo que teníamos que hacer era mover el movimiento el cursor. Entonces movimos el cursor y luego comprobamos, si mayor que y así cada vez. Eso son sólo dos operaciones. Lo que significa que siempre se está topando con operaciones. No importa cuántos extremos haya, va a ser 222222 Nunca va a escalar basado en extremos, por lo que eso significa que es tiempo técnicamente constante. Entonces ahora tenemos en cantidad de transferencias justo aquí tenemos en cantidad de transferencias, um, o en cantidad de datos. Supongo que podrías llamarlos con en cantidad de datos multiplicados por multiplicado por el tiempo constante . En su mejor escenario, lo que significa que nuestro mejor escenario de casos va a estar en realidad igual que el tipo de burbuja. Vamos a conseguir este mejor escenario de in, y eso todo se reduce al hecho de que cuando se ordena, sólo tenemos que hacer operaciones constantes. Cambiar esto sobre este derecho aquí se vuelve constante, en donde la selección ordenar. Esto fue siempre en más de dos, lo que significa que siempre saldría a terminar al cuadrado. Y así es la inserción ordenar en pocas palabras. Um, como dije, combina Theus motas de clase de burbuja y clasificación de selección, teniendo los desordenados y ordenados y luego burbujeando el número mínimo. Y luego se combina a este tipo de nuevo llamado Insertion Sort. Y sale a estos tiempos de corrida aquí mismo, que es idéntico al tipo de burbuja. Um, así que sigue siendo bastante lento. Por lo que estos son solo los sesenta base. Todos los científicos de computación básicamente nariz fuera de la parte superior de su cabeza estos tres tipos, y luego nos metemos en los más rápidos por aquí. Y estos son donde surgen algunas, como, realmente intuitivas realmente como, una especie de ideas inteligentes y empezamos realmente a mejorar los algoritmos de clasificación de comparación para hacerlos realmente rápidos demasiado rápido, culo rápido, como en iniciar sesión, y cosas por el 34. 5o 5 de orden: De acuerdo, entonces vamos a entrar o discutir sobre el primer algoritmo que va a ser más rápido que esos otros álbumes de los que hablamos. Entonces cuando miramos esos otros algoritmos tiempos de ejecución, notamos que en el peor de los casos, todos están al cuadrado. E incluso en el escenario de casos promedio, todos están al cuadrado, y uno de ellos es ligeramente más rápido en el mejor tiempo de ejecución. Pero eso si ya empezó. Entonces eso ni siquiera cuenta realmente, porque ese es uno de una cantidad infinita de casos. Entonces todo lo que realmente queremos mirar es por aquí, y vemos que todos están bastante mal. Y entonces lo que vamos a hacer va a mirar el siguiente paso en el tipo de algoritmo de clasificación evolución en. Vamos a entender una forma mucho más rápida de empezar en el tiempo promedio. Te darás cuenta de que un par de las otras partes siguen siendo las mismas. Pero nuestro tiempo promedio va a mejorar, y luego nos metemos en fusionar, ordenar. Vamos a poder mejorar todo con eso. Entonces lo que vamos a estar repasando en esta conferencia es de tipo rápido. Estaremos hablando de la intuición detrás de Quick Sort. Cómo funciona y opera en realidad. Y voy a estar haciendo un ejemplo al mostrarte paso a paso cómo sabes, funciona exactamente la ordenación rápida. Entonces haremos un poco visual, y luego la siguiente lección se repasará el tiempo de ejecución porque ambas partes son un poco complejas y en sus propios derechos. Y no quiero que sepas, como un video de 40 minutos sobre esto en una ruptura esto para que podamos entender cada parte individualmente. Entonces vamos detrás de la intuición para un ordenamiento rápido. Entonces sigamos adelante y creamos un bonito rayita aquí arriba. Vamos a hacer que sea un A. un poco más grande Está un poco demasiado cerca de la parte superior. Vamos a bajarlo sólo un poquito aquí. Entonces nos metimos en un rayo y hagámoslo, um, ocho grandes. Entonces solo seguiremos dividiéndolo por el centro aquí y ahora tenemos ocho spots diferentes y llenemos esto con estos números aquí mismo. Digamos 15 22 13 27 12 10 20 y luego 25. Adelante y arreglemos este 10 aquí mismo para que sea notable. Y así ahora tenemos nuestra matriz. Y entonces qué tipo rápido hace es que funciona en esta idea de algo llamado pivote. Entonces, ¿qué es exactamente un pivote? Un pivote va a ser el lugar como se va a separar. Entonces lo que estamos haciendo es crear sub A raise a partir de esta matriz. Entonces estamos aplicando el algoritmo de ordenación rápida a diferentes submatrices pequeñas, y luego vamos a seguir aplicándolo hasta que solo tengamos uno o dos, um, trozos de datos en nuestro aumento, y luego vamos a sacarlo todo . Lo que esto hace es que crea un enfoque de división y conquista para el programa que va a acelerar el tiempo de ejecución general. Y todo esto tendrá sentido a medida que empecemos a repasar esto un poco más y se empieza a entender una especie de cómo funciona exactamente esto. Y entonces el tiempo de ejecución explicará por qué es más rápido. Entonces, solo sigamos con esto por ahora y entonces ojalá tenga sentido a medida que lo atravesamos . Entonces lo que tenemos aquí es que vamos a elegir un pivote. Todo menos que el pivote va a entrar en la sub matriz izquierda. Todo menos va a ir a la izquierda y todo mayor de lo que va a ir a la derecha. Entonces, ¿cuál es nuestro pivote? ¿ Qué número vamos a elegir como nuestro pivote? Bueno, tenemos que pensar que esto está completamente, um, um, una especie de oculto para nosotros. No sabemos cuáles son ninguno de estos números. No podemos encontrar promedios ni medianos ni nada por el estilo porque está sin clasificar. Y podríamos, ya sabes, tratar de encontrar el número medio. Pero como dije, está desordenado, así que tendríamos que saber mucha más información y tenemos que ordenarla para encontrar el número medio para que no tenga sentido. Entonces lo que podemos dio es debilitar. Simplemente elige el pivote en función de la izquierda, Elemento más. Entonces en esta situación, lo que vamos a hacer es que sólo vamos a agarrar el pivote aquí mismo. Vamos a decir que es la izquierda, más elemento. Y ahora lo que vamos a hacer es poner todos los números que son menos que nuestro pivote a la izquierda, todos los números que son mayores que nuestro pivote a la derecha, entonces Lo que hacemos es tomar nuestro pivote y bajamos así Y así ahora está en el centro . Ahora, este pivote está en el centro, y por definición se va a ordenar porque todo a la izquierda va a ser menor que y todo a la derecha va a ser mayor que él. Entonces terminamos con ese número. Lo que necesitamos hacer ahora está separado para que tengamos esa sub matriz izquierda y tengamos ese resumen correcto. Vamos adelante y drawl son sub arrays en y vamos a buscar qué números son mayores o menos que así, Lo que tenemos aquí es que tenemos los números 10 13 y luego 12 puestos a la izquierda por aquí porque esos son todos los de los que son menos que eso. Entonces tenemos 10 13 12 y hay un montón de algoritmos diferentes para encontrar esto para buscar esto y averiguar qué es menos, podrías ir justo de izquierda a derecha, buscando los números que son menos que él. Entonces en esa situación, esto podría salir a 13 12 10. O podrías ir de derecha a izquierda o del pivote yendo a la izquierda. Y luego desde el pivote yendo a la derecha, Realmente hay un montón de maneras diferentes de hacer esto. Um, ¿a dónde va a ir con lo que sea que salga este algoritmo? Y esto es sólo porque va a probar un par de cosas A medida que pasemos, va a tener el más tipo de sentido. Entonces ahora tenemos a la izquierda. Aquí tenemos el 20 al 27 20 y luego 25. Por lo que todos estos números de la derecha son mayores. Todos estos números de la izquierda son menos entonces. Y ahora lo que hacemos es aplicar ese algoritmo a ambos una vez más. Entonces encontramos el pivote y en este caso, va a ser este número de la izquierda otra vez. Va a ser este número aquí y por aquí. Va a ser este número aquí mismo. Bajemos primero por el subárbol izquierdo, y esta es la idea de un algoritmo recursivo. Se va a abordar primero los subárboles izquierdos. Entonces va a volver arriba, va a abordar estos todo el camino hacia abajo. Entonces va a volver arriba y va a abordar el subárbol correcto a continuación. Y algún tratado significa que es el resumen separado, un resumen. Entonces lo que vamos a hacer es que nos vamos a encontrar un punto de pivote. Es ese 10 que acabamos de recoger. Entonces ahora esto va a bajar y vamos a tener un 10 aquí mismo. Y luego vamos a poner todos los números mayores que él a la izquierda. Todos los números menos que él a la derecha y tus letras que 10 en realidad es el mínimo aquí. Dolor izquierdo sub árbol no tiene nada técnicamente, en él. Entonces eso significa que estos son 10 en esta situación va a ser nuestro número más izquierdo, y luego en el subárbol derecho, donde vamos a terminar teniendo son los otros dos números, los otros dos números. Entonces vamos a tener un 13 y 12 por aquí, y luego por aquí, vamos a dividirlo una vez más, con 22 por estar en el centro. Entonces dibujamos cuando abajo y 22 va a ser nuestro nuevo número. Y hasta la izquierda de eso, vamos a tener 20 y 25. O en realidad, mi mal 25 es mayor que así que sólo vamos a tener 20 va a tener 20 por aquí, y luego a la derecha va a estar el resto de los números a la derecha va a ser 27 y 25 y entonces te darás cuenta que todavía tenemos un spot abierto en ambos. Por lo que veinticinco 27 25. Y todavía tenemos a un raid arrays que son mayores que uno. Entonces vamos a elegir otro punto de pivote para ambos aquí y aquí. Y entonces lo que vamos a tener va a tener nosotros mismos un 13 que baje y luego se fueron los 12 fantasmas. No hay nada en el sub array izquierdo. Entonces tenemos el 12 aquí, y luego hagamos exactamente lo mismo a la derecha. Aquí tenemos el 27 que va por abajo el 27 que va justo aquí, y luego el 25 estará a la izquierda de ella por aquí, que 27. 25 estará por aquí y entonces ese será técnicamente su propio sub array. Al igual Y entonces Ahora lo que tenemos es en realidad una matriz ordenada. No se parece. Pero tenemos una especie de rayo, porque ahora lo que hemos hecho es que todo tipo de esto se lleva a cabo dentro de la matriz de aquí arriba. Entonces ahora si rastreamos esto, tenemos el array ordenado desde el más pequeño el más grande. Tenemos el 10. Después bajamos y tenemos 12. 13 cuando volvamos arriba, Y entonces tenemos el 15 2022 25 27. Y también Ray se crea a través de este método aquí mismo. Y así vamos a dividirlo en los ocho originales que teníamos. Y así hagamos ese rastro sólo una vez más. Entonces vamos por el lado izquierdo por aquí, y lo que vamos a hacer es este es un algoritmo recursivo. Entonces lo dividimos por la mitad, y luego ahora dividimos este por la mitad y comprobamos. No hay nada a la izquierda. Nosotros revisamos. Aquí sólo hay un elemento, así que agarramos eso en eso, lo anotamos y comprobamos el lado derecho. Todavía quedan dos elementos, así que lo hacemos de nuevo, revisamos el lado izquierdo. Bueno, hay un elemento ahí ahora para que podamos anotar eso. Verificamos el medio. Ahí hay un elemento para que podamos anotar eso. Y ahora no hay nada más que revisar. No hay más pasos. Entonces vuelve a rastrear y luego revisamos el medio Ahora así hemos comprobado el subárbol izquierdo . Ahora revisamos el medio y nos tenemos un 15 y luego vamos adelante y revisamos el lado derecho. Y lo primero que una vez que lleguemos aquí es que siempre estamos revisando a la izquierda primero. Entonces bajamos aquí y hay un 20 por sí mismo. Entonces agarramos el número uno y está en nuestro rayo. Vamos cuando revisamos el medio, hay un 22 por sí mismo y luego revisamos el sub array correcto y todavía hay cosas aquí. Entonces aplicamos el algoritmo, bajamos por la izquierda y vemos que esto es todo por sí mismo. Entonces tenemos un 25 y en el medio también está por sí mismo 27. Y al final de aquí no queda nada. Entonces ese es el fin. Y tenemos una matriz ordenada. Entonces todo esto funciona fuera de este pivote desde el principio porque estamos dividiendo este problema en sub problemas. Y con estos sub problemas, lo dividimos en más sub problemas y más sub problemas hasta que bajamos a unidades de uno. Y luego una vez que hagamos eso por cómo está funcionando el algoritmo en su conjunto, todos se van a ordenar. Y entonces todo lo que tenemos que hacer es trazar este nuevo árbol que hemos creado, y vamos a estar repasando como, especie de rastros de árbol un poco más tarde. Pero imagina que todo esto está sucediendo en su lugar, lo que significa que no va a entrar. Crear estos metros en realidad es simplemente hacerlo todo dentro de esta matriz. Aquí arriba, notarás que una vez que hace todo esto, los está colocando en el lugar correcto conforme va bajando. Entonces va a empezar todo esto de izquierda haciendo este tipo de cosas. Entonces va a ordenar todo este correcto haciendo este tipo de cosas, y al final, va a verse así como una versión ordenada final. Entonces echemos un vistazo a esto visualmente, y creo que va a hacer un poco más desde entonces, así que estas grandes personas en visual go dot net han creado estos álbumes de clasificación que hemos estado usando. Si quieres echar un vistazo a algo de esto, asegúrate de ir a su página web porque proporcionan todo esto de forma gratuita. Por lo que hemos creado son ordenados. Ahora empecemos el orden aquí mismo, y notarás que lo que está haciendo es que está asignando un sub array. Por lo que eligió el uh tres por aquí como el punto de pivote. Y lo que está haciendo ahora es que va y está ordenando la sub matriz derecha y luego fuera ordenando el resumen izquierdo de estos nuevos pivotes ganará a través de esto y encontró un pivote. Y luego está ordenando el lado izquierdo, ordenando el lado derecho de ese pequeño lugar de caja que izquierda creativa encuentra que el pivote amarillo lo ordena. Ahora estamos ordenando el lado derecho, así que sólo nos especie de la izquierda. Ahora vamos al lado derecho y lo estamos ordenando por aquí, y, y, ya sabes, esto es un poco más complejo. En el ejemplo, me repasé, y eso es porque cuando realmente lo implementas en código, tiene que ser este tipo de formas para que Onley intercambie porque el cambio de Onley es muy, muy importante. Si creamos todos estos pequeños resúmenes, va a tomar espacio extra, tiempo extra y entonces realmente tendremos que hacer como rastros, que se sumarán al tiempo final. Entonces qué está haciendo aquí y podemos volver a jugar esto una vez más. Podemos crear uno nuevo aquí, y en realidad podemos entrar en los números con los que nos fuimos aquí mismo si queremos. Entonces dame un segundo y lo haré. Fue 15 que 22 13 27 que 12 10 2025 10 2025. Y luego podemos dar click. Ve aquí mismo. Y así ahora esta es la matriz que teníamos originalmente, así que veamos cómo lo hace. Estamos para hacer clic en el ir y luego ir a ordenar y hacer clic. Ve en este tipo, y así ya verás. Lo que está haciendo es que se escogió el 15 como el pivote, y está agarrando todos los números que son menos que y verás que se le ocurre este 10 13 12 también, porque está haciendo el cambio así que solo está agarrando todos los números . Hagámoslo una vez más. Se ve el 15. Es agarrar todos los números que son menores y cambiarlo al siguiente espacio disponible . Por lo que agarra el 13 1er y luego lo cambia al espacio. Eso es a la derecha del 15. Agarra el 12. A continuación se intercambia en el espacio que sigue en este sórdido lugar, que es 12. Y luego agarra el 10 y lo cambiará a este lugar y luego agarra esto y lo canjea al frente de esa lista. Entonces, como dije, un poco más complejo y cómo realmente lo implementa el código. Pero está haciendo exactamente lo que hemos hecho. Se creó este subárbol izquierdo este 10 13 12 y se creó este subárbol derecho este 22 27 20 y 25 y el pivote está por el centro y te darás cuenta de que el papel se volvió naranja , lo que significa que está completamente ordenado. Y ahora lo que está abordando es la tasa de subárbol izquierdo aquí, y notarás que justo lo que hizo ahí fue creado que dejó sub árbol y en realidad no pasó nada. El 13 o 12 dicen en el mismo lugar. Entonces bajó e hizo una variación más. Y luego se intercambian los 12 y 13 para ponerlos en el lugar correcto. Y ahora está abordando el sub árbol derecho por aquí, así que notarás que está haciendo exactamente los mismos pasos que nosotros. Es separarlo hacia abajo en esta tasa de variante aquí, intercambiando las posiciones y asegurándose de que esté ordenado. Y entonces ahora verás que todos los gráficos ordenados. Entonces esto es básicamente cómo funciona la orden rápida. Funciona fuera de dividirse en problemas cada vez más pequeños. Te da una forma más rápida de hacerlo, y vamos a ver exactamente por qué esto es más rápido en la próxima conferencia, donde vamos a hablar de tiempos de corrida. 35. 5a 6 tiempos de línea: Entonces ahora repasemos el tiempo de ejecución de este algoritmo que acabamos de hablar del algoritmo de ordenamiento rápido . Entonces, ¿qué tan rápido es este algoritmo? ¿ Qué? Tenemos que pensarlo así y esta va a ser la misma intuición para la siguiente donde discutamos Merge Sort. Y entonces lo que vamos a hacer es que vamos a romper esto, y esto va a ser como dije, el siguiente, el siguiente sí nos fusionamos, ordenamos. Va a ser una especie de la misma intuición. Pero siento que si repasamos esto dos veces seguidas, eso va a realmente una especie de cemento, y va a empezar a tener algún sentido. Entonces qué, esto es que estamos horneando, básicamente tomando este problema, y lo estamos dividiendo en un montón de especie de sub. tipo de problemas de Siri. Y la forma en que esto ayuda es que lo descompone en estos niveles aquí mismo. Y verás que en este nivel, cuando lo desglosemos y tengamos que hacer comparaciones se tocará a lo sumo en elementos, y creo que sale a terminar a comparaciones. Pero sólo lo dejaremos en n. Así que este nivel toma en este nivel aquí mismo lo tomará también. Y te darás cuenta de esto por la, um, especie de la forma en que esto funciona aquí es que va a tener que tocar. Y es un poco menos que en mientras bajamos por aquí. Y entonces este nivel aquí abajo va a tomar también. Y entonces lo que tenemos aquí es que tenemos un programa que lleva tres bien, lo que necesitamos mirar. Lo que necesitamos examinar es ¿cómo crece esto con el tiempo? ¿ Cómo funciona este número, la cantidad de extremos que podríamos incluso llamar a esta X? ¿ Cómo crece X de en? Porque una vez que encontremos la respuesta a eso, una vez que entienda cómo crece este número, entonces entenderá el tiempo de ejecución de este algoritmo. Y entonces lo que podemos hacer es simplemente pensar en esto lógicamente. ¿ Cuántos tenemos aquí? Teníamos ocho variantes diferentes aquí. Entonces lo que hicimos fue en el mejor de los casos, nos teníamos ocho en la parte superior. Entonces, como ocho tipos diferentes de partes a esto, o en realidad podemos hacer este tipo inverso de cómo funciona esto. Empezamos con ocho y luego lo que hicimos fue dividirlo en dos grupos de cuatro y lo dividimos en dos grupos de dos. Y luego dividiste eso en unos y notarás que eso es lo que esto emula aquí mismo es que teníamos el ocho. Lo dividimos en aproximadamente dos grupos de cuatro. Y luego porque el pivote está involucrado, es un poco menos en el lado izquierdo, y como que va hacia abajo desde ahí. Pero mantiene esa forma general, ese tipo general de forma donde va a estos diferentes niveles. Y entonces, ¿cuántos niveles teníamos? ¿ Qué? Teníamos uno también Tres niveles antes de llegar a todos y el programa terminó. Entonces eso significa que a las ocho nos tenemos tres. Ahora bien, ¿cuántos tendremos si empezamos con 16 por ejemplo? Para que realmente podamos hacer aquí es podemos resaltar estos y vamos a seguir adelante y eliminarlos . Y luego duplicemos esto aquí mismo. Entonces vamos a agarrar todo esto aquí mismo. Control CND. Vamos a agarrar esto. Vamos a moverlo a la derecha. En realidad, muévalo hacia aquí y agarraremos este y lo bajaremos también. Simplemente seleccionándolos todos, tratando de ahorrar un poco de tiempo aquí. Y así lo que tenemos es que tenemos estos dos pequeños subconjuntos de ocho. Y así esto es sólo un 16. Eso agregó. Entonces todo lo que hizo fue que acabamos de agregar un nivel adicional. Lo vendimos después de todo ese trabajo ahí de copiar y pegar. Y todo lo que realmente hicimos fue añadido un nivel más. Y ese es el nivel de ocho. Por lo que tenemos en, en también. Y así lo que tenemos aquí es, tenemos Si tuviéramos 16 tenemos cuatro. E imagina si volviéramos a hacer esto. Si copiamos y pegamos esto tanto a la derecha como a la izquierda y luego solo agregamos el siguiente nivel de 32 bien, eso nos pondría 32 igual a cinco y 64 equivaldría a seis. Y 128 equivaldría a 12 o a mis matemáticas 12 con igual siete y así sucesivamente y así sucesivamente y así sucesivamente. Entonces lo que eso significa es que el número de niveles recuerdan, Eso es lo que estamos tratando de encontrar Esta X tasa aquí, el número de niveles realmente crece. A cierto ritmo, crece cuando esto se duplica cada vez. Por lo que crece a un ritmo exponencial inverso, lo que significa que la distancia entre estos dos la distancia entre cómo los números Maney que tenemos va poco a poco va a hacerse cada vez más grande y más grande. Por ejemplo, aquí dentro tardó ocho aquí arriba. Nos costaron ocho números de Dittemore para conseguir otro nivel aquí. Se necesitó 16 para conseguir un Nivel 32 para subir a ese nivel 64 para subir a un nivel 128 para conseguir otro nivel, y esto saldrá hacia el infinito. Entonces lo que tenemos es que tenemos una especie de gráfico que se ve así. Un gráfico que se ve así a lo largo del tiempo. Y ya hemos hablado de esto antes. Vamos a hablar de ello en especie de fusión. Este gráfico se inicia sesión, por lo que la cantidad de niveles la cantidad de veces que tenemos que aplicar es iniciar sesión. Entonces eso significa que nuestra ecuación recuerde nuestra ecuación fue esa X, que es cuántos niveles de en tenemos. Ese es el X Times. Cuántas veces tenemos que hacer en en realidad sólo va a salir a iniciar sesión de n o mejor manera. Por lo general se pone es así. Por lo general se escribe la notación estándar para esto está en ley de nuevo o log tiempo lineal. Por lo que tenemos log tiempo lineal. Y así esto fue para el mejor de los casos. Pensamos, si se dividía justo por el medio, tenemos este log tiempo lineal, y así es exactamente como sale esto es que tenemos para el mejor tiempo de ejecución que tenemos en iniciar sesión. Y entonces ahora pensemos en esto para el tiempo promedio de ejecución. Bueno, el tiempo de ejecución promedio va a asumir, en promedio que vamos a elegir un punto de pivote que en algún lugar cerca del centro. Entonces, en promedio, si hacemos todas las matemáticas fuera, va a llegar exactamente a lo mismo que va a llegar a entrar iniciar sesión. Pero, ¿qué pasa con el peor de los casos? ¿ Cuál sería el peor de los casos? Bueno, el peor de los casos sería que creáramos esta gráfica aquí mismo, excepto que no se divide uniformemente cada vez que es 15 por aquí, lo que significa que esto es por ejemplo, Ah uno y está por aquí. Tenemos que dividirlo otra vez. Entonces, sólo tratemos de mirar eso. Mira un poco el peor de los casos aquí. Echemos un vistazo al peor de los casos aquí. Entonces tenemos un 16 y lo dividimos mal. Elegimos un punto de pivote donde todo era mayor que el punto de pivote o todo era menor que el punto de pivote. Entonces elegimos esto. Y en lugar de tener este resumen por aquí, no tenemos nada por aquí. Entonces solo tenemos y en menos uno, tenemos exactamente la misma matriz aceptada solo una última. No nos ayudé en absoluto. Entonces si seguimos haciendo eso, si seguimos eligiendo la menor o la mayor cantidad de las sub matrices no íbamos a conseguir esta relación donde dividimos este problema en estos pequeños sub componentes y bajarlo al mínimo número de niveles finales. Y vamos a repasar qué significa exactamente eso. Entonces elegimos un punto de pivote donde 15 de ellos eran menos y solo uno era mayor que bien, éste ya no se puede dividir. Por lo que tenemos que sumar un nivel aquí. Y así elegimos un punto de pivote donde 14 del lado izquierdo o menos. Y uno de aquí fue. Y 13 y uno y 12 y uno. Y podemos seguir adelante con esto. Podríamos ir 11 y, um, 11 y uno, 10 y uno. Y estoy haciendo esto este tipo de exhaustivamente aquí para mostrarles algo. Ocho y 17654321 ¿Y cuántos niveles terminó siendo esto cuando lo dividimos de esta manera horrible? Lo que conseguimos fue metido en, en, en, en, en, y sólo mantenerlo en marcha. Tenemos todos estos fines cada vez porque no es así. Fue más rápido debido a esto. Todavía tiene que tocar todos estos elementos. Entonces lo que terminamos consiguiendo aquí fue 123456789 10 11 12 13 14 15 o aproximadamente por los 1 1 16 extremos. Entonces en esta situación, realmente llegamos a la derecha entre en menos uno y en niveles, porque podemos como que simplemente olvidarnos de la N menos una parte. Entonces eso significa que en esta situación, si vamos en el peor de los casos, vamos en el peor de los casos. Entonces este de aquí arriba es el mejor y el caso promedio, el peor de los casos va a ser ah, todo mucho diferente. En el peor de los casos escenario son x la cantidad de niveles igual en. Y así ahora empiezas a ver lo que estamos pasando aquí. Si X y en son la relación aquí y nuestras ex águilas en, eso significa que tenemos en tiempos en los que tenemos en tiempos en nuestro peor escenario. Y eso significa que nos estamos metiendo al cuadrado. En nuestro peor caso, hemos elegido un punto de pivote donde cada vez que no se rompía de manera uniforme o incluso cerca de uniformidad, porque en nuestro caso promedio, esto podría ser un seis, y esto podría ser un 10 . Ya sabes, esto podría ser en lugar de cuatro patas, podrían ser dos y seis o algo así. Podrías romper bastante cerca, y podríamos simplemente agregar uno o dos extremos a esto. Todavía es básicamente como un inicio de sesión, pero en el peor de los casos escenario y cosas junto al peor de los casos básicamente está en . Es básicamente este fin de los tiempos y relación, y eso significa que en nuestro peor de los casos, nos metemos al cuadrado. Y así al final aquí, notarás que nuestro peor caso no mejoró. Nuestro peor caso sigue en cuadrado. Tenemos mucho mejor de un caso promedio, y esto es algo muy importante. Este parece, um, um, parece más lento, lo cual supongo que técnicamente lo es. Si la matriz ya está ordenada, sin embargo, no tratamos con un aumento que ya esté ordenado. Hay una razón por la que entró en el algoritmo de clasificación. Por lo general esto es Onley, pues si ya estaba ordenado, seguiría funcionando así. O si elegiste el punto de pivote perfecto, supongo, está en esta situación. Y este es el elegido una especie de cercano al punto de pivote, por lo que esto podría verse peor, pero sigue estando perfectamente bien en derecho otra vez. Esto sigue siendo uno perfectamente fino, y estos dos realmente no tienen sentido donde ambos están perfectamente ordenados. Pero nuestro tiempo promedio es mucho más rápido aquí. Esto es Esta es una enorme diferencia aquí en cuadrado un final Así que si a largo plazo , si empleas esto, ahorrarías como dije una tonelada de tiempo porque el caso promedio sería lo que saldría la mayoría de las veces. A veces saltas aquí, a veces saltas aquí, pero todo promedio fuera justo en el medio aquí para que puedas ver que este es un tiempo de ejecución más rápido . Pero no queremos que suceda este dedo del pie, porque incluso una vez donde podría suceder en el en cuadrado, podría ser suficiente para chocar nuestro programa. Podría ser demasiado grande para nuestro programa. Un mango tal vez se ejecutará en un recuerdo en esa situación. A lo mejor el poder de procesamiento golpearía 100 no sería capaz de ejecutar. Entonces lo que queremos hacer es que queremos garantizar que esto va a estar en iniciar sesión, y ahí es donde vamos a saltar a fusionar, ordenar, lo que nos va a permitir tener esta garantía. Y te explicaré que cuando lleguemos a la próxima conferencia 36. 5a 7 de la fusión: Entonces ahora repasemos un algoritmo que es incluso más rápido que los otros algoritmos que hemos cubierto. Y eso es fusionar, ordenar y Merge Sort hace una especie de algoritmo intuitivo Ryker Zhen para hacerlo más rápido. Vamos a repasar exactamente cómo hace eso. En realidad vamos a estar dividiendo este en dos videos, uno en la intuición detrás, porque es un poco más complejo y uno en los tiempos de corrida, porque eso también, es un poco más complejo y necesita su propio tipo de explicación. Entonces empecemos. Vamos sólo a la intuición, y luego veremos un modelo visual de la misma funcionando también. Entonces la forma en que se fusionó o funciona es que toma los datos por lo que toma la matriz, y luego lo divide en pequeños sub arrays. Entonces, por ejemplo, lo que hacemos es llevar a este Ray aquí arriba y digamos que solo hay cuatro elementos de 7 10 9 y ocho, y lo que hacemos es separar los abajo a una columna izquierda y una derecha. Entonces lo que tenemos aquí es que tenemos un siete y es 10 excepto lo que es mantener el color consistente aquí mismo. Y vayamos así. Entonces tenemos 1/7 un 10 y luego a la derecha aquí tenemos otro sub array. Notarás que no hacemos nada sin hacer ninguna clasificación a este paso. Simplemente lo estamos dividiendo en sus pequeñas sub matrices así. Y entonces lo que hacemos es repartirlo de nuevo hasta que estén justo en cajas que son completa y totalmente independientes unas de otras. Entonces siete, 10 98 Y entonces lo que hacemos con esto es que lo recombinamos. Volvemos a combinar estos dos en una nueva matriz de dos, y volvemos a combinar estos dos en una matriz de dos. Y podría estar pensando: ¿ Qué? Acabamos de separarlos. ¿ Qué vamos a hacer cuando los recombinemos? Aquí es donde realmente se lleva a cabo la clasificación. Entonces quédate conmigo. Aquí, vamos a hacer es vamos a crearnos un cursor a la izquierda y un cursor a la derecha. Y a este paso, no tiene mucho sentido. Pero cuando nos metamos en los más grandes, empezará a tener sentido. Entonces tenemos una maldición a la izquierda. Tenemos un cursor a la derecha, y lo que vamos a hacer es llevarnos esos y vamos a comparar esos números. Por lo que ahora mismo, el cursor de la izquierda apunta a un siete, y el cursor de la derecha apunta a un 10. Entonces, ¿cuál de esos es más pequeño? Bueno, el siete es más pequeño, así que va primero, y luego el 10 es más grande que eso. Entonces va a continuación. Estamos en exactamente lo mismo de la derecha. Por aquí, el ocho va primero o y después el o en esta situación, el ocho estaba a la derecha. Entonces en realidad es azul. El ocho va primero, y luego el nueve va justo después. Ocho va 1ra 9 va justo después. Y sé que eso no tenía mucho sentido. Entonces hagámoslo realmente que tenga sentido. Tiene más sentido cuando en realidad tenemos elementos mawr para especie de pista aquí mismo. Entonces ahora lo que tenemos es que lo tenemos combinándolo de nuevo hacia abajo en su matriz final. Entonces vamos a seguir adelante y crear esos cursores una vez más. Tenemos uno que apunta a la izquierda y otro que apunta a la derecha, así. Y lo que hacemos es tomar estos números y comparar los dos cursores. Por lo que el primer cursor apunta a siete en el momento actual. Entonces está apuntando a un siete, y el siguiente cursor apunta a un ocho. Tomamos estos dos y los comparamos bien. Estos siete es el más pequeño, por lo que ponemos eso en el primer lugar de la matriz. Ahora lo que hacemos es tachar ese número. Ya no lo usamos. Tomamos el cursor y lo movemos al siguiente elemento de cualquier matriz que se acabara de usar. Entonces desde que se fue, se utilizó Array, estaban tomando el cursor rojo, y lo estamos moviendo hacia la derecha. Y cuando lo movemos a la derecha, entonces ponemos el nuevo número. Entonces en esta situación es un 10. Entonces lo ponemos en el nuevo número. Agarramos ambos los números y volvemos a revisar. ¿ Cuál? ¿ Más pequeño? Bueno, ahora es el lado derecho. Entonces vamos adelante y estamos justo en el lado derecho. Cruzamos este número movimos el cursor sobre y luego rehacemos las comparaciones. Ahora el lado derecho es un nueve. Entonces ponemos un nueve y luego ponemos el último elemento de los 10 de la izquierda aquí y te darás cuenta durante este paso corrimos. Cuántas veces en tiempos y durante esto que corrimos sobre Lee en el tiempo, no corrimos en cuadrado ni nada por el estilo, porque todo lo que hicimos fue simplemente mover el cursor. Tocamos los siete una vez, los ocho una vez, los nueve una y los 10 una. Y luego los tocamos de nuevo. Entonces fueron sólo dos de estos extremos, y esto va a empatar en el tiempo de ejecución más tarde. Pero sólo ten eso en una especie de mente porque va a como dije más adelante, cuando lo hagamos, el tiempo de ejecución de todo esto va a empezar a tener un poco más de sentido. Pero hagamos un ejemplo más grande. Digamos que hemos bajado al paso final de 24 por cuatro matrices, así que tenemos que cuatro por cuatro elevar aquí y nos hemos metido en el paso final, lo que significa que todos estos están ordenados en este punto, igual que aquí. Estos se ordenan de los más pequeños a los más grandes, pero no están particularmente ordenados por completo. Entonces lo que vamos a hacer es que vamos a llenar estos números. Digamos que este es un 13 15 16 on digamos que éste es 10 11 14 17 como así Y entonces lo que vamos a hacer es realmente vamos a hacer exactamente lo mismo que hemos hecho antes. Entonces entró esto. Teníamos que submatrices combinadas hacia abajo en esto, y ahora tenemos que ordenar un aumento. Y así lo vamos a hacer es que los vamos a combinar aquí mismo, y vamos a hacer una matriz final. Eso es todo el camino grande. Entonces es el tamaño original aquí, que fue el total 19, o la noche en el 19 los ocho totales 123456 que necesitábamos para volver a comprar esto. Y entonces ahora lo que vamos a hacer es que nos metamos exactamente el mismo método que antes. Vamos a agarrar un cursor izquierdo, vamos a agarrar un cursor derecho, y estos son sólo analizar las matrices, y estamos comparando para el que sea el más pequeño. Entonces tenemos justo aquí tenemos el uno y el 10 siendo comparados con el momento actual. Y así vamos a subir esto. Entonces tenemos algo de espacio cada vez que estos desaparecen. Pero eso, como, aquí mismo. Entonces estamos comparando el de cada 10. Bueno, obviamente uno es más pequeño. Entonces el que entra aquí en el primer lugar. Vamos adelante y tachamos el uno y luego movemos el cursor por uno. Y entonces ahora comparamos los tres comparamos los tres y los 10. Bueno, tres aún es más pequeño, así que puse los tres ahí dentro. Lo tachamos y movemos el cursor hacia el 15. Al igual y ahora podríamos hacer una comparación una vez más. Bueno, ahora el lado derecho es más pequeño. El 10 es el más pequeño, así que vamos adelante. Ponemos el 10 aquí, tachamos y nos movemos. El 11 es ahora el más pequeño porque el siguiente número por aquí es el 11. El 11 es ahora más pequeño. Entonces puse el 11 ahí dentro. Vamos a seguir haciendo este proceso una y otra vez hasta llegar al final. Pero yo quiero como que pase por todo el ejemplo. Entonces, ¿entiendes qué exactamente estamos haciendo aquí? Realmente te ayudará a conseguir la intuición lo que te ayudará a entender el tiempo de ejecución un poco más tarde. Entonces ahora tenemos 14. 14 y otra vez la más pequeña. Entonces seguimos adelante y hacemos exactamente los mismos procesos que antes, cruzando, moviendo el cursor sobre. Y entonces ahora tenemos un 17 por aquí. Y así entonces hacemos una comparación por el lado izquierdo. Bueno, el 15 ahora es el más pequeño de los 15 entra aquí. Cruza, muévete. Ahora tenemos 16 Versículo 17. El 16 es el más pequeño, por lo que el 16 se coloca aquí. Se tachan, se tachan, y luego se mueve el cursor. Pero hay un caso especial aquí mismo es que cuando el cursor se mueve más allá y entiende que está al final del rayo, no hay nada del año pasado,ya sabes, ya sabes, no hay nada que pueda agarrar aquí una vez que se pone a este punto. Lo que hace es que sólo copia el resto de lo que sea por aquí. Entonces en esta situación sólo tenemos un elemento. Simplemente copia el 17 sobre. No obstante, en algunas situaciones no será tan fácil tendrá. A lo mejor un 17 18 1920 por aquí. Y así no seguimos comparándolo. Una vez nos quedamos sin uno de los lados porque ya no hay nada que comparar. El precio está terminado, así que lo que haremos es realmente bajaremos y solo copiaremos el resto de la otra tarifa porque ya ordenados. Entonces sabemos que el resto de este lado va a ser mayor que cualquiera de los números de aquí . Y tal es algo a tener en cuenta es que en algún momento te quedarás sin una matriz pero aún así tendrás tres o cuatro elementos en el otro camino. Y eso sólo significa copiar los elementos por todas partes a la derecha final. Y ahora lo que tenemos es nuestra matriz ordenada. Entonces esa es la intuición detrás de house merge sort works. Tomas un número y lo divides hacia abajo y eres cursivo. Lee. Dividirlo hasta llegar a un punto en el que solo estás en unos aquí abajo y el algoritmo sí no suele dividirlo así que sólo entiende que 012 y tres todos van a ser entidades separadas pero la forma humana de hacerlo es nosotros tienen que hacer estas divisiones. El equipo tiene una forma un poco más rápida de solo adivinar todo esto, pero eso realmente no importa. Eso es algo que en realidad es muy fácil de implementar código cada vez que busques el código para emerge sort. Pero así es como funciona y los que llegamos a nuestro paso final de fusión. Creamos nuestros cursores pequeños, y luego solo comparan de ida y vuelta y te darás cuenta de que incluso en esto donde se comieron , sólo se necesitaron ocho intentos diferentes porque todo lo que hicimos fue fuimos uno de lo que nos movimos tres. Por lo que no lo hará 13 10 11 15 16 17 Sólo tocó todo en varias ocasiones. Por lo que incluso a este paso estaba dentro. Y como dije, esto va a venir en una especie importante de un poco más tarde cuando realmente nos fijemos en el tiempo de ejecución . Pero ahora veamos una visualización de cómo podría funcionar esto por una computadora. Entonces sigamos adelante y creamos aquí una matriz sin clasificar y empecemos. Y esto es usando merge sort, y vamos a seguir adelante y hacer clic en el botón ordenar y luego ir y luego verás que lo que hace. ¿ Es primero separa esta imagen. Estos lados y lo que está haciendo es que en realidad se está separando. Vamos a frenar esto un segundo. Lo que está haciendo es separarse en dos, clasificarlos, separarse en el siguiente para clasificar esos y luego cuatro. Y luego haremos exactamente lo mismo al siguiente. Entonces también dos lo convierte en cuatro aquí mismo. Y luego va a ordenar los ocho aquí mismo. Entonces esto es recursivo Lee entrando. Entonces lo que hace, en realidad empezó dividiendo esto por la mitad, y luego bajó hasta llegar a estos dos aquí mismo, algo así como en este ejemplo. Se puso todo el camino a aquí mismo. Después empezó a ordenarlo hacia arriba, y eso es lo que está haciendo ahora mismo. Ahora está ordenando la mitad izquierda de esto, y lo está haciendo todo ordenado. Y entonces comienza la mitad derecha. Por lo que se necesita el 1er 2 números. ordena. Entonces toma los siguientes dos números y los ordena. Y entonces ahora tiene dos conjuntos de dos. Entonces ahora pueden establecer estos porque ahora son exactamente iguales. Por lo que los compara y los almacena de nuevo, sólo agarrando al menos uno de cada lado lo vuelve a poner arriba, y ahora tiene cuatro que se ordenan para que se mueva al siguiente spot. Y a pesar de que hay tres, no siempre tiene que ser perfectamente simétrico. Se puede tener un número impar y aún así tener este trabajo. Se va adelante y separa thes que tipo de retroceso hacia abajo, y luego elige la menor cantidad y crea sitio surtido a la derecha. Y luego lo hace. Una final después de que esto se haga, vuelve a poner todos estos y luego ahora tenemos dos sets de ocho con este 17 pero eso es lo más cerca de ocho como podemos conseguir. Y luego empieza a ordenar esto para la clasificación final, y ahora te darás cuenta de que agarra la menor cantidad de cada lado. Ve y agilice esto. Si en realidad puedo hacer click en esto, vas ahí mismo y luego solo se va a un cabezazo y lo vuelve a poner todo junto. Entonces esa es la intuición. Es así como funciona el orden de fusión. Saltemos a la siguiente conferencia. Estamos hablando del tiempo de ejecución y ¿por qué, exactamente? Esto es más rápido que los demás. 37. 5a 8 tiempos de ejecución de la orden: Por lo que en la última conferencia, hablamos de la intuición detrás de Merge Sort. En esta elección, vamos a estar repasando el tiempo de ejecución. ¿ Cuál es el tiempo de ejecución de este tipo y por qué es más rápido que otros tipos? Bueno, para hacer eso, necesitamos entender de qué estaba hablando en la última conferencia, que fue en cada uno de estos pasos. ¿ Cuántas veces o cuántas operaciones no necesita hacer? ¿ Cuántas comparaciones estamos haciendo? Y eso siempre sale a terminar porque estos cursores trabajando en dos lugares diferentes aquí sólo van a ir 1234 Y entonces vamos exactamente de la misma manera que agarró el siete que el ocho que el nueve. El 10 va a estar en cada uno de estos tiempos, así que sabemos que la base de nuestro tiempo de carrera aquí va a estar dentro. Pero, ¿cuántas veces hacemos en lo que se va a multiplicar por? Y esa es la clave para este tiempo de ejecución. Entonces echemos un vistazo a la que teníamos aquí y sólo podemos ver eso en cuatro con cuatro con cuatro. Se necesitaron dos extremos separados para llegar a ese punto. Entonces, ¿cuántos extremos había? ¿ Lo hará? Cuatro. Había dos, y entonces ¿cuántos serían a las ocho? Hagámoslo. Digamos que tenemos. Llegamos a la parte donde se está combinando, que son ocho pequeños diferentes. A ver. Es ese 812345678 Y luego los vamos a combinar en un montón de dos y luego combinar esos en vigor y luego combinar eso de nuevo en un ocho. Entonces cada uno de estos pasos es este paso por aquí sólo con ocho en lugar de cuatro. Entonces se reduce a algo que se parece a esto, y luego podemos ver que va a haber dentro aquí va a haber un final aquí, aquí y luego aquí para la combinación final. Entonces con ocho, tenemos tres extremos que tenemos que usar. Bueno, ¿cuántos habría por 16? Bueno, si lo piensas 16 todo lo que va a hacer se va a añadir una capa separada a esto . Entonces en lugar de estos muchos los vamos a tener. Entonces en lugar de estos muchos, vamos a tener un duplicado de esto. Entonces veamos si no podemos duplicar esto. Vamos así y vamos a sacar esto del camino y vamos a agarrar. En realidad, podríamos agarrar todo esto. Vamos a agarrar todo el asunto y duplicarlo y luego moverlo a la derecha por aquí. Entonces ahora hay 16. Ahora tenemos dos juegos de ocho, y luego bajamos y todo lo que tenemos que hacer es un cálculo más aquí para conseguir el 16 original. Entonces, ¿qué nos consiguió duplicar el tamaño? Bueno, sólo nos metió uno más y sólo nos metió uno más. Y esta intuición va a lo largo de todo el proceso. Si vuelves a duplicar esto, el 32 que sólo va a tomar 5 64 sólo va a tomar un adicional, lo que significa que 128 sólo va a tomar siete. 2 56 sólo va a tomar ocho, 5 12 sólo va a tomar 9024 sólo va a tomar 10 y así sucesivamente y así sucesivamente y así sucesivamente. Y entonces lo que ves es que aquí hay esta diferencia. Esta diferencia clave es que cuanto mayor sea el número, menor cantidad de pasos se va a dar de manera real y predecible. Va a ser ¿Recuerdas esa exponencial reversa de la que hablamos antes? Ese log of in well, eso es exactamente lo que resulta ser el runtime es que con el tiempo, como en se hace más grande y más grande la cantidad de veces que tenemos que hacer esto en operación cantidad de veces. Tenemos que hacer esto porque lo estamos dividiendo por la mitad sobre Lee sube por un pequeño margen para que podamos llegar a un punto en el que estamos duplicando esto y se puede ver que tiene que haber 512 números adicionales que sumen otro. Entonces eso significa que la cantidad de extremos que estamos usando se va a multiplicar por no interrogación, sino por iniciar sesión. Entonces que todo se suma a eso todo se suma al hecho de que vamos a tener un resultado final de en tiempos iniciar sesión. Y eso significa que no importa cuán grande o pequeña sea esta matriz, ya sea ordenada o sin clasificar, siempre vamos a hacer exactamente la misma operación. Esto podría estar llegando. Ven a nosotros completamente ordenados o lo más desordenados posible, Y no importaría. Seguiríamos haciendo exactamente las mismas operaciones aún estar en cada uno de estos pasos. Y eso significa que no solo es el mejor caso iniciar sesión es el caso promedio en iniciar sesión. El peor de los casos va a estar en logueo porque, como dije, podría estar completa y totalmente, um, sin clasificar. Y no importa porque vamos a exactamente los mismos pasos cada vez. Esto podría salir a nosotros al 789 10 y aún así lo rompíamos y haríamos las pequeñas comparaciones. Esto podría llegar a nosotros como 10 987 y aún así lo dividiríamos en el número exacto de comparaciones. No habrá cambio dependiendo de los números, lo que significa que los tres van a ser idénticos entre sí, y por lo tanto esto lo convierte en el algoritmo más rápido porque ahora no solo es nuestro más rápido e inicia sesión es nuestro promedio en iniciar sesión, Pero por primera vez, nuestro peor caso es en iniciar sesión. Ahora somos capaces de comprobar esto y entender que Incluso en el peor de los casos, siempre va a estar en log in, que es sustancialmente más rápido que estos de aquí. ¿ Recuerdas esa gráfica que mostramos en el inicio mismo de esto? El curso de esta cosa es que en cuadrado subirá a una línea recta, will in log in será el ángulo entre estos dos se pondrá cada vez menos. Y así ponemos un 1,000,000 en éste en un 1,000,000 en éste, los resultados serán noche y día. Este tomará semanas, mientras que éste podría tardar unos minutos a tal vez una hora. Y ese es el poder de simplemente pensar en esto. Porque ahora podemos usar estos otros algoritmos de clasificación. ¿ Por qué alguna vez implementaríamos estos cuando podemos implementar un algoritmo de clasificación? Esa es tasa aún más rápida aquí, una que está garantizada para entrar iniciar sesión. Y así con estas comparaciones fuente, en realidad podemos llegar a un tipo final de, um, pedazo de información de todo esto y aquello. Es que lo más rápido que jamás podrás hacer una comparación ordenar un tipo de comparación, lo que significa que en realidad estás comparando los dos números entre sí ordenar de comparación que lo más rápido que jamás puedas hacerlo es en realidad de nuevo en la ley. No hay comparación más rápida ordenar ahí y por comparación, ordenar quiero decir, ya sabes, tienes 2468 Y para ordenar esto estás comparando Thies este número con este número o este con ese número o este número con esta maderera, estás comparando dentro de sí mismo. Y así lo más rápido que jamás podrás hacer eso en es en iniciar sesión. Por lo que esto se convierte en el más rápido de esos algoritmos. Hay otro ritmo de clasificación más rápido, pero toman mucha más intuición y entran en especie de análisis del número en sí para averiguar a dónde va sin compararlo realmente con otros números. Es un poco complejo, y podemos tocarlo un poco más tarde. No obstante, como dije, sigue siendo bastante complejo. Entonces todo lo que tenemos que entender realmente para la base de la informática es la comparación sort y tenemos que entender que lo más rápido que podemos conseguir es entrar y fusionarnos. SORT nos consigue que al usar esta intuición de romper todo en mitades para que nuestro programa solo escalas de por extremos, tiempos log Evans y eso nos consigue este tipo rápido de algoritmo de in log in que es merge sort realmente, realmente una especie de diversión, tipo de pasar y algo que es realmente poderoso en la ronda de ciencias de la computación. 38. 5-9 estables y no no estables: Entonces vamos a discutir una cosa final con algoritmos de clasificación, y eso es si un algoritmo es estable o no estable. Entonces, ¿qué significa exactamente esto? Bueno, lo que significa es, si empezamos un algoritmo que se veía así, digamos que tenemos son una matriz que se ve así. Digamos que teníamos uno demasiado cinco a eso. Siempre pasaría que esto a aquello. Estos dos de la izquierda vendrían antes de esto, también. Por lo que podríamos pensar en ello así. Podríamos decir que esto es a una y esto es para ser Y así necesita dedo siempre sucede que cuando se construye la matriz final, cuando se construye la matriz final, que resulta que es de uno a un ser cinco así de ninguna otra manera, si sale que llega a ser y luego a un que es una especie inestable, eso significa que los dos valores idénticos no se mantienen en el mismo lugar, por lo que perderíamos el tipo original de importancia de la posición pero relativa a uno otro. Y esto podría ser importante. Por ejemplo, esto podría ser tal vez gente que está esperando en una fila o algo así y que una persona salte al frente, la otra persona, sólo porque tengan el mismo nombre no tiene mucho sentido . Y, ya sabes, podría meterse en cosas más importantes también. Pero esa es una especie del ejemplo que me vino a la mente. Por lo que muchas veces, o al menos a veces, la estabilidad importa. Entonces miramos nuestros algoritmos ¿cuáles son estables? Bueno, eso en realidad se reduce a esto. El tipo de burbuja es estable porque cada vez que intercambiamos, los valores sólo estaban intercambiando valores relativos uno a otro reunión de que un dos nunca va a intercambiar con otros dos, y no puede saltar ni caer detrás de los otros dos o del otro valor idéntico de cualquier manera. Por lo que la clasificación de burbujas sale a ser estable. Tienda de inserción sale para ser estable y fusionarse. Sort sale a ser estable. Y no voy a repasar exactamente por qué son estos. Estos tres son estables, pero solo entiendan que en su tipo de implementación, se resuelve que son estables. De lo que vamos a estar pasando es de los a que no son estables. Estos dos de aquí no son estables. Y la razón de esto, por el tipo de la explicación de esto significa que estos dos ustedes sabrán, pueden quitar orden. Pueden destruir esto. Donde estar vendrá antes a un ahora, en este tipo de unidad gráfica dijo 1225 No importa qué aire sea. Todavía es cotización unquote ordenada. No obstante, si es uno para ser a un cinco, entonces no se estabiliza ordenada. Entonces repasemos aquí nuestro primer ejemplo. Vamos a repasar clasificación de selección. Recuerda cómo la clasificación de selección agarra el número más bajo y luego lo cambia con el primer espacio disponible. Entonces vamos a repasar un contador Ejemplo de un ejemplo que muestra la falta de estabilidad. Y todo lo que necesitamos para esto en realidad son solo tres columnas de matriz aquí. Y entonces lo que tenemos aquí es que vayamos con dos y pondremos el pequeño A aquí a B y luego uno justo aquí. Y entonces lo que hacemos es buscarlo. El que tenga al menos número, el mínimo. Entonces vamos a bajar. Vamos a bajar. 01 Lo intercambiamos con el 1er 1 Entonces recreamos esta matriz así, y lo que obtenemos es una matriz que se ve así donde la viene en el principio. Y entonces es estar todavía aquí. Pero el de la a una intercambiada. Entonces ahora está ordenado. Pero si te darás cuenta por los tipos de selección, la forma en que maneja los datos, tenemos un problema aquí mismo que el a ser viene antes que el a A. Y eso puede pasar con cualquier número que sea idéntico si se dan en un cierto patrón. Lo que significa que en general, no podemos garantizar la estabilidad del tipo de selección. Por lo que la clasificación de selección no es estable. Entonces echemos un vistazo a otro realmente rápido también, el otro que no es estable. Y eso es un tipo rápido. Entonces veamos por qué Quick store no es estable, y eso se reduce a exactamente lo mismo. Entonces recuerda con la clasificación rápida estaban eligiendo un pivote. Entonces con el pivote en mente, lo que vamos a hacer es poner todo a la izquierda del pivote que sea menos y todo a la derecha del pivote. Eso es más que si tuviéramos este mismo ejemplo aquí. Y digamos que nuestro pivote es elegido para serlo, también. Entonces usemos este mismo ejemplo exacto. Entonces nos tenemos a a a A a B y luego a uno del lado derecho por aquí. Entonces, ¿y si elegimos esto? Písalo o vayamos con este pivote aquí mismo. Digamos que elegimos ser como nuestro punto de pivote. Entonces lo que hacemos es bajar esto es ser, y es decir, encerrados en pivote. Y luego presumiremos todo lo que está a la izquierda de estar por aquí. Entonces es todo lo que es menos que así ponemos aquí uno y luego todo lo que es mayor que o igual al del lado derecho. Y notarás un problema aquí. Siempre que hacemos eso, cada vez que agarramos y vamos a la derecha por aquí, lo que obtenemos es a una es mayor que igual a ser así a una va a la derecha, y ahora estamos abajo a todos los valores más bajos posibles. Nuestro primer paso. Es un paso final, y entonces lo que hacemos es simplemente seguir adelante y agarrarlo y escribimos nuestra matriz final aquí abajo . Y como estábamos esperando porque no es estable. Lo que obtenemos es el a A y el a ser lugares de intercambio por el pivote que se eligió. Entonces en este, no podemos garantizar también la estabilidad. Por lo que eso es sólo un toque rápido en la estabilidad. Ya sea que un algoritmo sea estable o no, es importante si la ubicación de los números es importante. Por lo tanto, lo que significa que la A debe venir antes que la B debe venir ante las vistas. Que importa la asociación de izquierda a derecha y simplemente una especie de otra cosa que podríamos atajar a estos algoritmos es que podemos estudiar que si usamos fusión o inserción o clase de burbujas que mantendremos nuestra estabilidad. No obstante, si utilizamos la selección o si utilizamos la clasificación rápida, perderemos nuestra estabilidad. Podríamos tener nombres potenciales que el aire intercambiaba valores potenciales que se intercambian que no deberían haber sido intercambiados, y así es la estabilidad 39. 5a 10 de de la clasificación de ejemplos de Algoritmos: Entonces ahora que tenemos una buena comprensión de los algoritmos de clasificación y hemos visto muchos algoritmos de inicio diferentes, sigamos adelante y veamos algunos ejemplos del mundo real de algoritmos de clasificación. Por lo que hay muchos usos diferentes para la clasificación. En realidad, los algoritmos son probablemente lo más usado de lo que vamos a estar hablando en este curso. Y eso es sólo porque todo lo que hacemos hoy en día necesita ser ordenado de alguna manera, forma o forma sólo por la cantidad de datos que se involucran. El ejemplo más fácil es mirar realmente un documento de Excel. Entonces ya ves que tenemos. Ahora mismo está ordenado a la izquierda por aquí. 123456789 ¿Qué queremos ordenar por los números de la derecha? Digamos que son todos, por ejemplo, dinero, y queremos ordenarlo por el dinero. Ver qué transacción tenía más dinero. Bueno, podemos resaltar todo esto y,ya sabes, ya sabes, solo suba a ordenar y filtrar, haz una clasificación personalizada y digamos, Vamos a ordenar por columna D, que es esta columna de aquí, y vamos a ir de más pequeño a más grande, y verás que lo ordena así. Ahora, algún algoritmo de inicio tuvo que estar involucrado para averiguar a dónde debían ir estos números, y luego tuvo que dar una lista. Y entonces esa lista está en representada de nuevo en el documento de Excel. Ahora se puede ver que va más pequeño el más alto. Y también se puede ver si retrocedemos apenas un segundo que hay un tres con $7 un siete con $7. Y cuando sigamos adelante, notarás que esta es una especie estable ya que mantiene a los tres y los siete ahí dentro ubicación relativa que no los quita ni los desorganiza en ese sentido. Entonces ese es un pequeño efecto secundario de Nate de este algoritmo de clasificación aquí mismo. Pero Excel te documenta algoritmos de historia todo el tiempo. Otro ejemplo es, cada vez que hagas una búsqueda en Google, um, notarás que hay, ya sabes, esos botones de clasificación de la última hora, ordenados por relevancia. Incluso dice que ordenar por relevancia de ordenar por fecha, todos los resultados. Básicamente puedes afinar tu filtro, y lo ordenará por eso y no avanza nuestro que al llegar a algún tipo de puntuación similar para cada enlace, entonces simplemente lo ordena por la puntuación más alta hasta puntuación similar para cada enlace, la puntuación más baja. Y el puntaje se calcula en base a lo que pongas aquí, ya sabes, se clasifica. Es algo extremadamente avanzado, y creo que incluso usa, como, como, gráficos y cosas para crear esto. Pero los fundamentos están aquí, el inicio de nuestra habitación. Entonces, por ejemplo, podríamos poner cualquier momento y que lo recurra en una lista diferente. Um, si volvemos a la configuración o a la configuración de búsqueda, hay diferentes configuraciones que puedes poner aquí que pasará si vas a las herramientas. Aquí son diferentes escenarios, um, los principales siendo como el tiempo. Y creo que vas a una búsqueda avanzada y especie de buscar cosas diferentes dentro de eso . Pero en cualquier momento que cambies esto, solo tienes que entender que si usas un algoritmo de clasificación de alguna manera, forma o forma para ordenar esto para que sepa cómo ponerlo aquí para ti también, Otro buen ejemplo es con cualquier sitio web como compras Amazon especialmente como estos sitios web de vuelo o básicamente cualquier sitio web que realice transacciones dinero en sus sitios web de comercio electrónico. Siempre van a tener esta clasificación por aquí. Por ejemplo, en este simulacro viaje de Baltimore a Minneapolis, donde, ya sabes, a veces quieres mirar por el precio más bajo. En ocasiones se quiere buscar por la fecha de salida o la fecha de llegada o la duración, por ejemplo, quién fue el más corto. Se va a volver a calcular y crear una nueva lista. Digamos que queremos precio más alto. ¿ Cuál es el costo más alto? Debilita a Dio y puedes ver que es este vuelo de United. Se lo cambia completamente a su alrededor. Entonces el algoritmo de clasificación aquí mismo, va a tomar cada una de estas entradas. Y como dije, el otro. Probablemente calcula una puntuación o usa un determinado parámetro en este caso usando el precio, y ordena por eso, luego devuelve ese tipo de lista y luego muestra ese tipo de lista para ti. Por lo que el inicio es realmente importante en este sitio web así que da. Permite al usuario encontrar la información que desea, y con tanta información por ahí ordenando, nuestras habitaciones son cada vez más importantes para conseguir la información que queremos como usuarios forma más rápida y rápida sin tener que cavar a través de cosas que nunca usarían o que nosotros eso no es relevante para nosotros. Por lo que los algoritmos de clasificación, están en todas partes, y son ampliamente utilizados en la informática y el mundo real. 40. Conceptos básicos de árboles: Entonces hablemos de un concepto. Una estructura de datos que aún no hemos tocado. Y ese es el árbol. Entonces, ¿qué es exactamente un árbol? ¿ Cómo lo usamos? ¿ Y por qué nos sirve? Esas son algunas de las preguntas estarán respondiendo a lo largo de esta conferencia ya que hacemos dieta en una introducción a lo que son los árboles y cómo funcionan. Entonces, ¿qué son exactamente los árboles? ¿ Qué? En realidad hemos tratado con un par de árboles, por ejemplo, con clasificación de fusión y clasificación rápida. ¿ Recuerdas cuando estábamos mirando el tiempo de ejecución de ellos y lo rompimos? Al igual que así donde rompimos cada nivel del tiempo de corrida y hicimos este arbolito justo aquí. Bueno, esto de aquí es en realidad un árbol. Tiene un nodo raíz, que es el inicio mismo de él aquí mismo. Y luego tiene niveles. Entonces tenemos, por ejemplo, nivel 12 y luego tres justo aquí, y cada nivel va a tener una cierta cantidad de pasos y luego para llegar al siguiente nivel, vamos a seguir adelante y crear Niños desde nuestros nodos aquí para bajar al siguiente nivel, como así y entonces ¿qué? Esto es esto es un árbol. Y esto también puede ser una estructura de datos, lo que significa que debilita almacenar algo como esto. Y podemos usarlo para ayudarnos ya sea simplemente almacenar los datos para poder encontrarlos más rápido o podemos usarlos para buscar. O podemos usarlo solo para almacenamiento general en general. Entonces lo que esto hace y cómo funciona esto es en realidad a través de lo que hemos aprendido antes, que es un nodo. Por lo que tendrás un no a la cima. Digamos que este es ocho y tiene que subnodos de cuatro y cuatro, y esto apunta de esta manera y luego tenemos nodos aquí abajo y sigue yendo así. Y así lo que tenemos es que tenemos este árbol organizado construido a partir de nuestros datos. Entonces recuerda cuando estamos hablando de nodos y dijimos que en una lista enlazada, por ejemplo, teníamos el anterior y luego el siguiente y uno de esos apuntó de esta manera, uno de esos apuntó de esta manera, y luego tuvimos nosotros mismos básicamente esta lista enlazada que se construyó a partir de estas cosas. Bueno, dije que puedes llenar esto aquí abajo con cualquier cosa, y así cuando miras los árboles, eso es exactamente lo que estás haciendo. Vas a estar llenando este thes punteros con otra información que no sea sólo la anterior y la siguiente. Entonces, ¿qué podemos hacer aquí? Lo que vamos a dio es que vamos a seguir adelante y mostrar, como, una especie de ejemplo aquí de cómo se podría construir esta cosa. Entonces, por ejemplo, digamos que tenemos un nodo gigante aquí arriba en la parte superior, y en realidad no tiene que ser gigante, pero necesita suficiente espacio que pueda escribir aquí. Entonces en lugar de un anterior y luego el siguiente, nos vamos a tener del lado izquierdo. Ah, izquierda y luego en el padre medio y en la parte inferior, derecha, como así y ahora ¿a qué va a apuntar la izquierda? Va a apuntar por aquí. El derecho va a apuntar por aquí y luego por arriba. Aquí están nuestros datos. Lo que sea que estemos comparando o ordenando o algo por el estilo. Y coloreemos esto. Coloremos al padre un color diferente aquí. Vamos a seguir adelante y colorearlo en rojo esto tendrá sentido en un rato. Y entonces lo que vamos a hacer es que vamos a seguir adelante y duplicar esta tasa de estructura exacta aquí, y luego lo vamos a pegar por aquí. Vamos a ir, como, exactamente lo mismo otra vez y moverlo por aquí. Y entonces lo que obtenemos aquí es esta lista. Y en lugar de ser una lista que es así la lista enlazada, es una lista de nodos que en realidad apunta en diferentes direcciones. No hay inicio, y no hay fin aquí abajo. Los punteros de los padres que están en rojo, van a apuntar hacia donde sea que vino, por lo que especie de crea una lista doblemente vinculada. En cierto sentido, sin embargo, no tiene mucho sentido por qué es diferente a solo esto. Entonces vamos a sumar otro nivel. Añadamos otro a la izquierda y a la derecha aquí. Entonces vamos a tener un nodo justo aquí, Una nota por aquí, una por ahí, otra por ahí y luego apuntar esto hacia atrás y te darás cuenta de algo que esto ya no puede ser un vivo doblemente ligado al igual que creamos en el pasado, porque no se puede ir de aquí a aquí de ninguna manera que tenga sentido. Por ejemplo, tendría que ir aquí que tocar esto una vez. Bajar que tocar esto dos veces, subir, bajar, tocar esto dos veces y bajar. Ya no es una línea recta. Ahora se está metiendo en esta forma diferente, y esa es la forma de un árbol encendido. Lo que esto nos permite hacer es crear decisiones dentro de nuestros programas y ordenar los datos en base a estas decisiones. Y en realidad hay algo llamado árbol de la Decisión, que es donde si llegas a este punto, dirá Bien, si tienes, ya sabes, x mayor que tres, ve a la ahora mismo si por qué es menos que ir a la izquierda y en realidad se pueden llegar decisiones basadas en un árbol y configurarlo así? Entonces lo que esto nos permite hacer y mostremos un ejemplo de esto es que nos permite clasificar los datos y llegar a los datos mucho más rápido. Entonces, por ejemplo, en una lista enlazada, si quisieras llegar al octavo elemento, digamos que el elemento está por aquí te darías tienes que ir ocho pasos a lo largo de menos. Entonces esto irá a aquí, Aquí, aquí. Y entonces no tienes que seguir yendo a la lista enlazada para encontrarla. Eso lleva mucho tiempo con un árbol. No obstante, si conoces las ideas correctas, entonces lo sabes. Digamos que tu elemento está en dos derechos, ¿verdad? Correcto. Estamos aquí en dos movimientos estuvieron aquí en. Ya hemos hablado mucho de esto antes. Estamos aquí en bitácora de n movidas en lugar de aquí arriba, que toma en búsqueda. Entonces digamos que, por ejemplo, clasificamos a los animales. Entonces digamos aquí arriba que tenemos animal, y luego lo vamos a clasificar en tres grupos diferentes. Estamos en un clasificar estos animales en tres grupos diferentes. Entonces, ¿cuáles podrían ser estos tres grupos? Bueno, quiero decir, realmente podemos llegar a cualquier cosa que queramos. Digamos que por aquí tenemos, como, como, mamífero, y luego en el medio aquí tenemos algo así como carnívoro. Y luego por aquí a la derecha, tenemos algo así como primate. Y ahora lo que podemos hacer es realmente podemos crear esta lista que va a encontrar a estos diferentes animales. Entonces, por ejemplo, aquí abajo, gato tal vez un perro. No lo sé. A lo mejor. Ah, tiburón. Es un animal que no lo es. Y luego, mamífero, por aquí podríamos tener, como, ardilla y luego tal vez como una rata. Y tal vez veas que podría haber algunas similitudes aquí, así que tendríamos que duplicar. Pero solo estamos pensando en este gorila primate y luego tal vez como un humano. Pero se puede ver que esto ya no es una lista de datos. Esta es en realidad una clasificación de datos, por lo que podemos empezar en animal y decir que quiero agarrar a todos los carnívoros y así sólo tenemos que tocar. Sólo tenemos que tocar si queremos a todos los carnívoros, este árbol aquí mismo. Significa que no tenemos que hacerlo. Aunque eso por aquí tiene 3000 elementos y por aquí tiene 2000 elementos. Todavía podemos encontrar todos los mamíferos en solo iniciar sesión a tiempo. Sólo nos dará un paso y luego dos pasos para encontrar a todos los animales aquí abajo. Entonces lo que esto hace es como dije, nos permite clasificar datos, nos permite dividir datos y nos permite agarrar datos mucho más rápido. Esto es algo así como los fundamentos de lo que son los árboles. Es así como operan. Es así como van en la próxima elección, realmente hablando de un árbol muy estándar, algo que se usa bastante. Y eso se llama árbol de búsqueda binario. Entonces esos son realmente divertidos de hacer en. Los veré en la próxima conferencia. 41. Árbol de búsqueda de 6-2: Entonces hablemos de qué, en los árboles más importantes de la informática, y ese es el árbol de búsqueda binario y las iniciales para ese RbSt, que se puede ver aquí mismo y todo lo que representan es sólo eso. Que es el árbol de búsqueda binaria. Entonces, ¿qué es un árbol de búsqueda binario? Bueno, vamos a descomponerlo. Vamos a descomponerlo a través de las palabras. Sabemos que va a ser binario, lo que significa que vas a tener dos opciones. ¿ Recuerdas los números binarios? Cero en uno. Entonces, ¿qué? El árbol. Vas a tener dos opciones. No va a ser un árbol con múltiples opciones, como así sólo va a tener unas simples dos opciones así que la izquierda y la derecha establece las partes binarias . Esa es la parte binaria. Y entonces va a ser un árbol de búsqueda. Por lo que el método de búsqueda es sólo una especie de enunciar cómo se va a utilizar este árbol. Entonces vamos a poder tener un montón de tipos de estos nodos aquí y mediante el uso de este árbol, debilitar la búsqueda y llegar a ciertos nodos realmente, muy rápido, y te mostraré un poco más de eso más adelante. Y entonces, claro, va a ser un árbol. Entonces va a ser de lo que hablamos en la última conferencia. Se va a ir fuera de las propiedades del árbol, por lo que es un árbol de búsqueda binario. Entonces, ¿cómo funciona exactamente? Bueno, lo que hace es que cada nodo aquí tiene dos opciones. Vaya a la izquierda o vaya a la derecha. Y entonces cada uno de estos nodos tiene dos opciones también. Hasta dos opciones que solo puedes tener. Podrías tener una opción o cero opciones, pero hasta dos opciones y todo a la derecha. Entonces digamos que esta nota es X. Todo a la derecha de X va a ser mayor que y todo a la izquierda de X va a ser menor que así. Lo que eso significa es que este subárbol, este lado izquierdo justo aquí, va a ser menos que números que son menores que X. Y esto a la derecha van a ser números que son mayores que X. Así que lo que podemos hacer es que podamos en realidad construir un árbol justo a partir de esto. Entonces sigamos adelante y digamos que teníamos un montón de números aquí. Vamos a quién tenía 15 27 10 11 y ocho aquí mismo. Y podemos construir un árbol a partir de esto. Entonces lo que hacemos es crear nuestra primera nota, nuestro nodo raíz justo aquí al inicio, y ponemos en nuestro primer número del 15. Después agarramos el segundo número, que es un dos. Bueno, dos es menos de 15. Entonces vamos a la izquierda y ponemos los dos aquí. Y luego tenemos un siete. Y así el siete es menor de 15 pero mayor que dos. Entonces se va a ir justo aquí. Um, bueno, pon los siete ahí mismo. Pongámoslo en rojo siete. Y luego tenemos un 10. Entonces eso es menos que mayor que mayor que y luego 11. Vamos en realidad vamos a cambiar estos números en la parte de atrás. Sólo para que tengamos, ah, árbol más equilibrado aquí. Digamos 18 18 y 25. Entonces tenemos el 10 en, y ahora tenemos un 18 que es mayor que así lo ponemos a la derecha aquí, y entonces tenemos un 25 que también es mayor que así. Ahora tenemos nuestro árbol de búsqueda binario creado Y como ves, no se ve tan lleno como un árbol normal. Tenemos estos nodos que tienen notas vacías. El izquierdo. Aquí, ahí están estos. Ninguno de estos ha quedado sabe que éste no tiene ningún Niños. Este no nos queda a nosotros. Sólo tiene derechos, pero hemos creado aquí es un árbol que fácilmente podemos buscar. Entonces echemos un vistazo a esto. Echemos un vistazo a los niveles aquí. Por lo que este es el nivel principal en la parte superior. Y luego tenemos nivel uno, nivel dos y luego en el nivel inferior tres. Entonces este es el nivel técnico 012 y tres, y así podemos ver que el más largo que tardará en llegar a cualquier nodo va a ser de tres niveles, pesar de que aquí tenemos 123456 diferente pieza de información. Y aquí es donde realmente entran en juego los árboles de búsqueda binaria. Porque, como hemos hablado en muchos aspectos diferentes de este curso, cada vez que metes las cosas en un árbol o podrías romper las cosas a la mitad, podemos conseguir una relación de inicio de sesión de él. Entonces digamos que queríamos buscar un número o no tiene que ser números, podrían ser propiedades que de alguna manera podríamos buscar que son mayores que el último centavo. Pero digamos que queremos buscar la propiedad de siete. Bueno, ¿cómo lo encontramos? Todo lo que tenemos que hacer es trazar el árbol. Empezamos la nota y miramos a siete y vamos es siete mayor o menor que 15 Will siete es menor que 15. Entonces vamos a esta nota. ¿ Son siete mayores o menores que uno? Bueno, siete es mayor que nuestro 27 es mayor que dos. Entonces vamos a aquí. Encontramos siete. Nos costó 12 movimientos llegar allí. Entonces, a pesar de que hay todo este tipo de toda esta secuencia numérica, aquí había seis números. Sólo tuvimos que tocar dos de los números para llegar realmente a y encontrar nuestro número. Y podemos buscar con la misma facilidad. Digamos: ¿ Hay una industria de seis? Bueno, vamos, nos mudamos aquí. Entonces nos movimos a escuchar seis es menos de seis es mayor que seis es menor de lo que no hay nada aquí, lo que significa que seis no está en este árbol. Nos costó como mucho tres movimientos llegar hasta allí. Entonces lo que esto nos da es la capacidad de empezar a descomponer nuestra información mientras buscamos , porque cada vez que tomamos esa decisión cada vez que tomamos la decisión de menos o de mayor de lo que estamos recortando el árbol por la mitad. Teóricamente, estamos cortando el árbol a la mitad, lo que significa que estamos no tenemos que tocar todo a la derecha o todo a la izquierda . Y si nuestro árbol es lo suficientemente normal, entonces tenemos este caso donde vamos a seguir cortando todo a la mitad y vas a conseguir esa gráfica exponencial inversa. Y eso, claro, va a ser log. Por lo que muchas de sus operaciones saldrán como look, especialmente su operación de búsqueda. Pero vamos a hablar más de tiempo de carrera en la próxima conferencia. Y así es como básicamente opera un árbol de búsqueda binario. Eres capaz de insertar estas cosas en, y luego puedes buscarlas muy, muy rápidamente para saber si tienes una en tu gráfica o no la también puedes eliminar de ella en tiempo casi constante. Delicioso es un poco más de un tema complejo, así que no vamos a tocar eso. Pero si solo estás borrando, por ejemplo, los siete que podrías simplemente traer este 10 arriba y se mantendrá las propiedades de búsqueda binaria. Pero, ¿qué tiempos? Si eres como eliminar este 15 de aquí arriba, entonces necesitarías dedo del pie rotar esto hacia arriba en el punto superior para que pudiera ser así Las propiedades de búsqueda binaria siguen siendo, um, mantenidas. También podría rotar este hacia arriba, pero hay que hacer más rotaciones. Entonces, como dije, es un poco más complejo. Simplemente vamos a ir con inserto, y sólo vamos a ver el tiempo de ejecución de delete. Entonces veamos otro ejemplo aquí. Digamos que tenemos Veamos un ejemplo del peor de los casos. Por lo que aquí es donde los árboles de búsqueda binaria fallaron solo un poquito. Y este es el peor de los casos. Este no es el caso promedio, así que este es una especie de los peores casos, pero quiero mostrar esto, y luego en la siguiente conferencia se hablará del tiempo de ejecución detrás de esto, pero se puede ver que un árbol no siempre sale completamente lleno. Esto en realidad sale a una lista enlazada. Entonces si perforamos niveles aquí, déjame ver si no puedo hacer esto bien. Entonces tenemos 012345 y luego seis aquí abajo y notarás que esto es básicamente en. Si empezamos esto, ese uno de los top de aquí, que apenas está un poco fuera de ti, déjame arrastrar estos sobre el tacto. Entonces si empezamos este top uno a uno, nos tendríamos un problema aquí arriba porque esto de aquí arriba Oh, son Siempre va a ser un problema. Simplemente siempre va a salir a siete y te darás cuenta de que eso significa que esto está dentro . Entonces si tenemos una lista ordenada que estamos tratando de introducir en un árbol de búsqueda binario y no le aplicamos nada adicional, realmente vamos a entrar en operación de Sargento porque ahora tenemos a Teoh. Ahora solo una lista enlazada ahora es solo una lista de números que se han vinculado entre sí y no hay propiedades especiales. No tiene sentido dónde se vaya a ramificar, y vamos a poder cortar las cosas a la mitad en realidad solo buscaban la lista de izquierda a derecha, y así eso se convierte en un problema y hablaremos de eso en la próxima conferencia donde se va a convertir en un gran problema para nuestro tiempo de ejecución también. 42. Tiempos de corro de bST: Entonces hablemos ahora de los tiempos de ejecución de un árbol de búsqueda binario, y hay un par de tiempos de ejecución que son importantes para los algoritmos de búsqueda. Supongo que podrías llamarlos nuestras estructuras de datos de búsqueda, y eso va a ser buscar, insertar y eliminar. Y realmente nos preocupamos por el promedio y el peor caso porque el promedio y el mejor caso suelen combinarse aquí. Entonces echemos un vistazo a estos. Empecemos con el algoritmo de búsqueda. Entonces cuando teníamos nuestro árbol binario justo aquí y en el caso promedio, va a parecer un árbol normal. Podría, ya sabes, tener un poco así. Pero en general va a parecer un árbol normal. Y por eso, en cada decisión, vamos a estar cortando el árbol a la mitad. Entonces estos son como pequeños subárboles aquí, a la derecha. Aziz. Bueno, y con cada decisión, estamos cortando uno de los subárboles. Entonces estamos recortando todos los datos y la mitad. Entonces si empezamos con ocho después, uno bajaría a cuatro que Donna a eso, tenemos nuestra respuesta abajo del dedo del pie uno, y hemos repasado este ejemplo un par de veces y eso siempre sale del pie log de in solo porque de toda esa naturaleza de cortar todo a la mitad. Y así, con la búsqueda, vas a conseguir esa hora exacta. El tiempo promedio va a terminar siendo para el tiempo promedio aquí, el tiempo promedio va a terminar siendo, oh, registro de fin. Y eso es sólo otra vez por cómo estamos buscando esta cosa. Y vamos a bajar la lista. Estamos tomando decisiones. ¿ Es menor de lo que es menor de lo que es un mayor que en cada vez que lo estamos cortando a la mitad. Entonces, en promedio, debería parecer algo. Ese árbol debería verse algo así. Y obtenemos ese log de en especie de relación donde podríamos tener 16 ítems aquí, pero sólo cuatro niveles en el árbol. Entonces el máximo que tendríamos que ir es de cuatro niveles. Ahora, veamos el peor de los casos y nos pasamos. El peor de los casos es un poco en la última conferencia, y eso es si tienes línea recta. Entonces si insertas algo que ya está ordenado y obtienes esta línea recta, incluso podrías tener uno justo aquí. Pelea. La mayoría de ella sólo sigue adelante. Y es como una lista enlazada. Es como si solo estuvieras bajando directamente por la lista enlazada y cada decisión solo te quitas una no te quitas la mitad de lo posible sabe que puedes tocar. Sólo te quitas uno. Y así cada vez, si tu único está moviendo uno, eso significa que sólo vas a bajar mi en menos uno en menos uno en menos uno. Ya sabes, constantemente, lo que significa que va a tomar en tiempo atravesar esta cosa porque tenemos en lugar de esos cuatro niveles, tenemos 1234567 niveles. Por lo que está muy cerca de adentro. Y eso significa que este va a ser nuestro peor caso. Recuerda que esto es si nuestros datos ya estaban ordenados así que del 1 al 5 para seis 789 Así que conseguimos algo que en su mayoría estaba ordenado. Cualquier pelo que vaya de Vamos a la derecha, nos conseguimos una línea recta, y eso nos da nuestro mal o nuestro peor momento de oh hasta el final. Ahora esto se puede mejorar. Ahí afuera hay algo llamado A V l y un árbol rojo negro. Y lo que hacen estos es que en realidad colorean los nodos, y cada vez que llegues a un cierto punto donde tienes algo que está muy fuertemente ponderado, lo tomará. Y en realidad girará esto hasta la parte superior y luego tomará estas notas y lo pondrá a la izquierda para asegurarse de que tienes ese árbol. Pero estos son en realidad un tipo de procedimientos muy complejos porque se necesitan muchas variables diferentes y pintura y cosas así para hacerle un seguimiento. Así que sólo sepan que están ahí fuera, y tal vez en un curso más avanzado vamos a repasar algo así. Entonces el siguiente es insertar, y tienes que pensar en insertar exactamente lo mismo que este de aquí. Y limpiemos algunas de estas líneas. Está limpiando algunas de estas líneas aquí, y entonces lo que la inserción está haciendo es insertar. Todo lo que hace es encontrar el lugar al que debe ir un nodo. Entonces, por ejemplo, si tuviéramos un nodo que quisiera ser como, digamos que su destino final estaba justo aquí, estaba justo por aquí. Bueno, eso va a ser todo lo que se va a llevar el suyo va a ser vas a insertar el número es mayor que mayor que menos entonces. Por lo que sólo se necesitaron tres operaciones para llegar aquí, pesar de que aquí tenemos algo así como nueve números. Y así al igual que la búsqueda, va a ser ese mismo algoritmo exacto para encontrar a dónde debería ir. Vas a estar cortando todo a la mitad cada vez ya que vamos a conseguirte un mejor caso o un caso promedio de O hasta el final, o iniciar sesión en mi espalda Oh, al inicio de sesión. Y al igual que el peor de los casos, si tenemos una línea recta y necesitamos insertar ¿van a estar entrando inserciones en un registro de N o en un solo regular en un tiempo lineal? Porque nuestros peores casos que se estaban insertando al final de esta lista por aquí constantemente y sólo estamos haciendo una línea recta más larga y larga. Por lo que nuestro peor caso también va a estar fuera hasta el final, y si lo puedes adivinar, el delete va a ser exactamente igual porque la única operación no constante es encontrar el saber que queremos eliminar y encontrar la nota que nosotros quiero eliminar si nos conseguimos un árbol promedio aquí es exactamente igual que las otras dos operaciones menos que mayor que bien, encontramos la nota a eliminar. El funcionamiento de eliminación real es un poco complejo, pero es tiempo constante porque es exactamente el mismo cada vez y básicamente en qué se descompone. ¿ La nota tiene cero Niños? ¿ Tiene un hijo o para picar Niños? Entonces solo tienes tres decisiones, y solo ejecuta cada algoritmo basado en cuántos Niños tienen por lo que podría tomar. Ya sabes, tal vez éste da ocho pasos a éste, da cuatro pasos, y éste da cero pasos o lo que sea. Pero eso no importa, porque estos son tiempo constante. Siempre va a tomar 84 y cero o lo que sea que estos números salgan a ser. Lo que importa es cuánto tiempo se tarda. En realidad lleguemos a la nota que queremos eliminar, y eso siempre va a ser log of in en un caso promedio promedio caso. Y luego se puede pensar otra vez en el ejemplo de línea recta. Si quisiéramos eliminar un nodo. Podría estar al final de esta lista por aquí. Y así el caso sale a ser un registro de fin o lineal. Sigo diciendo log, pero quiero decir lineal. Se va a convertir justo dentro porque tienes que atravesar todo este árbol para llegar hasta aquí. No estás cortando nada y 1/2 estás literalmente simplemente yendo como si fuera una lista enlazada. Y así nuestro tiempo de ejecución final por aquí es ot in, y así es lo que nos da un árbol de búsqueda binario. Se puede ver que tiene algunas debilidades en el peor de los casos, pero lo es, pero es caso promedio es en realidad bastante bueno. Confinamos insertar borrar en ley dado tiempo, que es uno de los mejores momentos que podemos tocar. El registro es básicamente constante porque constante estaría en algún lugar justo aquí, y entonces tu registro va a subir, así que va a subir y luego va a nivelar. Casi va a volverse constante con el tiempo, así que sólo vas a tener este pequeño hueco. Pero para el resto hasta el infinito, estos dos van a ser básicamente paralelos, así que es tiempo casi constante lo cual es genial, sobre todo tratas de poner números y luego, ya sabes, buscarlo constantemente. Te gustaría un algoritmo como este para que pudieras buscar constantemente y tener esos tiempos de inicio de sesión . Y entonces podrías, por supuesto, implementar algunos de esos árboles de búsqueda binaria más avanzados como el aviall y el árbol negro rojo , y conseguir estos abajo del dedo del pie también iniciar sesión. Pero ese es el binario tiempos de ejecución del árbol de búsqueda. 43. Traversals de 6-4 árboles: Entonces ahora hablemos de árbol traverse ALS. Entonces cada vez que tienes un árbol, hay un montón de formas diferentes en las que puedes atravesar la calle para imprimirla en un cuatro. Entonces, por ejemplo, si tuviéramos este árbol aquí abajo, si tuviéramos este árbol, ¿cómo podríamos imprimir esto como una cuerda? Bueno, podríamos imprimirlo. A lo mejor por nivel. Eso se llama órdenes de nivel. Adónde vas. 2010 15 5 13 23 7 24 seis y ocho. Simplemente vamos a todos los niveles en este árbol. Podríamos imprimirlo yendo mirando primero el subárbol izquierdo y luego el subterráneo medio el subárbol derecho. Podríamos ir arriba abajo. Hay un montón de maneras diferentes de imprimir esto, y en realidad hay un montón de terminología diferente para hacer esto, y esa es la terminología de reversión de tratamiento. Entonces lo que tenemos es que tenemos un con el fin de sobrevender ah preorder traverse lejos, y luego una orden post traverse ALS y lo que son son son diferentes formas de atravesar un árbol que uno pueda imprimirlo en un arroyo. Y cómo funcionan estos. El en orden es algo llamado izquierda, luego ruta y luego derecha mientras el pre orden es ruta. Entonces a la izquierda luego a la derecha? Y entonces la orden postal es izquierda derecha ruta. Entonces sé que esto no tiene sentido desde el bate. Pero básicamente lo que esto está diciendo es que si tuviéramos un nodo aquí abajo, si tuviéramos un arbolito yendo justo aquí, lo que hacemos en orden es tomar a la izquierda un árbol primero y luego la ruta y luego la derecha. Entonces tomamos este sería nuestro primer número y luego entraríamos en la raíz. Entonces volvemos a subir, tomamos este número y luego tomamos este número y luego vamos todo el camino de vuelta arriba. Tomamos este número y luego entramos a este sub árbol. Goto left back to hear back down to the bottom, ¿ verdad? Y luego la pre orden tomaríamos este número y luego vamos aquí, tomamos este número y luego vamos aquí, tomamos este número, y luego tomaríamos el subárbol derecho para que subamos a la derecha Y así vamos en realidad hacer un ejemplo, porque siento que eso hará que esto haga un poco más ya que así empecemos con un con el fin de revertir en orden. Traverse ALS. Entonces, ¿qué? Esto es lo que un con el fin de sobrevender es es es ruta izquierda, ¿ verdad? Así es. Podemos simplemente poner algo aquí vamos camino a la izquierda y a la derecha. Entonces lo que queremos hacer es ir primero al subárbol izquierdo, y luego vamos a ir todo el camino hasta que no pueda encontrar más, algunos árboles. Entonces vamos a ir a la raíz, y luego vamos a ir a la derecha, así que vamos a la izquierda. Entonces empezamos por una raíz aquí y vamos a la izquierda. Algún árbol. Bueno, ¿esto tiene un país de izquierda? Sí lo hace. Entonces vamos a ese subárbol izquierdo. ¿ Esto tiene un siglo pasado? No lo hace. Entonces no queda algún árbol aquí, así que eso significa que podemos cruzar a la izquierda aquí. Vamos a ir aquí, y ahora vamos a agarrar la raíz de esto. Entonces vamos a anotar un cinco, y luego vamos a ir al subárbol derecho y vamos a volver a aplicar el algoritmo . Vamos a la izquierda, y no hay nada a la izquierda, a la derecha o a la ruta. Entonces lo que hacemos es simplemente tomar la ruta, que es el sexenio, y eso lo anotamos. Podríamos poner una coma entre las rodillas. Entonces ahora tenemos este hecho. Bueno, vamos a volver a subir en el algoritmo. Y como ya hemos mirado el sub árbol izquierdo, ahora podemos mirar la raíz, que va a ser este siete. Entonces escribimos ese siete abajo, y luego podemos ir al árbol hijo correcto. Ahora, ¿cuál es ese ocho de ahí? Entonces lo que estamos haciendo es aplicar este algoritmo a cada paso hasta que no podamos aplicarlo . Y entonces solo estamos recopilando los datos en ese punto para que hayamos explorado el subárbol correcto que dure uno del tipo de la lista. Aquí volvemos a subir, y ya hemos explorado la ruta. Entonces volvemos a subir, y ahora se hace el lado derecho de este cinco. Entonces volvemos a subir porque ahora eso significa 10 el sub árbol izquierdo de 10 ya está cumplido. Entonces ahora podemos mirar la raíz para este para que podamos poner un 10 abajo y luego te darás cuenta que el siguiente número tenemos que hacerlo tenemos el sub árbol izquierdo hecho. Tenemos la ruta hecha. Entonces ahora necesitamos hacer el tema correcto, que es un 13. Y si estás viendo un patrón por aquí, estás viendo un patrón por aquí. Eso es lo que es esto. Y por eso se llama en orden. Hablaremos de eso en tan solo un segundo. Entonces volvamos a subir. Todo esto está hecho. hace el derecha-izquierda y la ruta. Entonces ahora nos movemos de nuevo arriba 20 ahora tiene todo el sub árbol izquierdo hecho por lo que ahora puede poner su propio número en su número de ruta y luego tenemos el sub árbol derecho. Entonces ahora estamos saltando por aquí en el subárbol derecho y el árbol hijo derecho sí tiene un elemento izquierdo que es 23. Entonces vamos a agarrar la tarifa 23 aquí, y en realidad vamos a Sí, Agarra el 23 justo aquí. Y así fue Exploramos el subárbol izquierdo invisible. Ahí no había nada. Entonces fuimos a la ruta. Agarramos el 23 luego fuimos a la derecha al 24. Nada en la izquierda. Por lo que agarramos la raíz del 24 Aquí, explora. Ve a la derecha. Ahí no hay nada. Entonces ahora esto se logra Nosotros subimos, este subárbol derecho se cumple ahora. Entonces subimos. Este subárbol izquierdo se cumple ahora. Ahora podemos agarrar la ruta y tenemos 25. Y si notan algo si notan algo aquí lo que conseguimos es que conseguimos el en fin atravesar un amor este árbol Y también el a fin atravesar mucho de esto de los números. Entonces lo que era esto por aquí Este es un árbol de búsqueda binario. Si notas todo a la izquierda ha dejado menos. Todo a la derecha es más Pero por eso, siempre que aplicamos para revertir a ella, en realidad obtenemos la representación en orden del árbol que sale al 56789 10 . Se sale en orden ascendente. Y eso es sólo por cómo funciona. Estaban explorando los menos que primero. Y luego estamos tomando las medias, y luego vamos a las mayores que las siguientes. Por lo que están explorando menos que medio mayor que y eso hace que salga a esto en general. Ahora bien, esta no es la única traviesa de la que hemos hablado. También tenemos una reversión preordenada. Entonces hagámoslo ahora en esto. Entonces nos teníamos una pre orden y la pre orden va a ser ruta izquierda, ¿ verdad? Entonces va a ser genial izquierda, ¿verdad? Entonces eso significa que lo que vamos a hacer es que vamos a hacer exactamente lo mismo excepto hacerlo un poco diferente. Por lo que agarramos la ruta para salir directamente del murciélago. Sólo vamos a agarrar la ruta, anotarlo 20. Ahora exploramos el subárbol izquierdo. Entonces ahora estamos en el país de la izquierda y luego volvemos a aplicar este algoritmo a esto. Entonces exploramos la ruta a la derecha la raíz hacia abajo, y luego entramos en el subárbol izquierdo. Exploramos la ruta, anotamos eso y luego exploramos el subárbol izquierdo. Ahí no hay nada. Por lo que entonces a continuación exploramos el siglo correcto. Escribimos la ruta y luego exploramos la izquierda y luego la derecha. Entonces la izquierda va a ser nuestro seis. El derecho va a ser un ocho, y entonces ya terminamos con facilidad. Entonces avanzamos hacia arriba, lo que significa que terminamos con el derecho. Entonces terminamos con esto. Nos movemos hacia arriba, ya terminamos con, menos algunos árboles. Y yo iría al subárbol derecho, que es el 13 de aquí. Y ahora terminamos con esto. Tiene la ruta, la izquierda y la derecha exploradas. Entonces volvemos a subir. Esto ahora tiene la raíz y la izquierda explorada. Entonces vamos a la derecha, escribimos ese número, y luego vamos a la izquierda, que es este 23. Pero también es una ruta, así que vamos a anotar eso. Y así ahora estamos aquí. Hemos explorado la ruta. No queda nada. Estamos explorando el próximo derecho, que es el 24. Y luego exploramos el 25. Por último, somos No, no, exploramos te deja. Por lo que exploramos el derecho. Aquí vamos. Volver arriba. Ya exploramos la ruta. Volvemos arriba. Ya hemos explorado eso. Volvemos arriba. Ya hemos explorado eso. Por lo que este es nuestro recorrido final de pre orden para que puedas notar que el traversable salió de manera diferente y que con una cirugía binaria, no hay un patrón real en esto. Pero esta es una forma diferente de atravesarla. Y en realidad se puede combinar traverse als. Por lo que en orden y un pre orden, podrías combinarlos para recrear un árbol suelen necesitar al menos dos. Pero esta es sólo una forma diferente, um, um,de atravesar el árbol, y se puede ver que los números no pueden ser completamente diferentes. Este vino en orden, y éste salió. Um, básicamente, completamente apagado casi idéntico, como, completamente diferente. Y esta es la vacuna que podemos explorar es el post order. Por lo que post orden es izquierda, derecha, y luego ruta. Entonces es izquierda entonces derecha? Y luego ruta. Entonces, ¿qué? Nosotros lo hacemos el post orden ya que vamos a ir a la izquierda, a la izquierda, explorado, explorado, derecha y luego a la izquierda. Entonces seis va a ser nuestro primer número, y luego vamos a hacerlo. Por lo que hemos explorado la izquierda. Hemos explorado la izquierda. Y entonces ahora vamos a explorar lo correcto. Entonces el ocho, y luego exploraremos la ruta, que es la siete. Entonces fuimos a la izquierda, ¿verdad? Y luego la raíz y una hora regresan aquí y hemos explorado la izquierda. Hemos explorado lo correcto. Y así ahora podemos anotar los cinco aquí abajo volvemos a subir al 10 y ahora hemos explorado la izquierda. Entonces, exploremos lo correcto, que es el 13 de aquí. Y eso es todo lo que hay por aquí. Y luego vamos a explorar la ruta, que es el Ted. Y así hemos explorado el 10. Entonces volvemos a subir los 20 que hemos explorado el subárbol izquierdo. Ahora exploramos el subárbol correcto. Llegar a este nodo. Exploramos la izquierda, llega a esta nota. Exploramos primero lo correcto y hemos explorado todo. Aquí volvemos a subir. Hemos explorado la izquierda. Hemos explorado lo correcto. Por lo que ahora podemos agarrar el 23. Vuelve a subir al 25 o al 23. Por lo que hemos explorado izquierda. Hemos explorado, correcto, Hemos explorado ruta. Entonces Ahora ya está hecho. Volvemos arriba, los 25 que hemos explorado izquierda que hemos explorado, derecha. Aquí no hay nada. Por lo que ahora agarramos la ruta, que es la 25 que vamos a la cima, que es 20. Hemos explorado la izquierda. Hemos explorado el ahorita agarramos la ruta y tenemos un 20 justo aquí también . Y entonces así se puede ver que esta es otra vez diferente a ésta también. No hay ningún tipo real de patrón para estos dos que por lo menos un patrón que es tan notable como el patrón en orden con un árbol de búsqueda binario. No obstante, son diferentes reveses ahí diferentes formas de mirar esta gráfica en sus diferentes formas de escribirlas como una cadena. Entonces eso es tratar las reverencias. Estos son solo algunos de los ALS traverse. Otro traverso. Todo lo que se podría dio rápidamente, es lo que hicimos como ejemplo del principio, y eso se llama orden de nivel. Se llama orden de nivel, y todo el orden de nivel es simplemente literalmente quitando los niveles de la quiero decir, vamos a hacer esto en realidad. Vámonos. Si sólo quisiéramos un orden de nivel a éste. Podríamos. Entonces digamos que separamos este extremo de sus niveles así y esto se pone un poco complicado. Tienes que asegurarte de que todos estén en el nivel correcto aquí, así. De acuerdo, para que estos sean así entonces solo vas ya sea de arriba a abajo o de abajo a arriba, dependiendo de cómo quieras hacerlo. Pero por lo general es de arriba a abajo. Por lo que tenemos nuestro primer nivel en 20. Después tenemos 10 25 luego 5 13 23 y luego siete, 24 seis y ocho. Y así se puede ver que a pesar de que aquí están en diferentes lados del árbol, todavía están en el mismo nivel. Y así esto te da ese orden de nivel, recorre mucho del árbol. Pero si te darás cuenta que es un poco difícil averiguar realmente qué era este árbol una vez lo pones aquí porque no sabemos cuántos. Si fuera un árbol lleno, lo que significa que siempre había para después siempre había dos Niños, esto sería fácil de reconstruir en un árbol. Pero si no sabes que no sabes qué niveles son cuáles, y se vuelve un poco difícil. Por eso, por lo general para combinar estos para reconstruir un árbol. Pero esos son los als transversales de un árbol, sólo diferentes formas de mirar un árbol y escribirlo como una cuerda. Diferentes formas de diversidad tienen diferentes tipos de propiedades. 44. Ejemplos de mundo de 6-5 árboles: Entonces ahora que tenemos una buena comprensión de los árboles, hagamos lo que hemos hecho en todo el resto de estas secciones y repasemos algunos ejemplos del mundo real de dónde podríamos haber visto árboles y acción. El primer ejemplo es común, y ese es un directorio. Entonces cualquier sistema operativo que veas ha tenido algún tipo de sistema de archivos para pasar por los archivos en la, um, computadora misma o en el disco duro. Entonces básicamente, cómo funciona esto es que tienes un directorio raíz, luego tiene subdirectorios más subdirectorios, y en algún momento se llega a los archivos y vinculando todos estos juntos. Puedes crear programas y puedes abrir fotos y cosas así. Pero todo está ligado como un árbol. Tienes el 1er 1 Cada vez que haces click en el siguiente, va cada vez más lejos. Entonces, por ejemplo, se puede ver en esta instancia de Android Studio que tengo en mi computadora. Puedo entrar en este archivo yendo a otro archivo. Sigue bajando la lista hasta que encuentre un archivo real que podría ejecutarse en algún lugar aquí abajo, y te darás cuenta de que el árbol se mantiene aquí arriba y luego podría ir hacia atrás volviendo al árbol. Entonces cuando hago clic en el botón Atrás, salté de nuevo un directorio. Enumera todos ellos y vuelvo abajo directorio por aquí. Por lo que un árbol nos permite construir acceso a esos datos realmente, realmente rápidamente, y poder tenerlos en un formato donde podamos entenderlos fácilmente, el siguiente uso de los mismos es con indexación de bases de datos. Ahora bien, esto es un poco más de un lado avanzado de las cosas. Este es en realidad ah B árbol justo aquí. Y básicamente, cómo funciona esto es que crea un árbol muy plano, por lo que realmente no tiene más capas en tres o cuatro. Pero separa toda la base de datos en este tipo de árbol condensado, y sólo permite un tiempo de acceso decentemente rápido en cualquiera de la entrada. El de lo contrario tendría que pasar por toda una lista para tratar de encontrarlos. Y no se puede hacer una matriz que tenga millones y millones y millones de líneas de largo. Simplemente no funciona porque probablemente necesitarías varios discos duros, que significa que te vas a reunir para ir a múltiples lugares para guardar todos esos datos. Entonces por eso, porque no podemos usar una matriz debido al tamaño gigantesco dado, suele terminar siendo alguna forma de una lista enlazada, que luego entra en alguna forma de árbol para que podamos mantenerlo todo unido y que podamos acceder a la información realmente rápidamente a lo largo de toda la base de datos y te darás cuenta de que un árbol como yo he estado hablando en esta sección es un elemento muy rápido porque a lo sumo tendrá que pasar por tal vez cuatro. Y entonces, sin embargo, muchos de estos son así, por ejemplo, serían 12 y luego como mucho dos movimientos más por aquí. Entonces incluso con como 55 entradas o esto probablemente esté más cerca de 20 entradas, sólo tenemos que ir tal vez tres o cuatro para llegar a cualquier punto dentro de la base de datos. Apenas acelera en su momento. Es a lo que podemos acceder a eso en tiempo casi real. Otro es, ah, una especie de interesante, y eso es con árboles de decisión. Por lo que los árboles de decisión son cosas que básicamente guían el programa, dependiendo de qué entrada se diera por lo que una gran cantidad de aprendizaje automático en realidad usará árboles de decisión y el hecho de que aprenderá algo sobre repetido ensayo y error y luego ordenará de construir un árbol de lo que debe hacer a continuación. Y podrías ver algunas de esas cosas por aquí como esta son solo números aleatorios y, como si y el tuyo y ir y venir y cosas tratando de encontrarlo. Pero por ejemplo, un videojuego podría hacer algo similar. Digamos que tú, ah, hay videojuegos como finales múltiples al final. Dependiendo de lo que hicieras a lo largo del juego, podría tener un árbol de decisiones que tipo de sumar algunas cosas juntas y averiguar qué final debería darte. Eso es algo que se podría usar ahí. Este es un ejemplo de tick tack toe por aquí, solo un árbol de decisiones de cómo una ah, computadora podría jugar tick tack, dedo del pie, decidiéndolo abajo, um, juegos de ajedrez a menudo tienen si tienes un pecho como computadora que está tratando de golpear a otras personas como él. Ah, computadora que juega ajedrez. Por lo general tiene una decisión. Árbol de la misma o bien calcula uno desde donde está actualmente en pie. Entonces digamos que está en movimiento 12. Calculará movimientos 13 14 y 15 y luego tomará la mejor decisión por sí mismo para tratar de llegar a una posición realmente buena en movimiento 15 cosas. Cosas como notas va, algo así como exponenciales. Entonces si quisiéramos bajar otra capa, iría más y más grande y más grande, sobre todo con un programa como el ajedrez. Entonces crea una especie de árbol condensado y luego reajusta el árbol cada vez. Pero los árboles de decisión se usan con bastante frecuencia en muchas cosas ganando y en muchas aplicaciones del mundo real donde el programa tiene que pensar en sí mismo. Entonces eso es una especie de algunos de los usos de los árboles. Se usan en todo el lugar, y son geniales para acceder a los datos rápidamente y organizar los datos para dar a los programas para tomar decisiones. Son una gran estructura de datos, y son ampliamente utilizados 45. Timing de tiempo: preparación de proyectos: Aquí hay un pequeño problema divertido que encontré mientras recubre que realmente te mostrará a codificar fragmentos que son perfectamente buenos fragmentos de código que podrías encontrar un código real y las ramificaciones si usas el mal una vez sabia que ISS. Entonces aquí está el problema aquí mismo. Lo que estamos tratando de hacer es simplemente encontrar el valor máximo de una matriz. Entonces tenemos una matriz, ya sabes, tal vez tiene miles de elementos en ella, y lo que estamos tratando de hacer es que estamos tratando de encontrar los valores máximos a Tal vez cinco son nuestros valores Max que querían ver en toda esta matriz? ¿ Cuál es el número más grande aquí? Y también es el mismo tema. Si estamos tratando de encontrar a los hombres aquí, tenemos esta idea a la izquierda aquí, que suena bastante bien. Es un fragmento muy, ya sabes, ya sabes, corto en el código de punto. Es Far Max es igual a array, por lo que tomamos nuestro ray dot sort para que lo ordenemos dot pop. Por lo que sacamos el primer elemento del frente de la matriz. Bueno, si está ordenada y asumimos que están ordenando va de más grande a más pequeño, entonces tenemos el Si acabamos de estallar del elemento frontal como, digamos esta cosita justo aquí Fuimos cabeza y lo arreglamos y se fue así , punto, punto, punto, punto cero. Y así ahora todo lo que hacemos es simplemente sacar el primer elemento justo aquí, y ese va a ser nuestro máximo, Muy corto, dulce al grano. Entonces tenemos un enfoque un poco más engorroso por aquí, donde creamos una variable llamada Max. Luego corremos a través de la matriz, y en cualquier momento en que un valor sea mayor que Max, establecemos Max a ese valor más grande. Y así, al final de la matriz, cada vez que lleguemos al final del rayo, que va al todo quiero tocar cada elemento, entonces vamos a tener el valor máximo, porque siempre que algo era más grande, nos adelantamos y lo tocamos, y por lo tanto el esto regresaría Max igual a cinco también, por lo que ambos logran el mismo problema. Ahora, sin embargo, ¿cuáles son las ramificaciones de tiempo de ambos? ¿ Qué fragmentos de código más rápido y por qué? Si no sabes si es parece un interesante problema positividad. Uno Piensa en esto por un segundo. ¿ Cuál de estos va a terminar siendo más rápido? Piensa en todos los conocimientos que hemos aprendido de todos los diferentes algoritmos y trata de llegar a una respuesta para esto. Entonces espero que paren el video y lo hayan averiguado por su cuenta. Pero si no, estoy aquí para ayudar. Aquí está lo que realmente consigue este problema. Es del tipo justo aquí. Este problema. ¿ Recuerdas cuando hablamos de algoritmos de clasificación? Los algoritmos de clasificación tienen lo mínimo en ellos no tienen en inicio de sesión mínimo para clasificación de comparación . Esto significa que esta será la firma de tiempo mínimo de hacer esta operación. Por aquí. Primero tenemos que ordenar la matriz y luego saltamos el elemento. El pop se acabó con uno porque es una constante, simplemente accediendo al primer elemento de la derecha. Por lo que ni siquiera necesitamos mirar realmente eso. Lo que estamos viendo es este in log in, prestamos. Mira por aquí. Y cuál es la firma de tiempo de esta voluntad. Todo lo que tenemos que hacer es tocar cada elemento individual. Una vez sólo necesitamos mirar todo. Y si es más grande, solo realizamos una operación constante para establecer nuestra variable max a esa matriz más grande. Por lo tanto, este lado de la ecuación está justo dentro, y ahora podemos ver la diferencia aquí. Esto va a ser sustancialmente más rápido en escenarios más grandes. Y digo sustancialmente más rápido. Ya verás en un segundo cuando repasemos el tiempo de poner esto a un ejemplo del mundo real, esto no , ya sabes, es, ya sabes,es malo es como en cuadrado o en el tercero o en factorial o algo así. No va a ser una de esas situaciones en las que sabes que el sol se quema o algo así. Pero será una ineficiencia que puede acumularse con el tiempo y asegurarse de que programa, Ah, todo mucho menos escalable. Echemos un vistazo a eso. Entonces del lado izquierdo por aquí tenemos nuestra en ley nuevamente corriendo, y estamos diciendo en esta situación que en va a ser igual a algo completamente razonable 100,000 otra vez, si estamos usando Facebook o para usar las páginas en, por ejemplo, CNN cómo los diferentes artículos que hay 100 mil no es que malo 100 mil es bastante típico del mundo de hoy, y así lo están aquí está igualando 100 mil. ¿ Y si cada operación tomó 0.1 milisegundos, que es muy, muy rápido y suena a la derecha para mucho tiempo? Ah, muchas operaciones que serían acerca de lo correcto por cuanto tiempo debería tardar. Bueno, en esto de aquí, lo que tenemos es que tenemos un raid out sort dot pop, así que va a ser un log in, lo que significa que va a ser 100,000 veces log basado. Y recuerda cuando están en este curso, si el registro no tiene base, lo es también, porque así funcionan las computadoras. Por lo que esta es Ley basada dos de 100,000 que nos consigue 100 mil log basado dos de 100 mil a 16.6. Si quieres ver esto, solo Google log base a calculadora y puedes poner este número y verás que 16.6 es el resultado de eso. Y lo que obtenemos cuando multiplicamos estos dos juntos es que obtenemos 1.66 millones de operaciones. Ahora aplicamos. Nuestro tiempo es un arma 2.1 milisegundos. Cada una de estas operaciones, obtenemos 16,600 milisegundos, lo que equivale a 16.6 segundos. Imagina que estás en un dispositivo móvil y esta operación, lo que estamos tratando de hacer es que tenemos, como, una consulta de búsqueda y queremos encontrar lo más grande en una consulta de búsqueda. ¿ Por qué entraría en esto? Ojalá tengamos un algoritmo que asigne un puntuado lo relevante que es para nuestra búsqueda. Por lo que ahora tenemos una matriz de 100 mil artículos, y solo tenemos que elegir el mejor para mostrar a nuestro usuario en nuestra aplicación. Bueno, para hacer eso, necesitamos un máximo. Tenemos que averiguar qué valor Qué artículo volvió con la puntuación máxima para la consulta. Entonces solo hacemos un Max para llegar. Bueno, en esta situación, cada vez que hagas clic en el botón, va a tardar 16.6 segundos en recuperar esa consulta. Imagina esperar en una app por 16.6 segundos. Imagina ir a Google y buscar algo y esperar 16 segundos para hacerlo. Quiero decir, un Mississippi, dos Mississippi, tres, Mississippi, todo el camino hasta 16 solo para conseguir tu consulta de búsqueda ahora del lado derecho por aquí porque usamos esta versión de Max ahora tenemos justo en igual a 100 mil que no hay operación, por lo que equivale a 100 mil. Por lo que equivale a 100 mil. Fácil, fácil, fácil. Después tomamos los 100 mil y lo multiplicamos por 0.1 milisegundos otra vez y obtenemos 1000 milisegundos, que es de solo segundo. Eso es completamente razonable. Eso en realidad es bastante rápido para muchos de los términos de hoy. Ahora mismo vas a Google y buscas algo. Probablemente tardará alrededor de un segundo o dos para que eso, toda esa información surja, y ahora se puede ver la escalabilidad. Este escala mucho más que éste. Este parece una buena pieza de código. Es si condensado su propio, puedo leerlo y averiguar exactamente qué está pasando. Pero en esta situación, esto en realidad es una ineficiencia que nos va a costar mucho tiempo a la larga. Entonces solo un divertido ejemplo aquí que te muestra codificar fragmentos y cómo un simple cambio puede acelerar mucho tu programa. ¿ Saber qué? El timbre firma de algo como dot sort es acelerar tu programa, hacerlo mucho más eficiente y hacer que el usuario final Ah, todo mucho más feliz.