Introdução à ciência da computação: domine a teoria por trás da programação | Kurt Anderson | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


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

Introdução à ciência da computação: domine a teoria por trás da programação

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

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Apresentação

      4:48

    • 2.

      Introdução à complexidade de tempo 1-1

      2:12

    • 3.

      1-2 refrescador matemático: funções logarítmicas

      11:07

    • 4.

      Refrescador matemático: funções fatoriais

      3:19

    • 5.

      Refrescador matemático: expressões algébricas

      2:47

    • 6.

      Notação de 1 a 5 N

      18:55

    • 7.

      Notação de 1-6 Big O

      12:58

    • 8.

      Exemplo de 1 a 7 Big-O do mundo real

      9:51

    • 9.

      2-1 Como os dados são armazenados

      8:38

    • 10.

      Introdução à matriz fixa 2-2

      5:09

    • 11.

      2-3 tempos de corrida de matriz fixa

      12:23

    • 12.

      Algoritmo de busca binária 2-4 (busca ordenada por matriz fixa)

      9:59

    • 13.

      2-5 arrays circulares

      8:00

    • 14.

      2-6 arrays dinâmicos

      15:51

    • 15.

      Revisão de 2-7 mira

      7:57

    • 16.

      Exemplos de 2-8 arrays do mundo real

      5:42

    • 17.

      3-1 nós

      4:19

    • 18.

      Lista de links 3-2

      13:36

    • 19.

      3-3 vezes de corrida da lista com links

      14:59

    • 20.

      3-4 listas de links duplamente

      8:07

    • 21.

      Ponteiro de cauda 3-5

      5:14

    • 22.

      Revisão de lista interligada de 3-6

      3:31

    • 23.

      Exemplos de lista de 3 a 7 links do mundo real

      3:00

    • 24.

      4-1 pilhas

      9:41

    • 25.

      Exemplo de pilha 4-2

      11:05

    • 26.

      4-3 filas

      8:48

    • 27.

      Exemplos de fila de 4-4

      9:42

    • 28.

      Tempos de fila 4-5 e de corrida de pilha

      6:03

    • 29.

      Exemplos do mundo real de 4-6 pilhas e filas

      7:01

    • 30.

      Introdução do algoritmo de classificação 5-1

      1:40

    • 31.

      5-2 Bubble Sort

      10:12

    • 32.

      Classificação de seleção 5-3

      9:49

    • 33.

      Ordenação de inserção 5-4

      9:03

    • 34.

      Ordenação rápida 5-5

      14:38

    • 35.

      5-6 tempos de corrida rápidos de classificação

      10:31

    • 36.

      Ordem de mesclagem 5-7

      11:57

    • 37.

      5-8 vezes de sequência de classificação de mesclagem

      7:39

    • 38.

      5-9 estável versus não estável

      6:34

    • 39.

      5-10 exemplos do mundo real de algoritmo de classificação

      4:01

    • 40.

      Fundamentos das árvores 6-1

      7:37

    • 41.

      Árvore de busca binária 6-2

      8:34

    • 42.

      6-3 vezes de corrida BST

      7:36

    • 43.

      Traversals de árvores 6-4

      13:04

    • 44.

      Exemplos de 6 a 5 árvores no mundo real

      4:29

    • 45.

      Timing - preparação de projetos

      6:47

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

8.390

Estudantes

6

Projetos

Sobre este curso

Domine a teoria para se tornar um bom programador! 

Se você está buscando aprender a teoria que faz grandes programadores, você veio ao lugar certo!  Isso é perfeito para qualquer pessoa interessada em aprender os fundamentos da teoria da ciência da informática. 

Nenhuma experiência anterior é necessária! 

A ciência e a tecnologia da informática são frequentemente consideradas como coisas apenas para "mentes analíticas". Acredito no entanto que a tecnologia e sua teoria são para todos. Então eu projetei este curso para ensinar cada tópico de várias maneiras fáceis de digerir. Através desses múltiplos passos de reforço, acredito que qualquer pessoa pode acompanhar e ter sucesso! 

Por que a teoria da programação é importante? 

Entender a teoria da informática é o que separa os grandes programadores dos médios. A teoria de programação é algo que transcende uma única linguagem de programação. Ele oferece habilidades e técnicas que você pode aplicar a qualquer linguagem de programação que você tocar. Aprender a teoria por trás da programação é tão importante, se não mais importante do que aprender uma linguagem de programação singular como Java ou C++.

Programação é toda sobre resolução de problemas. Analisando um problema e descobrindo uma maneira que um computador pode ajudar com esse problema. A ciência da informática é a prática desse processo de análise. Ele passa pelas técnicas e conhecimentos necessários para projetar códigos eficientes e sustentáveis. 

Nesta aula vamos abordar: 

  • Sistema de números binários

  • Notação N

  • Notação Big O

  • Como analizar um programa

  • Arrays e suas vantagens

  • Nós e sua importância

  • Listas no Linked e suas vantagens e implementações

  • Stacks implementados com Arrays e Listas no LinkedIn

  • Filas implementadas com arrays e listas interligadas

  • Vários algoritmos de classificação e suas comparações

  • Árvores e árvores de busca binárias

  • E muito mais! 

Conheça seu professor

Teacher Profile Image

Kurt Anderson

Computer Scientist, Multi-Media Designer

Professor

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... Visualizar o perfil completo

Habilidades relacionadas

Desenvolvimento Linguagens de programação
Level: Beginner

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Introdução: Olá, todos. E bem-vindos a esta aula de Ciência da Computação. Este é um vídeo de introdução. Meu nome é Kurt Andersen. Eu vou ser o instrutor da sua aula que vai sobre o básico da ciência da computação. Uma boa visão geral de todos os tópicos que a ciência da computação atinge e algumas das áreas principais , como em notação, tempo e coisas assim. Neste curso, vamos aprender essas sete coisas, e eu vou revê-las em apenas um segundo. Mas quero dar-vos uma ideia do porquê de querermos aprender estas coisas. Ciência da computação é a forma como olhamos para a programação e algoritmos para que possamos torná-los mais eficientes. E esse termo, chamado escalável escalável, significa que nossos algoritmos funcionarão eficientemente se colocarmos 10 pedaços de dados ou se colocarmos , por exemplo, um milhão de pedaços de dados. Queremos que nossos programas sejam executados de forma eficiente ou essencialmente com o máximo de dados possível . Pense, por exemplo, se estamos construindo o próximo Facebook, imagine se eles só o projetaram para 10 pessoas. Isso seria um problema, porque quando eles chegaram a um milhão de pessoas. De repente, há um grande problema. Há tempo, problemas. As pessoas não podem carregar coisas porque nossos servidores e algoritmos são todos ineficientes. E se for muito ineficiente, podemos criar um algoritmo que faça exatamente a mesma coisa de duas maneiras diferentes. Uma das maneiras de levar 10 anos para terminar. E do outro jeito, pode levar 10 segundos. Então não queremos criar algoritmos que levam 10 anos. Queremos criar os algoritmos que levam 10 segundos. Vamos repassar coisas assim ao longo do curso, quebrando alguns problemas e conseguindo o tempo para que eu possa mostrar a diferença entre os tempos neste curso, usando esses algoritmos diferentes. E no final do curso, vamos rever um projeto. Então vamos falar sobre isso e eu vou falar sobre o projeto. A primeira coisa que fazemos é um pouco de atualização de matemática. Sei que já passou algum tempo desde que você foi a uma aula de matemática, então vamos cobrir algumas coisas básicas. Algumas das coisas que o ajudarão ao longo do curso. Isto não é um curso intensivo de matemática. Estamos aprendendo novas áreas, mas ajudará se você tiver uma base sólida. Então vamos a uma rápida atualização de matemática só para que vocês se lembrem. E se você tem um pouco de, ah, fundo instável em algo, você pode procurá-lo um pouco e aprender um pouco mais sobre isso antes de começar. Então temos em notação que é uma espécie de princípios básicos por trás da ciência da computação. É a nossa ferramenta na caixa de ferramentas que nos permite olhar para dois algoritmos e dizer qual deles é mais rápido. Então, se eu olhar para Al Gore que eu digo que está em log in versus outro algoritmo, que está no quadrado como um computador, cientistas, nós sabemos o que isso significa. Agora podemos rotular as coisas de forma diferente e comunicar as velocidades com outros cientistas da computação . Isso é o que a notação in está trabalhando sobre armazenamento de dados e um aumento. Esta é uma maneira de armazenar dados, uh, uh, disponíveis em todas as linguagens de programação modernas como Java JavaScript, coisas como desenvolvimento IOS, que geralmente é Objective C ou Swift ou Andrew Development, que é trabalho. São Escócia todos um raise listas ligadas, pilhas e filas, eles existem em todos aqueles. Então vamos passar por nós e listas vinculadas. Ambos lá quase opostos um do outro. Então eles fazem coisas diferentes, e eles permitem que você resolva problemas diferentes de maneiras diferentes. Pilhas e filas que são pensar em um que quase como quando você está esperando na fila, há coisas em fila. Então essa pessoa vai, e então essa pessoa vai, e então essa pessoa vai, e se as pessoas entrarem, elas começam a se alinhar para que possamos realmente criar isso em um algoritmo, que nos ajuda em muitos situações diferentes. Eles vão recomeçar álbuns. Esta é uma espécie de base do nosso conteúdo de ciência da computação. É sempre aqui que as pessoas começam. Há um monte de diferentes, e isso permite que você veja uma progressão. Deveríamos ir para algum tipo realmente ruim de algoritmos de holograma que levam muito tempo, e nós vamos trabalhar nosso caminho até alguns algoritmos de classificação muito, muito bons que são eficientes, mas um pouco complexos. Eles iam passar por cima das árvores e da árvore de busca binária ou da BST. Esses dois tópicos importantes dentro da ciência da computação. E finalmente, vamos fazer o projeto. Foi o fim do curso? E o projeto do produto é essencialmente que vamos pegar tudo isso e trazê-lo para baixo em um problema. Há um problema. No final do curso, temos 10 milhões de dados. Estou tentando classificar esses dados, e quero que você passe pelo problema e me diga quanto tempo levará para ser executado. Você será capaz de me dizer até o final disso e então como você pode torná-lo mais eficiente? Haverá algumasmudanças rápidas e fáceis, mudanças rápidas e fáceis, algumas estruturas de dados. Você pode mudar coisas assim que torná-lo mais eficiente, e você verá que o tempo vai muito diferente, dependendo de como você implementar essas mudanças. Então, esses são os nossos cursos, é o que vamos aprender. Vai ser uma grande viagem. Há muito a aprender, e você vai lentamente entender mais sobre o mundo dos computadores à medida que passamos por ele. Obrigado a todos, e vamos começar com este curso 2. Introdução de complexidade de um a um tempo: Então nós vamos começar este curso onde ah muitos cursos de CS começam, e isso é no tempo e complexidade. A razão pela qual começamos a complexidade do tempo é porque nos dá um padrão, algo com o qual podemos comparar nossos programas e algo sobre o qual podemos conversar com outros cientistas da computação. É uma maneira que eles podem, especialmente professores e aqueles que nos ensinam podem se comunicar conosco. Por que um determinado algoritmo de programa, nossa maneira de fazer algo é ineficiente versus outra maneira. Então, é uma maneira padrão de comparar diferentes salas fora. É a isso que tudo se resume. E o que eu quero dizer com uma maneira padrão, é o fato de que um cientista da computação, digamos, dos Países Baixos e da América e da Índia, poderia todos se comunicar exatamente da mesma maneira porque usamos certas notações como notação grande O. Então, por exemplo, seria algo parecido com isso. Esta é uma grande notação O, então qualquer cientista da computação entende o que isso significa, e mais tarde vamos discutir isso também e geralmente aprendemos. Você usa certos pequenos aspectos, como no quadrado ou outros fatores escaláveis. Então nós não estamos usando como ele você sabe que ele funciona em 25 unidades de tempo porque nós não sabemos o que 25 unidades significam. Demora 25 ciclos de relógio que levam 25 segundos da tomada? Será executado em 25 ciclos no meu computador versaria o seu computador? É muito difícil comparar quando você vai para isso. Então, o que estamos fazendo Estes estariam olhando para o padrão para isso, uma maneira que podemos comparar com algoritmos completamente independentes do computador, que ele está sendo executado na área, nesse mundo, quão rápido o A conexão com a Internet é apenas ser capaz de olhar para dois deles e ser capaz de compará-los e nos permite descobrir maneiras de melhorar a nós mesmos. Então, se pudermos olhar para uma certa, você sabe, uma certa notação, então podemos descobrir como ser melhores do que essa notação e quais coisas são piores do que essa notação, e isso nos dá muito espaço de manobra. Isso nos dá a capacidade de melhorar a nós mesmos um conjunto de metas e de pesquisar em diferentes áreas, como qualquer outro aspecto. Qualquer outra ciência, vamos rever o básico desta ciência e como podemos analisá-la e tentar descobrir como torná-la melhor. 3. 1-2 de redde de MATs: funções de Math: ciência da computação é baseada em uma base de matemática. Basicamente é apenas matemática aplicada que você joga em um processador e então ele faz tudo para você. E você sabe, você pode continuar construindo isso para fazer seus programas. Mas, em essência, é matemática, e é por isso que eu só quero rever alguns termos matemáticos que serão usados ao longo do curso. Agora, não se preocupe. Este não é um curso de teoria matemática pesada ou algo assim. Nem vai haver cálculos. No entanto. Nós vamos fazer referência a alguma terminologia matemática, alguma nomenclatura matemática, que eu queria ter certeza de que estamos todos na mesma página antes de avançarmos para esse tipo de nomenclatura. E são apenas algumas coisas que aprendemos talvez na escola. Ou aprendemos uma ou duas vezes, e simplesmente não usamos no mundo real. Mas quando você entra em ciência da computação, eles se tornam um pouco mais prevalentes. E como eu disse, você não precisa saber como fazer tudo à mão, mas apenas entendê-los. Isso é o que eu quero chegar ao ponto de você ser capaz de entender essas coisas diferentes e onde você pode vê-lo como digamos que temos um tempo de execução de um algoritmo. Podemos entender o que esse termo matemático significa em relação ao tempo de execução. E então é isso que eu estou indo para dentro. Esta palestra está passando por cima de algum material de atualização para que quando batermos nele novamente mais tarde no curso, você vai entender isso em um nível básico, e você pode tipo de expandir seu conhecimento um pouco mais fácil. A primeira coisa que quero falar é algo que é usado em ciência da computação, mas não muito em outros lugares. E essa é a idéia de log. Então aqui é referenciado, ou a nomenclatura para é assim. É baseado em log, algo assim como digamos que é baseado a de variável aqui ou um número é igual a algum outro número. Então, por exemplo, vamos colocar oito aqui, e assim esta é uma função de log. Agora, o que exatamente é uma função de log? Bem, o que é abreviado é algo conhecido como uma função log rítmica e uma função log rítmica é o inverso encontrando o oposto, o inverso de uma função exponencial. Então, um tronco é o inverso de um exponencial. Agora, o que é uma função exponencial? Digamos que o rastreamos ao longo do tempo. Rastreamos o crescimento de ambas as funções ao longo do tempo. Uma função exponencial vai um pouco como isso, onde você vai direto para o ar significa porque depois de cada iteração a mudança cresce. Então, por exemplo, talvez de 0 a 1, ele mudou por um de 1 para 2. Talvez tenha mudado por dois de 2 para 3. Talvez tenha mudado quatro, depois oito, depois 16 e 32 64. E continua indo cada vez mais alto e mais alto até quando você faz um mudar seus bilhões ou trilhões de números para o próximo. Então essa é uma função exponencial. São muito ruins na ciência da computação. Se você está falando sobre tempos de execução porque isso significa que quanto mais coisas você colocar nele, ele só vai para o infinito de quanto tempo vai levar Agora Uma função de log é o inverso disso. É o oposto disso, e qual seria o oposto disso? Bem, isso é simples. Isso é se você pegar isso e você sabe exatamente o oposto, então vamos assim em vez disso. Então, o que é isso, é que vai ter uma grande mudança no início. Mas com o tempo, a mudança entre números vai ficar cada vez menos e menos com o tempo. Então, onde este vai quase para uma linha vertical reta, este vai quase para uma linha horizontal reta. Isso é bom porque isso significa que quanto mais coisas colocamos em nosso programa, é quase como se o tempo de execução não estivesse mudando. Está ficando cada vez menos e menos até começarmos a gostar dessa linha horizontal. E é por isso que as funções de log são importantes porque são o inverso do exponencial. E há alguns algoritmos que são executados neste tipo de tempo, então esse é o lado teórico disso. Vamos dar uma olhada em alguns exemplos, então vejamos primeiro. A equação para este log de X é igual ao nosso log baseado X de por que é igual a Let's Go b e que, por sua vez, entra na função exponencial. Então este é um registro com a minha função. Esta é a função exponencial e a função exponencial é x de B igual. Por quê? Certo, então vamos analisar alguns números aqui para sairmos desse tipo de variáveis abstratas e estranhas e entendermos isso um pouco melhor. Então, se levarmos dois para o B e for igual a oito, então o que isso significa? Bem, isso significa que se levarmos dois para algo e se, por exemplo, o que estamos dizendo aqui é, por exemplo, para um igual a 22 a dois é igual a quatro. E isso é porque é apenas muito vezes para você tomar 22 vezes dois para o três é igual a oito. E isso são apenas duas vezes. Duas vezes dois você está tomando para multiplicado por si mesmo três vezes igual a oito, e assim por diante e assim por diante. Então nós estamos dizendo é que há um número ser que existe tal que ele é igual a oito. Bem, aqui nós só descobrimos isso. É de dois a três igual a oito. Então, se nós conectamos três para B, nós temos que o três é igual a oito. Este lado é igual a oito. Este ciclo a. Essa é uma expressão legal. Então aqui em cima, B é três. Bem, como isso nos ajuda? O que isso nos diz? Bem, se nós transformamos isso em uma função de log, nós podemos realmente obter um pouco de informação fora dele. Então, se obtivermos log de, vamos conectar nosso valor X, nosso X aqui. Então é uma base longa para. E então agora vamos ligar nossos, uh, nossos uh, escritores B ou R Y real por muito tempo, baseado em dois de oito. O que é isso igual? Bem, sabemos que é igual a três. Então o que podemos fazer com a função rítmica log é que podemos realmente encontrar este número mais fácil. Confinamos que seria mais fácil. E isso é importante porque com uma função rítmica log, nós podemos conectar números aqui e podemos obter números no lado direito onde com uma função exponencial, nós conectamos números e esquerda, e obtemos números Por aqui. Então isso nos ajuda porque agora o que podemos fazer é olhar para a relação de por que uma função log é importante. Digamos que temos isso ou vamos primeiro falar sobre a base. Então, tipo, por quê? O que é base longa para com base longa 10. A base é exatamente o que estamos pegando o número dois. Então, por exemplo, se nós tendemos a um tendem para o para e tendem para o três ou nós teríamos é 10 em seguida 100 em seguida 1000 e isso é por causa disso aqui tendem para o judeu é 10 vezes 10. Assim é 110 dos três é apenas 10 vezes 10 vezes 10. É 10 vezes três de si mesmo, então é apenas 1000. Então, nesta situação, seria registrado com base 10 porque o número aqui é um 10 e isso é não há nenhum significado que você possa fazer. Log baseado 27 Log Place 98 Log baseado 1000 Realmente não importa. Ciência da computação. Ficamos com Log baseado, também, e vamos explicar isso um pouco mais tarde. Mas tudo se resume a como os computadores têm realmente apenas um zero e um um para trabalhar. Então eles estão citando dois estados separados aqui, e é por isso que deixamos usar a base de registro para que passou por cima de sua cabeça. Isso é perfeitamente bom. Só entenda que usamos o também. Então, digamos que tínhamos muito baseado Digamos que temos um algoritmo que é executado em tempo de log. Digamos que temos muito baseado, também, também, e esta é a quantidade de informação que entra. Então, digamos que é baseado em muito tempo. Dois de nós temos 64. Então talvez tenhamos uma conta no Facebook e estamos executando algum algoritmo no Facebook que passa por nossos amigos. Então temos quantos amigos nesta situação? Temos 64 amigos e quanto tempo vai demorar? Bem, nossa equação corre em log, então nós completamos que 60 estrangeiros, e vai ter algum valor aqui. E nesta situação, podemos ir. O que vai? O que é até o final que é igual a 64 que sai para ser aproximadamente dois para o sexto, que é que você pode ver bem aqui em baixo. Vai para o 816 Então, se formos para o quarto, vai ser 16 para o 5º 32 para o 6º 64 certo? Assim. Então, o que é 2 a 6? Então agora temos o seis. E agora temos aqui seis. Então, neste lado direito, o que temos é o tempo de execução. Então vamos dizer que isso é segundos. Então agora temos um algoritmo aqui. Temos base de registros. Dois dos 64 dados equivale a um tempo de execução de seis segundos. Bem, vamos meio que fazer isso ir. Um pouco mais para o lado extremo. Por que longo é um algoritmo tão bom? Por que é tão importante na ciência da computação? Bem, se conseguirmos um algoritmo que seja assim, podemos começar a ver algumas coisas muito, muito legais. Então vamos em frente e limpar um pouco de espaço aqui e vamos olhar para isso um pouco mais. E se tivéssemos muito tempo de dois de agora? Eu não sei. Um. Vamos dobrar isso. Então, 1 28 Bem, isso vai ser igual a sete segundos. Então duplicamos a quantidade de informação que está chegando, e só subimos um segundo. Só mudamos um pouco. Vamos ainda mais alto. Digamos que queremos em vez de duplicar isso ou sim, vamos continuar dobrando. Vamos para 56 aqui e agora temos oito segundos para que você possa ver que a mudança entre estes está ficando cada vez maior, mas os segundos estão subindo linearmente. Eles estão indo para Lee subindo por um segundo cada vez. Vamos extrapolar isso. Digamos que levamos dois para o eu não sei, digamos 32. E por que isso é importante? Bem, para a 32ª. O que é para o 32º igual? Era um número muito, muito grande, e esse número passa a ser 8.000.589.000 ou 589 milhões, 934.000 592. O que há de significativo nisso? Este é o primeiro número nesta sequência que é maior que a população do planeta . E se estamos lidando com o Facebook aqui, isso significa que nosso algoritmo no Max vai correr 33 segundos. Não vai longe em que você não pode ter mais amigos do que há pessoas no planeta. Então nós meio que tivemos isso. Temos um algoritmo incrível aqui onde não importa quantos dados são. Vai sempre correr 33 segundos ou menos, quer estes milissegundos de ar ou estes microssegundos de ar ou outros tipos de unidades de tempo. Esta é uma taxa de crescimento realmente grande. Isso significa que a próxima versão seria se duplicássemos isto novamente, modo que seriam 16 mil milhões. Então, temos uma mudança de um segundo indo de oito bilhões para 16 bilhões e depois mais um segundo para subir para 32 bilhões. Então é por isso que os registros são importantes é por causa desse relacionamento que falamos aqui , como eles não crescem muito com o tempo. E se você continuar indo para o infinito, eles quase se tornam uma linha horizontal onde você pode colocar em tantos dados quanto você quiser jogar dentro e seu algoritmo ainda vai executar basicamente a mesma velocidade. Então essa é a função rítmica de log. É muito, muito tipo de função simples uma vez que você entenda. Mas ainda é muito estranho no buraco, toda a discussão sobre matemática e é algo que realmente não vemos com muita frequência. Então essa é a primeira coisa que eu queria cobrir antes de entrarmos nela. A próxima coisa que eu quero cobrir é outro que muitas pessoas já viram, mas eles realmente não entendem em um nível básico, e isso é algo conhecido como fatorial 4. 1-3 de redde de materiais: funções factorial: Então, o que é exatamente um fatorial? Bem, um pouco parecia algo básico como este. Faux três e depois um ponto de explicação ou talvez 27 um ponto de explicação. Hum, o que é exatamente? Um fatorial significa o que é um fatorial? É apenas se você quebrá-lo, é qualquer que seja o número no ponto esquerdo multiplicado por todos os números prosseguidos. Então, neste caso, o fato de três fatoriais vai ser igual a seis. Vai ser igual a seis, que é uma vez 22 vezes três. Então, um vezes dois é igual a 22 vezes três é igual a seis. Então, três fatoriais é igual a seis. Você vai notar que algo muito importante sobre isso é que esta taxa de crescimento é insana. Então, se formos um fatorial, isso só vai comer um dois fatorial legal uma vez 22 Então é, você sabe, bem parecido com o resto das taxas de crescimento. Três. Fábrica muito igual a seis quatro fatoriais. Então pegamos esse seis e multiplicamos por um quatro, que vai ser 24. Então, em vez de apenas uma vez duas vezes três, temos uma vez duas vezes três vezes quatro, então você pode ver que são 24 agora, cinco fatoriais. Vamos pegar esse número, que é esse número aqui multiplicado por cinco. Então podemos fazer uma matemática rápida. Por que você pode ver que nós já estamos chegando ao ponto em que nós vamos ter que fazer como , hum, basicamente matemática manual para fazer essas coisas funcionarem. E só estamos no número cinco, como nos registros. Poderíamos continuar subindo, subindo e subindo, não era muito difícil. Seis. Bem, vamos passar por isso por seis. De vez em quando temos 120 por isso vão ser 600. Isso é me dar 720 bem ali, certo? Sim. 720 e você pode ver ou 820. Ato Nº. 7 20 Você pode ver que este número está crescendo em uma quantidade substancial. Cada mudança está ficando cada vez mais onde tivemos uma mudança de uma bem aqui. Agora temos uma mudança de quatro. E então uma mudança de, hum, aqui em baixo nós tivemos uma mudança de Vamos dizer, vamos ver 18 aqui. Tivemos uma mudança de 96 aqui. Tivemos uma mudança de 600 você pode ver que isso está ficando fora de controle. Então fatorial há algo que nós nunca queremos encontrar lá sempre representado por qualquer um dos gostos e em, o que significa apenas qualquer número. Você pode ligar lá que, tipo, tipo, se quisermos ser genéricos, podemos colocar uma variável no ponto de explicação, ou podemos colocar um número para obter uma resposta real. No entanto, isso é o que um fatorial é. É apenas uma multiplicação de cada número que o procede então, como eu disse, um fatorial de um sete é apenas ou um são sete. Fatorial é apenas uma vez duas vezes três vezes quatro vezes cinco vezes seis vezes sete. Nada muito complicado nisso. Mas como eu disse, muitas pessoas não vêem isso, especialmente elas podem ser vistas uma ou duas vezes na aula de matemática, mas não novamente. Às vezes vamos falar sobre fatorial é que eles são algoritmos muito ruins. Se o seu programa acabar no Factorial, eles podem pegar como eu disse, você poderia colocar em um programa que é talvez quatro fatorial e vai correr muito rápido. E então se você colocar em um programa que é, você sabe, 20 fábricas. Apenas, você sabe, mais 16 pedaços de dados que talvez nunca completem. Você sabe, o tempo que pode levar para completar o sol pode queimar mais rápido do que isso. Então essa é a importância de um fatorial. 5. Redefinição de MAT, 1-4 a de Math: expressões de Math: E finalmente, eu só queria rever algumas álgebra básica ou algumas coisas que você pode ver no curso. Então, por exemplo, podemos ver algo assim, que é N log-in. Então, o que isso significa? Bem, isto é apenas uma espécie de função genérica. É só mostrar o que uma taxa de crescimento ou o que uma função estava usando nesta situação. Então, digamos que A é igual à quantidade de dados, a quantidade de dados. Então, se tivéssemos uma função que é assim, tudo o que estamos dizendo é que digamos que nossa entrada sai para 700. Não sabemos se vai ser porque os programas são dinâmicos. Eles correm em espaços diferentes. Às vezes, uma pessoa pode ter 20 amigos no Facebook. Às vezes eles podem ter 1000. Não sabemos quantos amigos do Facebook vão acabar por ter. Então é por isso que escrevemos algo assim. É quase como um espaço reservado. Diz-nos o que vamos usar sempre que conseguirmos este número. Mas antes não sabemos o que é. Este é um princípio básico da álgebra, e então o que podemos fazer quando temos uma fórmula como esta quando entendemos o algoritmo, o álbum de computador ou o uso é que uma vez que obtemos um exemplo concreto, isso é como o resumo. Isto é algo que ainda não sabemos. Podemos ligar esse exemplo concreto aqui, e podemos realmente obter um número. Então, nesta situação, seria 700 vezes log de 700. E digamos que esta base aérea para vamos com algo que podemos realmente calcular em nossas cabeças. Digamos que é igual a, hum, Vamos com 16 vai um 16. Então isso significa que vai ser 16 vezes longo, baseado em dois de 16. E nós aprendemos no último que isso é apenas o registro de quê? Ou para a base bem aqui para o que é igual a 16. Bem, duas vezes quatro vai ser igual a 16. É duas vezes duas vezes duas vezes duas vezes 22 vezes, duas vezes duas é igual a oito. Então este é 48 16. Então agora sabemos que quatro é a resposta para isso, então temos 16 vezes para o qual vai sair. Teoh quatro vezes. Então vai ser 40 vai ser 64, certo? Como assim. E então é isso que vamos ter um par destes. Quero dizer, eles podem ficar, você sabe, eles ficam mais complicados do que eles poderiam ser no quadrado de log para o terceiro ou em cima para fazer logoff em mais de três ou qualquer coisa do tipo. Mas entenda que sempre que você tem uma função como esta, tudo o que significa é que estamos tomando estes dois vão ser o mesmo número que ambos são a extremidade variável. Então ambos serão exatamente o mesmo número e sempre que tivermos um número concreto , vamos ligar esse número. Acho que isso é bom. 6. Notação de 1-5: Então temos uma boa compreensão de onde estamos indo nesta unidade. Vamos começar a construir esse processo. Comece a entender isso um pouco mais e passar por cima de algo chamado em notação em notação é apenas uma maneira de olhar para como nosso programa é executado representado como uma função de in. Então isso é importante aqui. É representado como uma função de em uma função de fim. E o que isso significa é que teremos um número arbitrário chamado. Então, por exemplo, nós temos aqui e o que exatamente está dentro? Normalmente, é julgado pelo número de dados que estão sendo processados por um programa. Então basicamente o que um programa é que você tem um monte de entradas aqui, então vamos chamar essas entradas. Você é um monte de pontos. Eles vêm ao nosso programa como uma caixa preta, se preferir. E então eles têm um monte de saídas bem aqui. E é basicamente assim que os programas funcionam. Você tem um monte de entradas, eles são processados de alguma forma, e então eles são armazenados ou fora. Coloque-o de outra forma. Então o que em é quantas entradas estamos recebendo quantas vezes temos que executá-lo e em cada processo. Então é basicamente como, por exemplo, nesta situação, é como as entradas Maney podem ser em quantos tipos de cálculos precisamos poderia estar. E, em seguida, quantas saídas sair também poderia estar dentro. Então é algo que é arbitrário o suficiente para que possa ser usado em qualquer processo de execução do programa, mas ainda assim nos permite entender como os programas foram reagindo. Então vamos dar um passo para trás e vamos olhar para isto de uma forma mais explícita . Digamos que nesta situação em igual a 100 então agora nós realmente temos um número aqui. E então, se nós conectamos o mental, você sabe todas essas diferentes versões aqui, digamos que isso não está em algoritmo e compará-lo a um algoritmo in quadrado. Você pode ver que não importa qual seja esse número, esse número sempre será muito, muito maior, e nessa situação é muito maior, e na verdade é 1000 versus 100. E a razão pela qual normalmente não conectamos números explicitamente é porque a quantidade de dados que estão sendo processados geralmente nunca é garantida como um determinado número. Por exemplo, vamos olhar para digamos que o nosso programa introduz a quantidade de amigos do Facebook que você tem. Então o nosso programa introduz a quantidade de amigos do Facebook que temos. É colocar esses dados na nossa caixa. Mas quantos amigos do Facebook você tem? Porque eu posso te dizer que eu sou meu número vai ser diferente do seu número. teu número vai ser diferente do que provavelmente muitas pessoas a frequentar esta aula. Então, se estamos construindo um algoritmo para 250amigos especificamente, não vai funcionar para a maioria dos casos. Então o que fazemos é construir algoritmos que podem absorver uma quantidade arbitrária de dados. E nessa situação, é exatamente o que chamamos de verdade. E assim pode ser tomado em quantidade de dados. E, em seguida, uma vez que ele processa e produz, ele vai produzir em quantidade de dados. E assim com estes, este tipo de classificação foi capaz de comparar al Berlin sem nunca entender quantos números vão colocar em. E isso é só porque estamos olhando para ordens de grandeza aqui. Nós não estamos olhando para a diferença entre 10 e você sabe, nove unidades de tempo ou o que quer que seja. No entanto, ele sai que estamos olhando em verso no quadrado. Então, por exemplo, nesta situação, digamos que se colocarmos em uma quantidade de amigos do Facebook que vai levar em um quadrado de tempo. E agora nós entendemos que talvez se eu tivesse 10 amigos, isso funcionaria bem e seria apenas, você sabe, isso sai para, tipo, o que, 100? Mas o que acontece se eu tivesse um milhão de amigos, então qual seria esse número? Seria um número absolutamente enorme, e a diferença de cálculo seria enorme em comparação com se fosse apenas uma saída. E então vamos dar uma olhada nisso um pouco mais em profundidade, e você pode ver que há um monte de maneiras diferentes que podemos representar aqui , e este é um gráfico de sua escala ao longo do tempo. E então o que estamos tentando descobrir é como é que, em escala, chega ao infinito? Então, a razão pela qual estamos em questão importante é porque, medida que ele escala ao infinito, é a possibilidade do que nosso programa poderia dar entrada. Então não estamos olhando para Como é que escala para 100 ou 1000 que estamos olhando? Se colocarmos um 1.000.000 de dados ou um 1.000.000.000 de dados nisto, como é que ele vai reagir? E esses gráficos contam a história. Então aqui em baixo nós temos algo chamado tempo constante, que é este colchete ou esta coluna Ah, bem aqui. E o tempo constante significa que se colocarmos o 1110 1 não importa o que aconteça, será sempre executado ao mesmo tempo, não há fim envolvido. Porque não importa o que, ele vai sair exatamente ao mesmo tempo, então o acima que é realmente base de log a de dentro. Lembra quando falamos sobre o sistema binário? Nós não usamos log baseado 10 como a maioria da matemática porque nós não estamos lidando com o sistema de números dezenas . O que estamos lidando aqui é com o sistema de números de dois. Então nós usamos base longa para e, em seguida, aqui temos a raiz quadrada de in in in in in log evento quadrado dois D e em fatorial e você pode ver que há uma grande, grande diferença entre estes dois aqui e estes dois aqui. E você pode ver que o ângulo fica maior e maior e maior à medida que isso vai direto para o infinito. E se você realmente trouxe isso para fora, ambos para o infinito, isso pareceria que estava quase no ar. Bem, esta casa pareceria que estava, você sabe, ainda no ângulo de 45 graus. E é nisso que estamos tentando nos concentrar. Aqui está, quando os comparamos, quão diferentes eles vão ficar com o tempo? Por exemplo, isso pode parecer uma mudança muito pequena, mas se colocarmos esses números no infinito, você começará a ver que a diferença começa a surgir. Então vamos dar uma olhada em alguns exemplos. Aqui temos o número é zero, hum, hum, 10 101.000 em igual a 10 1 Então, nesta situação, o que temos aqui é que temos o número da esquerda e, em seguida, um algoritmo que executa o tempo final e eu vou jogá-los que executa em tempo quadrado em um algoritmo que é executado em log in time e, em seguida, aqui é o tempo constante. Então, se colocarmos em um pedaço de dados, você notará que o que temos é basicamente que eles são todos exatamente iguais e zero nem sempre não faz sentido. Então, o registro é um pouco complicado. Nesse sentido, ele vai colocar para fora um zero ou indefinido às vezes. Mas isso só significa que funciona de uma vez, então todos eles são exatamente iguais. Agora começamos a escalar mais do que um. Você pode ver, todos eles começam exatamente no mesmo lugar. Começamos a escalar além de um para nossos 10. Então, você vê, eles estão todos começando aqui e agora estamos nos movendo para 10, que é bem aqui. Você vai começar a ver que as diferenças saem em, vai para apenas 10 no quadrado, chega ao topo deste gráfico em 100. Então já há uma grande diferença aqui. E, em seguida, fim Log de fim fica até cerca de 33. Vocês podem ver que está bem ali. Agora, se avançarmos mais uma unidade Decca para a direita, digamos que o nosso número é 100. Ele vai até 100 no quadrado vai até 10.000 que é, se você colocar 100 destes e empilhá-los em cima do outro. É assim que o número fica grande. É onde está lá em cima. Então este é um deles e você tem que colocar mais 100 desses. Então isso iria pelo meu teto e então para o céu, como provavelmente dois ou três andares apenas comparado com os 100 aqui, que é, você sabe, bem aqui. Você poderia até mesmo grande em que 1000. E o que temos é em vez dos 1000 aqui, o que nos dá, então, se nós apenas escalarmos isso ao longo do tempo, provavelmente estaria em algum lugar colocando todos os grandes aqui em cima. Este é um milhão, que é se você pegar 1000 desses e empilhá-los em cima um do outro e continuar subindo para o céu. Então isso é como um prédio de 25 andares. Então, comparado a talvez aqui, comparado a uma taxa de 25 andares acima, como aqui, talvez um pouco mais longe nessa direção, comparado a um prédio de 25 andares. Essa é a diferença. E este número vai para cima e para cima e para cima, especialmente se você conseguir um número realmente grande, como um 1.000.000 porque então este vai ser um 1.000.000 então este vai estar em algum lugar , como um par de um trilhões ou talvez 100 trilhões em algum lugar ao redor dessa área. E então o que você tem aqui é que você tem uma espécie de número diferente, e você percebe que esses dois parecem ser muito, muito parecidos. Mas quando você começa a se levantar em números realmente grandes, a diferença começa lá realmente sair. Então você verá aqui que 10.000 contra 664 e, em seguida, um milhão contra 9909 165. Há uma diferença muito grande. E isso é tudo o que estamos tentando fazer com N é, o que estamos fazendo é olhar para equações que estavam tentando saber como e vai para o infinito . Qual equação é melhor? E se tivermos uma equação que está em verso quadrado, uma equação que está em, entendemos que esta vai ser substancialmente melhor, mais eficiente do que esta, e então eu meio que queria rever se você não entendia que log era muito rápido. O que é log E isso é, por exemplo, temos um gráfico exponencial. Isto é como no quadrado bem aqui. Então começa com zero. E então, com o tempo, sua taxa de mudança sobe mawr e mawr e mais até que seja quase uma linha reta. Então isso aqui está no quadrado. O que é um gráfico de lei é exatamente o oposto disso. Então ele vem muito rápido, e então ele passa e quase se torna uma linha reta ao longo do tempo. E, você sabe, nós temos nossos machados bem aqui. O mesmo por aqui. Nós temos alguns eixos, mas basicamente a razão para isso é porque log é o inverso de um exponencial. Então, ao longo do tempo, onde esta a taxa de mudança. Então essa inclinação de um k quanto ele vai de aqui para aqui versus aqui para ouvir isso vai ficar maior e maior e maior até que ele está quase indo direto para o ar enquanto este aqui está ficando cada vez menor e menor tempo. Então isso significa que se colocarmos este para, você sabe, um milhão de milhões de cada vez que sobe um, esse número pode crescer em 1.000.000.000 ou um trilhão. Bem, neste caso, uma vez que chegamos a um número muito, muito grande, podemos estar indo de 8.1 para 8.0 05 Você sabe, algo como algo assim, onde a mudança vai ser extremamente minúsculo, e é assim que o log funciona. Basta pensar nisso como o inverso de uma função exponencial e você vai notar que há realmente um pequeno tipo de coisa legal que sai. Esse entendimento é se voltarmos ao gráfico aqui, você pode notar que temos log de fim e em tempo constante e porque este ao longo do tempo quase se torna uma linha reta onde estamos apenas nos movendo, você sabe, talvez 10.1 decimal. Todo mundo sobre log in e cronômetro constante na verdade geralmente tratado um no mesmo porque, como eu disse lá, sua taxa de mudança diminui onde esses ângulos realmente não mudam tudo muito. Onde no oposto acontece com no quadrado à medida que chegamos cada vez mais longe e mais longe, o ângulo começa a mudar para um ponto onde é quase uma mudança de 90 graus porque ele simplesmente vai direto no ar. Então eu só queria explicar que se você não entendeu o que um tronco significa, é o inverso de um exponencial. E então, quando vamos para o infinito, temos que pensar em outro uma idéia diferente. E esse é o fato de que se você notar e que nós não estávamos falando, qual é a diferença entre dois em verso em? E isso é porque a constante o número na frente não importa. Por que não importa? Vamos dar uma olhada aqui em cima. Então o que temos é que temos no quadrado e temos que no quadrado. E à medida que se torna cada vez maior e maior, a diferença entre estes dois começa a diminuir, onde o número em que a mudança não é tão significativo como costumava ser. E isso tudo vem para baixo frações Teoh e, você sabe, tipo de números como este. Mas o que estamos tentando olhar aqui é que comparamos com coisas que não estavam tentando comparar é um final quadrado adverso e em quadrado. Melhor porque sabemos que ambos são inerentemente muito ruins. O que estamos tentando comparar é isto em quadrado melhor contra um fim. Então, nesta situação, vocês notarão que não importa o número que coloquemos na frente daqui, ainda será substancialmente maior do que este número aqui. E então não importa a constante que temos na frente quando ela vai para o infinito, a constante não importa, e nós só olhamos para a variável em si, mesmo que eu saiba que isso é um pouco confuso. Mesmo que tenhamos um 1.000.000 em verso no quadrado, ainda será o pior cenário. E como eu disse, isso é um pouco confuso no começo só para realmente enrolar sua cabeça. Mas tudo se resume ao infinito, e o infinito é um número que você nunca pode alcançar por causa de quão grande ele é uma vez que chegamos em ir para o infinito. Uma vez que chegamos perto do infinito, a constante não significará nada, porque este número ainda superará um 1.000.000 vezes nele ainda superará um 1.000.000.000 um trilhão de vezes em algum momento. Então você tem que realmente pensar teórico aqui, mas tudo se resume a esta regra simples. Se você sabe, se você não consegue entender a teoria, basta pensar nessa regra civil. Se houver um número na frente, desconsidere-o. Não importa em nossas comparações. Então, agora vamos fazer um exemplo aqui. Vamos nos divertir um pouco. E vamos criar um exemplo onde podemos realmente ver isso em um aspecto do mundo real . Então, se cada ciclo de um programa leva 0,1 segundos Então, nesta situação, o que estamos olhando é cada ciclo de um programa que estamos dentro é que você sabe, quando fizemos essa caixa estão nesta situação são os ciclos e lado ou algum tipo de coisa Dentro desta caixa, essa é a nossa entrada. Assim, cada ciclo de um programa leva 0,1 segundos. Quanto mais rápido o programa em execução de log-in do que um programa em execução ao quadrado? Se 1000 pedaços de dados passarem e assim é realmente aqui que ele chega onde você pode realmente ver a diferença. Então vamos passar por isso. Temos 1000 peças de dados chegando. Este é N log in, que equivale a substituir nossas extremidades com o que estão em foi dada taxa aqui. Então são 1000 pedaços de dados, que é o que vai levar 1000 ciclos de meia. Então, nesta situação, nosso in é igual a 1000. Agora podemos fazer as contas por trás disso. Dizemos que vai levar 1000 vezes log de 1000 e que vai nos dar 3000 vezes 30000.1 que por sua vez nos dá 30 segundos. Agora, vamos comparar isso com em Quadrado, que vai ser 1000 para o segundo, é igual a um milhão de vezes 0,1 segundos, porque cada ciclo de relógio leva 0,1 2º Então é por isso que estamos multiplicando no final. E o que temos são duas horas e 46 minutos. Então, porque esses programas executá-lo no quadrado em vez de em, faça login. E vamos voltar ao nosso gráfico aqui e dar uma olhada. Lembrem-se, estes dois pareciam muito próximos um do outro, mas não estão. Então vamos voltar ao nosso gráfico nosso exemplo aqui porque ele correu ao quadrado. Vai demorar duas horas e 46 minutos, ou duas horas, 45 minutos a mais do que esta aqui. E vamos trazer isso para um número ainda maior. Digamos que ele tem no log de em assim de 25.000 EUA lá em equivale a 25.000 aqui. Então, em igual a 25.000. Agora você vai realmente começar a ver a diferença. Então, nesta situação em Logan é igual a 25.000 vezes log de 25.000 que vai águia em algum lugar em torno de 109.948 vezes 0.1 Então ele vai igualar em torno de 18 minutos e 32 segundos. Mas vamos dar uma olhada no final do quadrado. Então essa lista, você sabe, parece longa e desviada por mais de 30 segundos. Também notamos que é muito menos do que até 24.000 menos dados 300,7 ao quadrado. Se formos ao quadrado, 25.000 quadrados, que Eagles 625 milhões de vezes 0,1 que águias seis milhões, 250.000 segundos, que é 72 dias. Então você pode ver que este número começa a realmente decolar por aqui. E estamos apenas com 25.000 pedaços de dados. Há quantas pessoas no Facebook agora, e seus dados existem algoritmos provavelmente tem que rodar com quantas pessoas estão no Facebook. Então imagine que se você tentasse dizer que eu acho que talvez um bilhão de pessoas lá agora através deste programa levaria isso iria subir para os bilhões de anos que nunca iria terminar. E então é aqui que você pode tipo de ver a diferença das extremidades. Então, basicamente, tudo isso está tentando se resumir a alguns fatos chave. Fim é apenas quatro comparações. Então esse é o nosso primeiro fato é que está em é apenas comparar dois programas. É para verificar o tempo de execução de dois programas. Não é para uso prático, que significa que não vamos estar rodando em algoritmo em um, você sabe, um você sabe, programa e vendo se ele pode retornar coisas dentro de, você sabe, você sabe, 20 segundos ou qualquer coisa do tipo Isso. Não podemos fazer isso dentro de nós. E a razão para isso está dentro é apenas um padrão é uma maneira que podemos olhar para um programa independente fora se o computador é rápido ou lento, onde a conexão com a Internet é mais rápida, lenta Podemos compará-lo com outro programa, como no quadrado ou no Log in, e poderíamos começar a entender quais algoritmos são os melhores e quais não escalariam corretamente. Também precisamos entender que não é ruim ter números maiores. Às vezes é inevitável. Então não pense apenas que você sabe, a idéia de uma ciência da computação é nunca encontrar no quadrado novamente. Não é suposto usar para fins práticos que estamos a tentar fazer. Estamos a tentar teoricamente, resolver problemas diferentes. E assim, por exemplo, todas as espadas de comparação não podem fazer melhor do que no login. Então voltamos a este gráfico aqui. Você verá que todos os tipos de comparação caem nesta linha, então eles estão lá em algum lugar deste lado. Eles não estão no resto deste mais fácil, gráficos mais rápidos e os tipos de comparação são como você gostaria, gostaria, classificar um monte de números, então, mesmo como o uso diário, tipo de algoritmos ainda caem no login. Além disso, múltiplos caem ao comparar assim entender de volta para esta lição que múltiplos não importam e, em seguida, exponencial é pode ser muito, muito perigoso ao longo do tempo. E nossos cérebros realmente não têm a capacidade de entender as diferenças. E isso só mostra você neste aqui onde nós não pensaríamos que isso seria 72 dias versículo 18 minutos. Só porque mudamos deste gráfico para este gráfico, mas as horas extras exponenciais são muito, muito, muito fortes. 7. Notação de 1-6 a 6 a 6 de maior o o: Então agora temos uma boa compreensão de dentro e como exatamente ele funciona, e ele se liga à nossa análise de algoritmos. Podemos começar a acrescentar isso. Então nós sabemos que em é uma maneira de classificar o quão rápido no exterior eles corre, dado um certo número em Quanto tempo vai levar com respeito esse número? Então, vai levar a tempo? Então, se foi, 1000 vai ser igual a 1000 ou vai levar algo como em tempos quadrados onde quando é 1000 ele vai ser igual? UM, um milhão, e este é um tipo muito importante de classificações. No entanto, programas não são tão fáceis. Eles não correm a uma hora exata o tempo todo. Muitas vezes eles têm abundam. Então, por exemplo, talvez você não carregasse. Ele vai ser executado e em quadrado, mas ele executa um fim, e nele, e nele, você sabe que ele exporta em log in e então nós temos que ser capazes de olhar para isso, e nós temos que olhar para o programa e dar uma classificação sobre o programa como um todo. Então, por exemplo, este programa, nós sempre olhamos para o pior caso está sempre indo para o pé do pé. Pior caso tomar ao quadrado, no entanto, em certos passos vai correr mais rápido. E por causa disso, nós realmente temos esse tipo de sistema bem aqui, que vai classificar os, hum, os limites em nossa notação. Então vamos descer isso e dar uma olhada nisso. Estes aqui são chamados omicron. Você desbotou no meio e, em seguida, omega, e este é minúsculo de mega aqui em baixo e assim você pode ver que eles são alfabeto grego. Mas nós apenas muitas vezes em grego de Matthew porque o alfabeto fica confuso. Então usamos o dedo grego, simbolicamente representam as coisas, e neste caso, cada um desses símbolos gregos simbolicamente representa abundam. Então o que você tem aqui é vamos desenhar, por exemplo, um amarrado bem no meio aqui e aqui em cima é mais rápido, então vamos dizer aqui em cima vai ser mais rápido e abaixo aqui vai ser mais lento. Então nossa primeira notação é pequena. Oh, e você pode ver que nós simplesmente não gostamos de dizer omicron como grande notação omicron que apenas leva muito. Então dizemos pequeno Oh, grande oh, e tão pouco Oh, bem aqui. Significa que vai ser mais rápido, que significa que o programa será sempre mais rápido do que este limite. Então, por exemplo, se nosso Barão estivesse no quadrado bem aqui, se tivéssemos pouco, oh, de no quadrado bem aqui, veríamos que isso significa que nunca vai se tocar e ao quadrado. Na verdade, vai ser sempre mais rápido do que no quadrado, por isso vai estar sempre acima desta linha, mas mais rápido do que no quadrado. E então o que podemos fazer é que podemos realmente usar isso para descobrir o salto. Então o próximo que temos é que temos grande Oh, e Big O significa que ele vai ser mais rápido, seu igual a. Então isso significa que vai tocar esta linha ou ser mais rápido, então vai ser na pior das hipóteses, e isso é algo que é muito importante aqui. Isto significa, na pior das hipóteses, que vai ser ao quadrado. O próximo que temos são dados, o que significa que não vai tocar em nenhum desses dois. Não vai diminuir. Não vai ficar alto. O que vai acontecer está bem nesta linha. Então, não importa o que vai ser no quadrado, vai ser ao longo desta linha em algum lugar. E então o próximo abaixo que temos é mais lento ou igual a que temos. Este é Omega, e este é mais lento igual a então ele toca esta linha e é sempre mais lento. Então, você sabe, nós ficamos tipo em terceiro para o quarto aqui em baixo, aqui em cima nós podemos ter como dentro Então é sempre mais lento do que isso, ou igual a n ao quadrado. Então, na melhor das hipóteses, este é, na melhor das hipóteses, ele vai ser executado neste se você colocar isso. Então, por exemplo, se nós direito de n quadrado, como assim cortar um pouco ali, mas de em Quadrado como então entendemos que este programa será sempre executado, ou na melhor das hipóteses ele vai ser executado está em quadrado, o que significa que pode correr pior do que isso, e, em seguida, abaixo que temos mais lento do que o que significa que ele sempre vai correr pior do que em quadrados. Pouco nunca toque e quadrado, mas vai correr pior do que no quadrado E então por que isso é importante? Por que queremos nos concentrar neste de todos esses? E isso é porque Big O dita o pior cenário e estamos preocupados com o pior cenário porque dada a probabilidade e as estatísticas são, programa pode tocar o pior cenário caso em um ponto e queremos saber, Sem dúvida, qual é o pior cenário? Então é por isso que usamos o grande Oh, é ver no pior. O que vai ser? E você pode ver que eu vou trazer o gráfico novamente aqui. Quando temos essa ideia, quando temos a capacidade de dizer, Qual será o nosso programa? Podemos começar a preencher este fim. Então, se nós temos, por exemplo, um, talvez grande o de dentro. Nós entendemos que, na pior das hipóteses, ele vai estar dentro para que possa estar dentro. Mas também pode ser qualquer coisa maior do que dentro. Então podemos preparar todos os nossos diagramas de tempo e esboços e qualquer coisa assim, partindo da suposição de que nunca vai para este lado da linha. Ele sempre vai para este lado, e isso é realmente poderoso porque agora podemos começar a comparar programas, piores casos, piores casos, e podemos começar a ver que pode ser quando um programa escala o, por exemplo, Se tivéssemos um programa de login versus um programa in, podemos ver que quando este escalar, vai ser pior do que este. Então vamos meio que tomar, uh, vamos quebrar isso um pouco e podemos meio que ver por que alguns desses são insignificantes . Então temos um programa que executa aquele pequeno oh no quadrado, que significa que é mais rápido do que no quadrado. Então isso significa que pode ser em qualquer lugar do quadrado todo o caminho até basicamente como nós apenas mais rápido do que ele. Então não vai ser no quadrado, mas pode ser qualquer coisa mais rápido do que no quadrado. E esta é uma espécie de grande Oh, mas a coisa é, nós não pensamos a coisa que nos é dada, então é um pouco de oh de dentro. Não podemos tocar nisso, então só deixa um pouco confuso. Nos dá um limite, mas não facilita. para vermos. Não podemos imediatamente olhar para isto e dizer, Oh, isto vai correr a tempo. Podemos olhar. Temos que olhar para isto e dizer: “Oh, “Oh, vai correr mais rápido do que acabar. Mas nós realmente não sabemos onde, e isso realmente não nos dá muito espaço de manobra. E então nós temos nossa grande notação O e isso é o que nós acabamos de passar é que podemos olhar para isso e nós vamos ser como, Oh, Oh, na pior das hipóteses, ele vai correr em muito tempo em Fada seria ótimo se nós sempre pudéssemos usar dados. O que é o? Isso é igual ou às vezes é usado como a média, mas na maioria das vezes significa igual ao fim, Então isso seria ótimo. Mas o problema é que os programas nem sempre funcionam exatamente ao longo da linha. Às vezes eles podem correr, você sabe, talvez em uma parte ele tem um fim. Mas em um ponto ele é executado, faça login e ele vai para qualquer lugar no meio. Estes dados são muito específicos para nós, ainda gosto muito. E então estes são praticamente insignificantes porque eles não nos dão muita informação . Pense nisso, este aqui, que é Omega So Omega em quadrado. Isso significa que vai ser mais lento ou igual ao quadrado ômega, que é como você está dizendo que nosso programa vai estar rodando no quadrado ou vai ser mais lento. Como vamos planejar com isso em mente? Porque mais devagar poderia ir para o infinito. Poderia ser o mais lento possível, e nunca seríamos capazes de nos preparar para isso porque nunca teríamos abundante. Seria como, Ok, então ele vai apenas correr em quão rápido ele poderia levar no quadrado. Pode levar em fatorial. Pode acabar com o infinito. Não nos ajuda a analisar o programa porque há um lado infinito nele. E exatamente a mesma idéia com o pequeno Omega aqui também é que ele vai para o infinito no lado ruim, o que não nos ajuda. pequeno Omega aqui também é que ele vai para o infinito no lado ruim, o Então isso nos ajuda porque o lado ruim é deixar eu apagar um pouco disso aqui e dar um pouco mais de espaço. Então isso nos ajuda porque o lado ruim. Então, digamos que aqui é para o infinito. Isso nos dá um limite, então qualquer coisa será na pior das hipóteses aqui. Mas poderia ser melhor e não nos importamos se ele voltar e correr essa constante, tudo bem. Isso é perfeitamente bom. Isso significa que nossos programas têm uma ótima camisa, mas podemos planejar isso. Significa que nossos programas são executados mais rápido do que esperávamos. Então o que poderíamos fazer então é planejar para o pior cenário. No entanto, se você for para o outro lado desta linha, você não pode planejar para o infinito. Então é por isso que Big Oh é tão importante é que é o mais útil de todas essas notações . Isso nos dá um cenário pior, e por isso é meio que tomar um exemplo de como podemos aplicar isso a um problema específico. Então, geralmente o que você sempre faz é usar o pior cenário, ou seja, em que ponto do programa não será o mais ineficiente. Então aqui, por exemplo, digamos que tivemos grande o de no quadrado. Tivemos um grande, uh em log em grande O de dentro, e então grande O de Constant Time, e então estes aqui em baixo são ótimos. Mas o problema é que não importa o que aconteça, sempre seremos gargalos por esse cara aqui. E isso é porque a nossa taxa de tempo de carregamento aqui está no quadrado, que significa que este programa vai executá-lo no quadrado mais no login mais o 2, o primeiro, que faz mantê-lo tipo de constante. Aqui vamos nós mais um. E você pode estar pensando, por que estou fazendo isso? E isso é porque você pode realmente adicionar cada parte dos passos juntos. Então, porque você faz essa parte, então você faz essa parte. Então você faz essa parte, então você faz essa parte para que você possa realmente adicioná-los todos juntos. Lembre-se do que estamos fazendo de antemão quando estamos falando sobre como estes como nós tentamos olhar para um programa como ele vai para o infinito. Então, se olharmos para este número, qual destes vai ultrapassar os outros quando formos para o infinito? Bem, por exemplo, vamos colocar em 1.000.000. Quão significativo é um milhão, que é certo um vai ser verso um milhão vai ser verso. Talvez em algum lugar em torno de três milhões vai ser versículo um quadrilhão ou talvez um trilhão 60 sentados foi um e 12 zeros. Este vai ser substancialmente maior. Estes vão ser uma porção menor e menor do número como ele vai para o infinito até o ponto onde estes irão chegar perto de zero como significância. Então você vai começar a ter, você sabe, um número do Google, que é 100 zeros mais talvez, como oito milhões aqui, algo assim. E isso significa que esta parte aqui é completamente insignificante neste momento. Então o que fazemos é eliminar os mais baixos, e o tempo de execução deste programa está no quadrado. E então vamos apenas tipo de cimento que com outro exemplo aqui, digamos que tivemos Big O. Então tivemos um grande O de quadrado grande O de In Squared Big O de Petroleos aqui Vigo de In Squared novamente. E vamos ver agora temos o grande O do final do terceiro. E agora o que temos aqui é que temos n ao quadrado mais no quadrado mais no quadrado mais no no terceiro, e assim podemos realmente combinar estes até três e ao quadrado mais no terceiro. E agora lembre-se do que falamos na última palestra sobre a notação em. Estes não importam. A constante aqui não importa. Porque à medida que entramos no infinito, isso se torna cada vez menos significativo. Até que uma vez chegamos a um número suficientemente alto, ele se torna basicamente zero para que possamos riscar esse para fora. E então agora temos no quadrado mais no terceiro. E então, claro, é claro, este vai decolar muito mais alto do que o outro programa dolorido acaba ficando em terceiro lugar. E agora, já que essas são todas grandes oh, notações que conhecemos no pior dos casos, nosso programa irá executá-lo em terceiro lugar, o que estamos agora. Nós temos este limite de em terceiro e infinito de tempo de execução vai por aqui, e agora podemos planejar que, no pior dos casos, teremos até o terceiro. E podemos planejar tudo de volta ao tempo constante, porque agora tudo o que temos é apenas amarrado aqui. Entendemos que, você sabe, se colocarmos em um pedaço de 1.000.000 de dados, pode não funcionar. Talvez possamos trazer isso, mas nos dá um lugar para começar. Nos dá um lugar para compará-lo com outros. Então essa é uma grande notação “O”. Muito importante. E com o tempo você vai começar. Basicamente, isso se tornará a segunda natureza. Apenas ser capaz de olhar para isto. Você nunca verá esses outros. Muitas vezes. Vais ver este. Às vezes. Se ele diz que um certo ponto de um programa é igual a este tempo de execução, então você verá este. Mas além dessa tese, você provavelmente nunca verá e provavelmente nunca verá o pequeno Omar Khan. Então essas notações aqui apenas as memorizaram, entendam o que elas significam, e você deve estar pronto para ir. Você vai começar a entender muito mais do tipo de documentos de ciência da computação. 8. Exemplo do mundo de grandes o: Não é. Aprendemos muita teoria. Vamos dar um revés e passar por uma análise de código do mundo real. Agora, eu não vou usar código complexo ou qualquer tipo de que você precisa saber aqui. É tudo pseudo código, e vou explicá-lo. Cada passo do caminho é se você nunca tocou no código antes porque é assim que eu quero explicar. Esse tipo todo, claro, é que estamos olhando para a teoria por trás de tudo. Não é o código, no entanto, aplicá-lo a algo que o mundo riel pode ajudar, você sabe, tipo de descobrir alguns dos conceitos, e é por isso que estamos fazendo isso. Então vamos dar uma olhada no nosso primeiro pedaço de código. Vou seguir em frente e passar por isso aqui. Então o que temos é que ele diz que eu escrevi em pseudo. Esse tipo de apenas lê na língua, algo que você pode olhar e entender o que está acontecendo. Então ele diz para cada dados na lista de dados, então vamos criar uma lista de dados aqui em uma segunda impressão. Dados para tela OK é suficiente. Digamos que introduzimos isto um pedaço de dados uma lista aqui que talvez seja de três a 10 e, em seguida, iria apenas búfalo. Então este é três inteiros e uma string. É assim que seria tecnicamente confidencial. Mas nem vamos olhar para isso. Estes são quatro dados. E então o que estamos dizendo é que para cada dado, então para cada dado em nossa lista, vamos imprimir esses dados na tela. Então, na nossa situação aqui, o que está em? Bem, nesta situação aqui mesmo em iguais, os 1234 porque temos quatro pedaços de dados. Então, nesta situação em igual a quatro Então agora vamos ver qual seria o tempo de execução disso. Então nós temos para cada pedaço de dados e, em seguida, nós imprimir para a tela. Então, ok, vamos descer a lista. Aqui. Vamos lá. Primeiro pedaço de dados. Então nosso primeiro pedaço de dados é três. Pegamos três da nossa taxa de documentos aqui, então este é o número zero. Uma matriz, ou, se você quiser pensar sobre isso, é 1234 Computadores geralmente ir com 0123 apenas do jeito que eles funcionam. Então vamos pegar nosso primeiro pedaço de dados aqui e então vamos imprimir na tela. Então pegamos nossos três que imprimimos para a tela. Então isso é um tempo de execução. Então, o tempo de execução agora é um. E agora vamos pegar o para porque vamos descer a lista. Então, para cada pedaço de dados, nós tocamos neste. Então agora vamos para este. Então agora pegamos dois e imprimimos para a tela. Então agora nossa tela se parece com isso. E então isso é tempo de execução adicional bem ali. Isso é um tempo de execução. E agora imprimimos nosso próximo pedaço de dados, que é 10. Então agora temos 32 10. Isso é tempo de execução adicional bem ali. E agora imprimimos búfalos, que seriam de 3 a 10 búfalos. E isso é um tempo de execução adicional porque tudo o que estamos fazendo é pegar o pedaço de dados e imprimi-lo. Não há nenhum processo de pensamento especial acontecendo aqui foram apenas agarrar, imprimir, pegar, imprimir, agarrar, imprimir. E agora, se somarmos tudo isso, veremos que ele sai para um mais um mais um mais um mais um, que é igual a quatro e então o tempo de execução nesta situação é quatro e você verá que nosso tempo de execução é igual à quantidade de fim aqui. E se pudéssemos pensar sobre isso teoricamente por um segundo, se tivéssemos um milhão de pedaços de dados aqui, não haveria, em nenhum momento, o programa onde teríamos que tocar mais de 1.000.000 pedaços de dados . Então, não importa o que façamos aqui é tempo de execução vai ser qualquer que seja o nosso fim, o que significa que o que temos aqui é um tempo de execução nesta situação particular, nós poderíamos realmente usar Fada como em, na verdade, é igual ao fim. Não há espaço de manobra aqui, mas vamos dizer que está pior, porque essa é anotação que gostamos de usar. manobra aqui, mas vamos dizer que está pior, porque essa é a Então este é um exemplo de um em que isso é chamado de loop for. Portanto, quatro loops são tipicamente, por exemplo, forno termina em uma situação. Vamos para um problema um pouco mais complexo aqui. Então deixe-me quebrar este também O que temos aqui é que ele diz para cada dado em uma lista de dados. Então isso significa que em vez de chamá-lo de pai e lá fora, cada pedaço de dados em uma lista vai estar em xeque se os dados estão na lista. Então, vamos, em seguida, ir para cada dados W nas listas de dados. Se n é igual a w imprimir. Verdadeiro. Então vamos em frente e meio que quebrar este um pouco também. Vamos com o mesmo exemplo de antes, que era três vírgula, duas vírgula , 10 búfalos vírgula assim. E nesta situação, nosso in ainda é igual a quatro. E agora o que vamos fazer é olhar para o primeiro problema aqui, então vamos dar uma olhada agora. Digamos que vamos pegar cada um desses pedaços de dados, então vamos pegar os três e agora está dentro. E agora, para cada pedaço de dados nesta lista de dados e você pode ver que esses nomes são exatamente os mesmos. Então isso significa que esta é a lista de dados. Estamos verificando os dois, então temos nossas três maneiras de pegar nossos três. E agora estamos tentando verificar se esses três aqui são equivalentes a algo aqui em cima, e a única maneira de fazer isso é citar força bruta. Então vamos levar estes três. Vamos verificar com a 1ª 1. Vamos verificar com a 2ª 1. Vamos verificar com a 3ª 1. Vamos verificar com a 4ª 1. Isso vai ser 1234 operações . Então, primeiro, vamos quebrar isso, tipo, muito longe aqui em baixo. Temos os nossos três. Pegamos nossos três, e agora estamos checando. Será igual? Deixe-me fazer isso um pouco menor vai ser um pouco maior de um gráfico. Então estamos dizendo, três é igual ao primeiro pedaço de nossos dados, que vai ser os três novamente? Porque não dissemos para começar com um número que não é ou qualquer coisa extravagante como essa . Só estamos checando essa lista uma segunda vez. Então temos nossos três e estamos checando. Não é igual ao 1º 1 Então é igual a três. Sim, faz. Então isso vai imprimir uma mensagem verdadeira, e isso levou uma operação. Agora faz. São três iguais a não. Então não publicamos nada. Essa é uma operação. Nossos três são iguais a 10? Não faz. Então essa é uma operação. Nossos três são iguais a búfalos? Não faz. Então essa é uma operação, e agora terminamos com os três. Então, seguimos em frente. Nós cuidamos dos três, então vamos criar um 2º 1 aqui em baixo. Vamos ver isto. O que? Vai ser aquele que vamos checar com o deles exatamente o mesmo. Mas eu só quero tornar isso um pouco mais visual para todos vocês. Então terminamos com três. Então vamos passar para os dois agora. Então faz muito igual. Três. Não faz. Essa é uma operação que faz igual a ela faz. Essa é uma operação que faz igual a 10. Não faz. Isso é o que a operação faz para igualar búfalos. Não faz. Essa é uma operação, e então vamos descer a lista. Mais um faz 10 igual a três Não é uma Operação faz 10 igual a não é isso que operação faz. 10. Igual 10. Ele faz. É quando a operação faz 10 igual a Buffalo. Não faz. Essa é uma operação que faz Buffalo. Vou abreviá-lo como sendo aqui, então quero continuar escrevendo. Búfalo. Buffalo é igual a três? Não faz. Então essa é uma operação que faz. Búfalo igual a ele não. Então essa é uma operação. Buffalo é igual? 10? Não faz. Então essa é uma operação. Búfalo é igual a Buffalo? Ele faz. Então essa é uma operação. E agora se adicionarmos tudo isso aqui, o que vamos ver é que vai ser 123456789 10 11 12 13 14 15 16. Então, nesta situação, nossa entrada era quatro, mas o tempo de execução era aproximadamente 16. E o que é que isso vem a ser? Bem, isso sai para ser no quadrado. Então, digamos que se pegássemos quatro e o quadrássemos, seria igual a 16. E podemos, teoricamente, pensar sobre isso também. Se expandirmos isto para cinco, cada um teria não só mais cinco aqui, mas temos de multiplicá-lo porque agora temos de verificar um adicional também. Então, cada instância única, terá cinco e terá um inteiro outros cinco, que o quadra assim, nesta situação, o tempo de execução está no quadrado. E a razão para isso é, mesmo que tenhamos 24 loops, há o que é conhecido como aninhamento. Nós aninhamos 14 loop dentro de outro quatro loop. Então esta parte aqui fora, vamos desenhar isto e ler esta parte aqui fora está dentro enquanto esta parte dentro está dentro também. Então o que fazemos é pegar o fim do lado de fora, multiplicá-lo pelo final, dentro, e entrar ao quadrado. E então esse será o nosso tempo final para esta situação. Então, como eu disse, este curso não é fortemente designado para escrever código ou para fora, e ainda é definida a teoria. Mas pensei que isto poderia ajudar a mostrar-lhe o que estivemos a falar este tempo todo. Como o código pode ser realmente analisado para que possamos entender essas diferentes partes. E você pode ver que não importa o que aconteça, nós acabamos de aprender algo muito importante. Quatro loops estão sempre indo para estar em, mas aninhado para loops são sempre vai ser como muitos aninhamento há. Então, se este aqui bem aninhado 1/3 1 isso seria uma fórmula em quadrado, e você começa a se levantar em números realmente grandes para começar a verificar todas essas coisas. Então, espero que este exemplo prático tenha ajudado você a entender esse conceito um pouco melhor. 9. 2-1 Como os dados armazenados: Então vamos começar a saltar para um dos próximos tópicos principais da ciência da computação, e essa é a capacidade de entender e manipular estruturas de dados. Estruturas de dados são a maneira de basicamente tirar dados, organizá-los e ser capaz de agarrar o acesso, salvá-los de certas maneiras que se encaixam com o nosso objetivo. Assim, alguns são mais rápidos do que outros em certos aspectos. Então, por exemplo, alguns deles vamos ocupar mais espaço enquanto sendo realmente, muito rápido acesso. Alguns deles não ocupam muito espaço, mas podem demorar um pouco para acessar. Alguns deles têm inserções mais rápidas. Alguns deles têm mais rápido remover ALS. Tudo se resume ao que exatamente você quer realizar em seu programa ou teoria ou em qualquer tipo de seção de ciência da computação em que você está indo. Então, a primeira coisa que pensamos antes de entrarmos nessas estruturas de dados, é que precisamos entender como, exatamente, os dados são armazenados, porque isso nos ajudará a começar a entender essas estruturas de dados e por que alguém pode tomar mais longo do que o outro e por que um poderia ocupar mais espaço do que o outro. Então a primeira coisa que precisamos fazer é primeiro. Como eu disse, entenda os dados. Então o que os dados são é É como, por exemplo, é algo algum tipo de zeros e uns que significam algo. Então, por exemplo, um três pode ser um pedaço de dados ou um texto inteiro, ou talvez um documento inteiro possa ser um pedaço de dados. E o que acontece em um computador é que esses tipos de dados são armazenados em, por exemplo, como um disco rígido, que está em seção em pequenas partes diferentes e essas partes de seção em mais partes E então dentro de um desses, você tem como clusters, que tipo de sair para se parecer com isso aqui. Então, por exemplo, talvez isso represente essa coisa toda aqui e o que cada uma delas representa é um pedaço de dados. E então cada um deles terá um endereço na memória, como um endereço para onde sua casa é. Se você quiser enviar um pacote, o computador usa exatamente a mesma coisa. Por exemplo, talvez este. Ele geralmente usa hexi decimal de modo que então eu vou usar Talvez este é 00 e então este seria então 01 E este símbolo zero com pouco X ao lado dele geralmente significa Hexi Decimal. Então é isso que estou usando para isso. Então continuaria continuamente aqui em baixo. Isso seria 020304 etc. E então por que isso é importante é porque uma vez que temos o endereço, podemos realmente pegar a coisa que está nesse endereço. Então, por exemplo, se pegássemos um pedaço de dados, digamos que tínhamos uma string ou um pedaço de dados que era três e quatro, assim E vamos dizer que três foram armazenados. Zero x 00 e quatro foram armazenados em zero x 01 Então agora, se quisermos pegar esses pedaços de dados, o que podemos fazer é criar uma tabela com esses tipos de dados e suas associações. Então, por exemplo, nossa mesa pode dizer três. Está guardado aqui. Isso é armazenado aqui, exceto que normalmente seria o inverso. Nós diríamos o que está em 00 e seria algum tipo de dados. O que é isso? 01? E seria algum tipo de dados. E agora, quando queremos realmente recuperar esses dados, podemos procurar o endereço ou vice-versa. Se quisermos ver o que há, podemos ir até lá e descobrir. Então, digamos que queríamos recuperar. Três. Queremos recuperar os três em nosso conjunto de dados. Então três está localizado bem aqui e quatro está localizado bem aqui. E assim queremos recuperar três. Basicamente, o que o nosso programa faz nos bastidores. Muitas vezes, menos que o seu programa em um nível muito baixo, que significa muito perto do dedo do pé como máquina, manipulando a máquina completamente e totalmente dentro de si mesmo, geralmente linguagens de montagem e coisas assim. Então tudo o que temos que fazer é dizer, você sabe, apenas var X é igual a três e com a máquina está fazendo isso dizendo, Ok, agora estamos associando X com o endereço zero x 00 Então, qualquer vez que o usuário usa ou chama X , nós vamos pegar o que está sempre em zero x 00 Agora o usuário vem aqui e ele, você sabe, cria uma nova variável. Por que é igual a quatro, E agora por que é associado ID com zero x zero vinho. Isso é o que o programa faz é dizer que tivemos o programa ir. O que é X plus? Por quê? O que é isso igual? Bem, o que ele faz é correr bem, então X está às 00 Vamos pegar o que nunca? Às 00 e nós vamos, ele escaneia para o disco rígido. Ele vai todo o caminho e encontra 00 e diz, Ei, tem um três aqui. Então os três, em seguida, é chamado, trouxe todo o caminho de volta para cima no processador, e então ele é armazenado em Ram, que é uma memória mais próxima do computador real. Mas isso é meio que está ficando muito, muito exigente e como os computadores funcionam. Mas tudo o que ele faz é agarrar isso e dizer, Este é um três. E então então agora dizemos que queríamos mais sobre o porquê e então ele faz exatamente a mesma coisa . Ele vai para baixo na sua lista. Ele encontra o setor, o cluster, o que quer que desça e diz, Oh, é um endereço ou um que ele retorna. Oh, o que é endereço ou o que um quatro vai todo o caminho de volta para cima e volta antes E claro, ele faz isso em quase tempo instantâneo, e então então ele pode fazer os cálculos que chamou. São duas partes de dados bem aqui. E agora faz o cálculo de sete. E isso é uma base de como os dados são armazenados em um computador. É apenas um tipo de endereços da Siri, e há diferentes maneiras de armazenar esse tipo de dados. Então, por exemplo, esta é mais uma maneira direta de armazená-lo onde podemos chamar o endereço especificamente. Que maneira disse que queremos alocar, vamos deletar algumas coisas aqui. Na verdade, o que podemos fazer é duplicar este slide aqui e vamos descer. Então vocês terão este topo, será duplicado e, em seguida, tipo de deletar fora dele e fazer um segundo exemplo aqui. Então essa foi uma maneira muito direta de dizer o que eu era. Se nós dissemos que temos esses dados, esta estrutura que vai ser entre aqui e aqui e seu endereço como um todo vai ser zero X 00 agora Se nós chamamos zero x 00 vamos dizer, Bem, vamos colocar alguns dados aqui. Se chamássemos zero x 00 não haveria dados específicos aqui. Estamos ligando para toda essa entidade, então isso não nos ajuda. Então o que podemos fazer é aqui que começamos a entrar. A próxima parte é que podemos realmente meio que em pequenos mini-nomes para cada um desses pequenos segmentos. Então isso é apenas 12345 E nós podemos usar esse tipo realmente básico de classificações porque nós temos nosso endereço principal bem aqui. E agora, já que temos o nosso endereço principal, o que vamos fazer é ir para o endereço principal, e então vamos usar um dos seus mini nomes para encontrar qualquer pedaço de dados estamos procurando. E isso é o que é chamado de array. E a próxima palestra. Nós realmente vamos começar a levar isso para o próximo nível, mas isso é chamado de array. Então o que podemos fazer é criar, salvar nossos X iguais e, em seguida, criar algo assim. E então agora ele armazena todo aquele pedaço de dados neste pedaço de memória e que agora se nós dissemos Return X de qualquer que seja o pequeno mini nome é. Então, digamos X de um. Agora ele vai chegar. Ele vai para o zero x 00 e então ele vai para o mini nome de um, que é um dois. Então ele vai voltar para e assim que é uma maneira diferente de olhar. Em vez de ter acesso direto, você poderia tê-lo segmentado em pedaços como este. E o que acontece é que isso geralmente é o mais comum. Porque se tivéssemos um endereço direto para cada peça na memória, estaríamos desperdiçando muito espaço e sendo algumasmesas realmente, realmente grandes, mesas realmente, realmente grandes, porque você tem que pensar que a memória não pode Ah, computador não pode criar memória na mosca como você não pode simplesmente armazená-lo em terra imaginária. Se ele quer armazenar cada um desses relacionamentos, ele tem que ter uma outra seção inteira de memória especificamente designada para armazenar memória. Então, se você tentar armazenar cada pedaço de dados como este, seu espaço começa a ficar realmente grande, e estes são todos conceitos. Vamos começar a quebrar à medida que formos mais longe. Mas eu só queria mostrar isso em um nível de cima para baixo para que você possa começar a entender como a memória funciona. E então quando entramos nessas estruturas de dados como um aumento, como árvores como listas vinculadas, você pode começar a entender como ele pode funcionar sob o tipo de capô em. Nós podemos entrar em um pouco mais de, você sabe, apenas esse entendimento, e uma vez que você entenda, você pode usá-lo melhor. Você pode manipular melhor. 10. Introdução de matriz de 2-2: Então vamos passar por cima da nossa primeira grande estrutura de dados, e isso vai ser o array e nesta situação, o array fixo. Então, o que é um array? Bem, em um ataque, por definição é uma Siris ordenada de acordo. E então tudo o que isso significa é que é um agrupamento de tipo de elementos semelhantes juntos. E nesta situação, os elementos semelhantes apenas significa que há um pedaço de dados assim em um raio no mundo da ciência da computação é apenas uma coleção como de dados ou uma realmente apenas uma coleção de dados que está tudo ao lado outro. E o que quero dizer com isso é que vamos passar por diferentes estruturas de dados mais tarde onde você pode ter um pedaço de informação aqui em um disco rígido e, em seguida outro pedaço aqui e ali, apenas ligado juntamente com algo chamado Ponteiros. Então é como, digamos, se quiséssemos representar a coisa abaixo aqui em baixo, teríamos algo assim. Mas poderia haver, você sabe, um monte de peças diferentes no meio, e um monte de peças diferentes no meio também. E isso não é o que em uma corrida é algo chamado uma lista vinculada. Então em um raio é quando eles estão todos juntos e você tem certos benefícios disso, você tem certas desvantagens disso. Mas uma matriz se parece com isso sempre que você representa. Visualmente, você tem esse segmento de memória, e quando você cria uma matriz, você normalmente sempre atribuiu quanto tempo você deseja. Estás a perguntar ao computador. Eu quero uma seção de seis pedaços de dados e o computador vai procurar pelo disco rígido, e então ele vai encontrar um lugar de seis, e vai te dar esse slot. Então, por exemplo, no nosso disco rígido, se pedirmos um lugar de três, ele iria olhar através, olhar lá e tipo, Oh, bem aqui nós temos uma seção de três. Então, ele lhe daria esses três pedaços de dados, e isso seria em código. É tipicamente representado por uma declaração de parênteses assim. Então você diria que algo como X é igual a esses colchetes, e isso significa uma matriz vazia. E então, se você quiser colocar informações nele, pode ser algo como X igual a 123 E isso vai apenas criar uma matriz que se parece um pouco com isso, onde você tem o primeiro lote de um, o segundo slot de para e o terceiro slot de três assim. Então é assim que seria representado em código. Agora, como é que uma matriz conta? O que é isso? Você sabe o que? É para que é usado? Uma das partes mais importantes é que a matriz começa em zero. Chama-se indexação zero. Isso significa que sempre que queremos agarrar o primeiro elemento sempre que queremos agarrar este elemento ou nesta situação, este elemento jamais iria querer agarrar um desses desenvolvimentos. Temos que começar no zero. Tem que ser este zero aqui. Isso é porque ah, muitas fórmulas de computador funcionam com zero. Na verdade, há discussões online inteiras sobre por que ainda usamos base zero. Costumava haver um monte de diferentes tipos de razões para isso e a razão que começou a cair. Mas o que quer que seja agora, ainda usamos base zero. Então, na matriz é sempre começando por zero. E isso significa que o fim é algo chamado em menos um o que está em menos uma média terminará nesta situação é apenas o comprimento da matriz. Então isso significa que o último vai ser em menos um. Serão só seis. Então isso, como você pode ver, contém sete peças de informação. 1234567 No entanto, se quisermos pegar a última informação, não pegamos sete. Pegamos seis, um pouco confuso no início. E muitas vezes, até mesmo cientistas veteranos da computação, eles se enganam o tempo todo. Eles vão colocar, eles vão colocar, você sabe, se eles estão tentando pegar o último elemento, eles vão colocar X de sete. E isso vai retornar algo chamado falha de sequência, que é apenas o computador dizendo, você , está acessando memória fora dos limites. Você está acessando a memória. Eu não lhe dei controle e linguagem mais fraca ou línguas que não têm salvaguardas nele. Bem, na verdade, apenas devolva o lixo que está lá, então isso é realmente chamado Ah, ataque de estouro de buffer é se você atacar esse lado direito, você pode hackear as coisas por isso. Mas isso é como as línguas realmente básicas como C, seja em um monte de salvaguardas. Mas sempre que tentamos fazer isso em algo como, Java vai nos dizer que a segunda falha foi acessar a memória que não foi concedida no disco rígido, algo mais está lá que nós não deveríamos estar tocando. E isso, como eu disse, é cancelado por um ar. Coloque a parte importante que você precisa para sair desta palestra. Esta introdução para corrigir um aumento é que um na matriz é apenas uma coleção de dados no mesmo lugar no disco rígido vai passar sobre a vantagem que na próxima eleição falamos sobre os tempos de execução. Mas isso é o que é. É uma coleção desses dados juntos. A próxima coisa que sabemos é o que é a parte fixa deste ia falar sobre diferentes arrays. A parte fixa disso significa apenas que nunca vai mudar. Então, nesta situação, se criarmos uma matriz de tamanho quatro, ela sempre vai ficar tamanho, pois não há código para fazer um ir maior e fazer ir menor. Uma vez que o enchemos , está cheio. Ou temos que sobrescrever algo ou excluir algo ou mover algo em outro lugar para colocar mais informações apreciadas. Mas, de qualquer maneira, essa é a introdução aos arrays fixos, realmente, realmente precisa de estruturas de dados, e vamos pular em um pouco mais da gritty nitty de como você realmente usa essas coisas e o que seus vantagens são. 11. Horários de execução de matriz de 2-: Vamos dar uma olhada mais profunda nas matrizes fixas e vamos olhar para seu tempo de execução, realmente usando as coisas que aprendemos na última unidade, você sabe, a análise de tempo jumbo jumbo que vamos tomar que estamos realmente vai ser implementá-lo e olhar para as velocidades de diferentes tipos de funções dentro do array. E então seremos capazes de tomar esse tipo de velocidade e será capaz de olhar para diferentes estruturas de dados será capaz de compará-los juntos. Então é isso que vamos fazer. Vamos ver algumas das vantagens. Nós vamos estar vendo algumas das desvantagens, e nós estamos apenas indo para mergulhar profundamente em que matriz fixa é e por que você pode usá-lo. A primeira coisa que vamos rever é inserção aleatória. Então, há algo que temos que nos unir. O que vamos estar falando sempre que falamos sobre uma inserção, uma exclusão ou até mesmo pesquisar o que queremos dizer com uma inserção é se temos um conjunto de dados que queremos manter no mesmo tipo de ordem Então, por exemplo, todos os dados são importantes em todos os nossos exemplos. Então, se tivermos um um, dois ou três, não temos. Quando dizemos “inserir”, não queremos dizer “toe” sobrescreve algo chamado “replace”. Então não estamos falando de, você sabe, mudar isso para um dois. Então é 2 para 3 ou mudar este 1 para 2 ou, você sabe, você sabe, fazer o que for. Não é sobre que uma inserção está inserindo entre aqui ou inserindo em um lugar ao redor dele. Então, por exemplo, na inserção seria Este é um espaço em branco e queremos inserir um três aqui. Ou inserção pode ser que depois de um, queremos inserir um três. Então, como vamos fazer isso? O produto final? O que queremos é que queremos algo que apareça como 132 e então isso é o em busca, e isso é o que queremos dizer com uma inserção aleatória. Então, qual é a hora dessa inserção aleatória? O que será preciso se quisermos inserir algo aleatoriamente aqui? E vamos em frente e deletar ah, alguns dos elementos traseiros. Então temos algo para trabalhar aqui e aí vamos nós. Então qual é o tempo que vai levar para inserir algo em uma matriz fixa? Bem, o tempo acaba sendo O até o fim ao fim. Então, exatamente por que é até o fim? Bem, vamos dar uma olhada nisso. Este exemplo aqui meio que mostra isso. Sempre que estamos inserindo aleatoriamente, temos que assumir que não sabemos onde ele vai ser inserindo. Pode estar inserindo aqui. Pode estar inserindo aqui. Pode estar inserindo no final ou no início. Mas o que sabemos é que, a menos que seja final, teremos que mover alguns dados. Então vamos ter que pegar esses dados, e queremos desviá-los todos para caber esse outro pedaço de dados. Então, por exemplo, digamos que neste exemplo, aqui em cima temos um vamos estender isso para fora, e digamos que queremos inserir outro número que queremos aqui. Queremos inserir um quatro. O que vamos ter que fazer, que quantidade de trabalho ou vamos ter que fazer para colocar aqueles quatro lá dentro para fazer isso, nós vamos ter que pegar os três. Ou, na verdade, vamos começar o fim aqui. Então, vamos levar os dois. Vamos movê-lo, vamos pegar os três, vamos movê-lo, e então vamos pegar os quatro, e vamos inseri-lo. Então isso vai levar quantas operações vai no máximo, ele vai levar todo o array. Vamos ter que mover cada elemento sobre e, em seguida, mais a adição do novo elemento. Quantos elementos disso? Bem, essa é a nossa confiança em termos de um. Lembre-se que em é o comprimento do nosso tamanho de todas as partes de dados que estamos tentando inserir. Então, quantas operações iam fazer? Bem, todos os dados atuais vão exigir uma Operação um movimento para mover três, mover por movimento. Então isso vai ser dentro. Na melhor das hipóteses. Vai ser apenas uma constante de inserção regular, por isso vai ser apenas uma. Mas é aqui que fica complicado. Temos que olhar para a média. Qual é o tempo médio que vai levar para continuar inserindo em um gráfico ou em uma matriz aqui, e é aí que temos o nosso final escrito bem aqui. É esse o tempo médio que vai levar? É algo como, Oh, em mais de dois e você pode pensar sobre isso. Se mediarmos uma distribuição normal , colocamos em pontos aleatórios diferentes. Estatisticamente e probabilidade sábia, ele vai inseri-los no, uh, pelo menos a mesma quantidade para cada uma das células. Então digamos que o inserimos. Eu não sei, 12 vezes a probabilidade sábia, nós deveríamos chegar aqui, aqui, para baixo a lista fora de um lugar diferente para inserir. E isso significa que aqui em cima, vai demorar vezes cada vez. E então aqui vai levar menos um em menos dois em menos três e menos quatro e menos cinco em menos seis. Então vai levar tempo constante, e assim que as médias para todos eles combinados sobre o que vai, em seguida, dar-nos o nosso em mais de dois. E lembre-se, estamos falando de tempos de execução. Temos que riscar o que conseguirmos. Isto é apenas um 1/2 na frente. Então nós só riscamos. E então isso significa que nosso tempo médio acaba sendo exatamente isso dentro. Então uma inserção aleatória está no tempo. Então, o que é inserção na frente? Mas estamos falando disso, e essa é a parte lenta de nossas inserções. inserção na frente vai ser o para o N também. Deixa-me livrar-me disto aqui. Então, em certa parte da frente vai ser O até o fim. Lembra quando estávamos falando sobre o exemplo antes? Dissemos que se entrarmos na frente, seria o pior cenário. Vamos pegar tudo e movê-lo por um. Então isso vai ser o O até o fim. Agora, o que acontece se inserirmos na parte de trás? Então, vamos inserir neste lugar aqui? Bem, esta é uma inserção muito fácil. Podemos colocar um três aqui. Se quiséssemos você e o inserimos. É um tempo constante. Tudo o que é preciso é uma única operação que é tomar o número. Coloque-o dentro. Não importa quantas peças temos. Isso pode ser, você sabe, isso pode ser zero e, em seguida, 10 2030 40 50. E nesse monte de números entre eles, não importa. Nós só vamos dizer, você sabe X de 50 é igual a três e agora é igual a três. É sempre tempo constante. Então é por isso que, com uma inserção de matriz na parte de trás é tempo constante também. Agora, então, deleite em uma exclusão significa que vamos excluir o elemento. Mas temos que nos lembrar, manter a integridade. Vamos levantar todos os zeros aqui para voltar. Isso significa que temos que manter a integridade. E então o que isso significa? Isso significa que se tirarmos um sete, se removermos os sete desde o início, o que precisamos fazer é ter certeza de que o resto deles caia para trás em direção a isso. Então vamos em frente e fazer um pequeno exemplo aqui em cima. Digamos que temos um monte de números, como então temos uma matriz 1234 que é tamanho para, mas a indexação lembrar é começa em zero. Então, digamos que queríamos remover um do nosso conjunto de dados. Bem, o que quer que removamos o do conjunto de dados, não podemos deixar um espaço vazio aqui que não mantém a continuidade dos nossos dados . Se tentarmos agarrar o primeiro elemento, assumimos que, sabe, talvez tenhamos um algoritmo e sempre tentamos agarrar o primeiro elemento assim. Vai sair do ar. Não há nada lá. Então o que precisamos fazer sempre que apagamos da frente é que temos que fazer exatamente a mesma coisa. Temos que voltar, voltar trás, voltar para trás. E como você pode ver o que conversamos antes, qualquer coisa que vai exigir que nós voltemos um monte de vezes vai ser O para o fim. Delish em aleatório é também ir para o fim também. Então, se pegarmos qualquer tipo de exclusão aleatoriamente aqui, seria devido. O fim agora na matriz também tem esse bom benefício de ser capaz de excluir da parte de trás em tempo constante porque não temos que mudar nada. Então, se quisermos apagar os quatro da parte de trás, tudo o que temos que fazer é apagar. Então, em código, você sabe, pode ser algo como X de três igual a não são aspas vazias ou o que quer que seja para torná-lo vazio. De qualquer forma, é assim que é simples. É operação Zingale. Nada mais tem que entrar, então também é dever à mulher tempo constante. Então este ar este ar, o curto prazo, que eu vou usar às vezes é tempo linear. Então estes são todos tempos lineares. Este é o tempo constante, linear, constante. E eu só quero te ensinar esse voto agora porque, como eu disse, eu poderia trocá-los no futuro e dizer, Oh, para o 10 para o N Cada vez fica um pouco cansativo. Então, muitas pessoas só vão dizer Constante, eles vão dizer, linear aqueles tão exponenciais. De qualquer forma, vamos ver o nosso último. Quanto tempo leva para procurar algo? A lista de pesquisa e não classificada. Isto aqui é desordenado. Temos sete. Temos 89 10 e depois um. Então não há nenhum tipo de ordem aqui. Nós realmente não sabemos a ordem. Então, quanto tempo vai demorar? Digamos que queremos ver é um presente de nove. Bem, não há riel. Maneira rápida de fazer isso. O que temos que fazer é fazer o método da quarta força bruta. Isso significa que temos que começar aqui. Este mal é negado? Não. Passar para o próximo. Esta é a sequela hoje à noite? Não. Passar para o próximo. O single é o nove? Sim, é. Mas se estivermos, por exemplo, à procura de 90, estaríamos tipo, “ Não”. Não, não. E vamos até a lista até acabarmos. Até chegarmos a um espaço aqui que não tenha nenhuma informação. E então voltaríamos. Não, não é igual a 90. Então essa operação acaba sendo como as outras. Oh, o fim. Porque na pior das hipóteses, nós vamos ter que descer cada um destes e chegar até o fim para descobrir se ele realmente existe dentro da matriz, podemos ter sorte. É claro que às vezes pode ser no início. Às vezes pode ser dois ou três elementos dentro, mas em uma base média, o pior caso é que vai ser devido até o fim. Então isso também vai ser tempo linear. E depois a última, a última vez. Na verdade, vamos dizer para a próxima palestra porque isso vai funcionar antes, um pouco de aprofundamento na razão pela qual uma matriz de busca classificada sai para fazer login. E então você pode estar olhando para isso agora dizendo: “ O que isso significa? É por isso que vamos aprofundar exatamente por que essa busca classificou o mesmo log de fim. Mas eu só queria rever mais uma ou duas coisas nesta palestra, e então vamos em frente e saltar para aquela palestra. A última coisa que quero é saber o que isso tudo nos diz? O que isso nos diz sobre as vantagens e as desvantagens de uma matriz que podemos ver imediatamente que para armazenar dados que todos têm uma espécie de integridade para eles, talvez em uma taxa não seja o melhor para como se tivéssemos Ah, programa que precisa inserir e elite constantemente porque cada vez que inserir excluir, ele será devido até o fim, especialmente se estamos inserindo para a frente ou aleatoriamente dentro dele. E nós realmente temos outras estruturas de dados que podem fazer todos esses tempos constantes. Então talvez algo assim não seja muito importante. E algo que não está por aqui, mas temos tomado como certo é a capacidade de apenas verificar o que está em cada um desses elementos. Só posso dizer, sabe, que posso ligar, exceto três. Eu posso chamar esse elemento, e ele vai me dizer instantaneamente que 10 está lá. Isso é outra coisa que é uma grande vantagem para uma corrida. É tempo de acesso constante? Isso é outra coisa que talvez não comparemos muito com os outros. Mas chama-se tempo de acesso. Quanto tempo leva para chegar a um elemento dentro da matriz e nesta situação, todos esses tempo constante de ar? Isso é o que um tipo de array lhe dá é a capacidade de começar em algum lugar e, em seguida, ir para qualquer um desses elementos e chegar a ele imediatamente. Então o tempo de acesso é constante, e isso é muito importante. Se, por exemplo, digamos que não temos um programa que tira e insere muita informação com o programa que de vez em quando faz isso. Mas na maioria das vezes é só checar lugares diferentes. Estamos apenas armazenando informações diferentes aqui, e então nós somos como, então, os programas tipo, ok, eu preciso do número três, o que é o número três? E o número quatro? O que está no número quatro e, em seguida, está constantemente a enviar essa informação para trás e para a frente. Mas na maioria das vezes. Isso permanece entre aspas estáticas, o que significa que não muda. É aí que uma matriz pode ser útil. Temos aquele tempo de acesso muito rápido, e vai fazer tudo ir muito mais rápido. No entanto, como eu disse, se estamos inserindo na liderança o tempo todo, talvez queira olhar para uma estrutura de dados diferente de qualquer maneira, vamos saltar para que realmente precisa exemplo da pesquisa classificada, e vamos ver por que isso sai para fazer login 12. Algoritmo de pesquisa binária (pesquisa de matriz: Então vamos rever o que conversamos na última palestra. E isso vai ser a busca de matriz fixa ordenada. Então, por que isso é diferente? Por que isso nos ajuda a chegar a esse tempo de execução interessante do log em que é substancialmente mais rápido do que o O até o fim. A versão não classificada. Isso vai ser muito mais rápido do que por que quando resolvermos isso, temos essa vantagem? E isso é porque fazemos algo chamado tipo binário. Então vai ser um algoritmo de ordenação binária ou um algoritmo de busca binária. Foi mal meu. Um algoritmo de busca binária. A razão pela qual isso nos permite fazer um algoritmo de pesquisa binária é por causa da maneira que ele configurou. Então imagine a velha maneira de fazer isso. E esse é o método da força bruta. Digamos que estamos tentando descobrir se 19 existe? Então, estamos tentando descobrir que 19 existem como Então, para fazer isso com um método de força bruta, vamos desde o início. Está aqui? Não. Não, não, não. E continuamos a descer a lista. E, claro, pode não estar na lista e, portanto, temos que passar por toda a lista para descobrir isso. Ou pode estar a meio caminho da lista ou perto do fim, ou talvez logo no início. De qualquer forma, na pior das hipóteses, vai levar que toda a lista vai levar O até o fim dos tempos. No entanto, com uma pesquisa binária, podemos garantir que está em Lee indo para tomar log de tempo final e log de no tempo é como eu disse, é muito mais rápido. Lembre-se quando você está falando sobre login e os tutoriais anteriores, ele vai assim, o que significa que no início, o número fora do número de elementos que temos. Então vamos dizer que isso indo para a direita aqui, este acesso vai ser o número de elementos em que temos. E este é o tempo que leva. A pesquisa ou o tempo de execução são tempo de execução. E então o que isso vai nos dizer é que com o Mawr em que nós temos essa execução, tempo diminui de modo que em algum momento nós saímos como 32.000 e será basicamente o mesmo tempo de execução em 64.000 que é basicamente o mesmo tempo de execução que 128.000. Vai subir mais devagar e mais devagar a cada vez. E assim isso acontece por causa da maneira como a pesquisa binária funciona. Então vamos em frente e passar por esse exemplo. Como iríamos passar? Como procuraríamos uma matriz fixa? Bem, o que fazemos é ir em frente e fazer esta pequena fórmula. Chama-se esquerda mais direita para. Então tomamos a esquerda mais a direita, e então vamos em frente e dividimos isso por dois. Então essa é a nossa fórmula. Então vamos em frente. Vamos pegar isso e vamos realmente mover isso para cima porque nós vamos estar referindo muito isso enquanto fazemos isso. Então esquerda, mais, direita para. Então o que resta vai continuar e ser a parte esquerda. Vai ser o número que temos à esquerda, se isso faz sentido. Então, nesta situação, é uma matriz completa. São à esquerda, é zero e são à direita é a direita completa à direita aqui, que é o 10. Vamos pegar esses dois números, vamos juntá-los, e então vamos dividir por dois. E esse é o índice que vamos procurar no início. Então isso significa o nosso primeiro passo aqui. Vamos pela esquerda. Vamos manter os números iguais aqui. Vamos pegar a esquerda, que vai ser zero, e então vamos em frente e adicionar a direita, que é o 10. E eles iam dividir isso por dois. O que, é claro, só sai para 10 dividido por dois, que é cinco. Então, nosso primeiro passo, pegamos o índice cinco aqui. Então vamos em frente e pegamos o índice cinco. Vamos em frente, pegamos, trazemos de volta e damos uma olhada. O que é isso? Então, o que é ex de cinco? Bem, ele retorna 12. Então agora nossa próxima decisão é 12. Menos ou é maior do que o número que procuramos? Bem, 12 é menos do que o número procurava. E lembre-se, este é um array ordenado. Então, se 12 é menor que o número que procuramos, por que procuraríamos deste lado? Nós já sabemos que isso está resolvido, então quero dizer, tudo antes disso vai ser menor que 12 e sabemos que nosso número é na verdade maior que 12. Sabemos que 19 é maior que 12. Então 19 tem que estar deste lado. Portanto, tomamos este lado todo aqui e saímos. Nem sequer olhamos para ele. Não vamos tocá-lo. Nós não vamos verificar o que está lá porque nós confiamos que este array ordenado. Portanto, vamos em frente e vamos para a direita. Vamos dar uma olhada no lado certo, e então vamos fazer nossa pequena fórmula mais uma vez. Então vamos em frente e pegue a esquerda e a esquerda é agora um cinco. Normalmente, porém, já procuramos isso. Não precisamos de fazer. Olha para isto. Então nós estamos realmente indo, uma vez que é maior do que nós adicionamos um a ele. Se fosse menos do que tiraríamos um. Mas vamos em frente e começar com seis agora, então vamos em frente e ir com seis, e então vamos adicionar um, uh, uh, mais o lado direito, que ainda é 10. Divida isso por dois. E esta situação, nós realmente vamos ter um 16 dividido por dois, que vai ser igual a oito. E para que nós vamos olhar para a seção oito ou índice oito aqui, nós vamos dizer, o que é isso? Índice oito. Vamos dar uma olhada. E, claro, X de oito. Bem, isso devolve um 20. Bem, é 20 maior do que ou é menor do que o nosso 1920 é maior que 19. Então nossa segunda busca foi bem aqui. 20. Vamos dar uma olhada. Percebemos que é uma lição. Então vamos para a esquerda. E isso significa que Ei, nós não precisamos desta seção inteira aqui. Então agora vamos em frente e pegar o oito menos por um, e então vamos pegar o que sobrou. Então, a parte esquerda deste é seis. A parte certa é sete. Então vamos continuar a descer a fórmula. Então vamos em frente e pegamos os seis e depois adicionamos aos sete nesta situação, somados a sete. Então dividimos isso por dois, e temos 13 divididos por dois. Agora, isto é importante. Temos 13 divididos por dois. Com isso, normalmente fazemos algo chamado truncamento onde isso não é igual a 7,5 nesta situação . Ou, na verdade, nada disto seria 6,5. Isso não é igual a 6,5 e nós não arredondamos para cima. Não contornamos tudo. Fazemos o que chamamos de truncamento, que é apenas truncar o back-end. Seja o que for, apagamos e pegamos o número inteiro. Tomamos qualquer que seja o número no início é o número inteiro. Então, por exemplo, se tivéssemos um 7,9, ainda seria sete. Tínhamos 7.3. Ainda seriam sete. Se tivéssemos 7,98 ainda seriam sete. Isso é o que é truncamento. Então é isso que fazemos. O que quer que façamos esta fórmula. Então nós truncamos e verificamos seis. Vamos em frente e damos uma olhada no seis. Damos uma olhada no seis e conseguimos o número 17. Fazemos nosso pequeno processo de novo. Bem, nós sabemos que está certo e nós podemos realmente fazer a fórmula mais uma vez aqui e geralmente temos como um cheque. Se é o último elemento, basta olhar para o elemento dele. Está aí? Não é seguir em frente? No entanto, podemos fazer tudo de novo. Nós podemos fazer. O sete é à esquerda. Mais sete é o direito dividido por dois. Então isso é 14 dividido por dois, o que é igual a sete. Então fazemos a fórmula que verificamos é sete. Aqui é 19 igual a 19. É. Isso significa que aqui vamos em frente e vamos checar. É assim que esta fórmula faz. Leva e toda vez que o divide ao meio. E essa é a parte importante aqui. Compreender é que cada vez que dividimos o problema e 1/2 então isso significa, por exemplo, se começamos com oh, eu não sei, como 128 itens diferentes após a primeira geração estavam apenas verificando 64 itens. Depois disso, estamos verificando 32 itens e depois disso estamos verificando, você sabe, 16 e em oito e depois quatro e depois dois e depois um. E a coisa é que, porque isso dobra cada vez, o número de passos só aumenta. Aumenta mais devagar e mais lento. Então, por exemplo, cada um deles é um passo. Então nós temos 123456 e fomos para rever isso várias vezes ao longo deste curso porque é tão importante em tantas áreas diferentes. Mas o que temos aqui é que 128 equivale a 6 passos de Onley. Agora, se dobrarmos isso, se formos mais um passo adiante Então, em vez de 128 itens, temos 256 itens Will 256 só é igual a sete. Só damos mais um passo para chegar lá. E então, é claro, poderíamos descer outro, que vai ser 512. E isso é apenas qualquer igual a oito e assim por diante e assim por diante e assim por diante. Então percebemos que aquele gráfico de que estamos falando não não é tão feio. Tem um gráfico. Nós temos esse gráfico de que estamos falando, onde ele vai para cima e sobre onde o número de em que obtemos a mudança, o tempo de execução, este é o tempo de execução da esquerda fica cada vez menos e menos e menos e menos e menos ao longo do tempo. E que este padrão aqui, isto é chamado de Login. E se nós realmente aplicamos, se nós realmente colocar no log de 512 ele realmente nos pega. Ele produz oito. Esse é o padrão. Esta é apenas a maneira que os matemáticos representam. Este padrão é através de uma coisa chamada log. E é por isso que o tempo de execução sai para registrar. Porque este pequeno padrão complexo aqui, não é realmente muito complexo. Uma vez que você se conecta a um computador, é como seis linhas de código. Mas este padrão aqui realmente faz a coisa toda. Ele faz isso e corta ao meio cada vez para que tenhamos o registro no tempo. E, portanto, uma vez que podemos fazer isso lá, podemos usar essa busca binária para fazê-lo. Nosso pior caso, tempo de execução, pode ser reduzido para apenas log de n 13. 2 a 5 matrizes circulares: na última lição, discutimos um aumento e como podemos adicionar subtrair. E então também discutimos o tempo desses raios, como o quê? Todo tipo de operação, quanto custa. Então, se você quisesse responder aleatoriamente, poderíamos fazê-lo basicamente instantaneamente. Mas se quiséssemos inseri-lo na frente com respeito a, como o resto da corrida, temos que empurrar o resto do raio para trás teria que ir tudo dentro. E todos esses tipos de, você sabe, eles assumem que nós não estamos superando. As coisas que eles assumem que estamos gerenciando nossos dados de forma eficaz porque não estamos excluindo substituindo ou indo muito longe de nossos limites de array. Então, estes são basicamente os limites de matriz que criamos, mas podemos realmente melhorar em um deles, e este vai ser este aqui, o inserto na frente criando algo que é conhecido como uma matriz circular. Então, em teoria, o que estamos fazendo é a matriz e a memória sempre vai ficar assim. Sempre vai ser um bloco que vai desde, você sabe, você sabe, o início, todo o caminho até o fim assim vai ser alocado e então vai ser preenchido, e isso é sobre isso. Você realmente não pode fazer isso como qualquer outra coisa. Mas estamos teoricamente fazendo é que vamos descobrir uma maneira que podemos pegar isso chegar e nós poderíamos torná-lo em um raio circular, que é assim. Então, por exemplo, evidente agora e agora nós vamos realmente pegar este array, e nós vamos fazê-lo neste círculo bem aqui. Sobre o benefício disso é agora que se queremos inserir algo, digamos que temos 123 se quisermos inserir algo na frente. Digamos que esta é a frente. Tudo o que temos que fazer é olhar para trás e inseri-lo ali mesmo. E quão rápido com isso. Isso foi tempo constante, o que significa que podemos realmente melhorar a inserção na frente como tempo constante criando esta matriz circular. E então o que vamos fazer é que isso é um pouco difícil implementar em código, mas a teoria por trás disso não é tão difícil. Então vamos ter o que é conhecido como Ponteiros. Vamos ter um que aponte para o topo bem aqui. E eles iam ter um que aponta para o fundo bem aqui. E ambos vão apontar exatamente no mesmo lugar agora porque este de cima, este de cima, vai ser a frente da nossa direita. Vamos ter algo que nos diga que isto é a frente, e vamos ter algo que nos diga que aqui é a parte de trás. E então agora, sempre que inserimos na matriz e estamos dizendo que não estamos fazendo inserções aleatórias estavam apenas fazendo inserção na parte de trás ou inserção da frente da matriz. Então estamos inserindo na parte de trás agora, ou na frente. Ambas apontam exatamente para o mesmo lugar. Vamos em frente uma inserção, um número bem aqui. E agora que inserimos um número em nossa matriz, podemos então pegar o verso e dependendo de como você implementá-lo. Assim, por exemplo, podemos sempre inserir um mais qualquer que seja a parte traseira apontada, ou podemos apontar a parte de trás para o próximo espaço disponível. Eu vou apontar para o próximo espaço disponível então nós enchemos este agora e na parte de trás é realmente movido para cá. Então agora ele está apontando para aqui assim E então agora nós temos isso estão de volta, é apontado para aqui, e então vamos em frente e inserir outro número. Então nosso programa, nós podemos simplesmente, na verdade, se escrevermos isso em um programa, nós poderíamos realmente fazer algo assim. Poderíamos voltar X, e ele vai nos apontar para o lugar exato que queremos preencher. Então vamos X de volta igual a seis. E agora podemos colocar um seis aqui. Vamos fazer exatamente o que fizemos antes. Vamos selecionar isto aqui. Deixe-me pegar uma seleção aqui para que eu possa selecionar. Vamos pegar esse elemento, e então vamos movê-lo para a próxima parte aqui, e de alguma forma parte da minha flecha não sobreviveu com isso. Então vamos bem, parte disso eu ia ficar lá. Então o que temos agora é que a parte de trás é movida por cima de um. Então agora estão de volta é apontado aqui, e assim tudo vai bem. Mas o que podemos fazer agora é porque temos essas dicas nos dizendo para onde exatamente tudo está indo. Podemos realmente inserir a frente sem fazer um sem ter que empurrar tudo para a frente. E isso é porque em vez de empurrar tudo para a frente, vamos apenas mover o ponteiro para trás. Então vamos inserir a frente agora vamos em frente e inserir a frente. Então, por exemplo, poderíamos ir, hum, nós vamos x de frente é igual a algum número, mas você vai notar que nesta situação a frente está realmente apontada para a frente. Então o que podemos fazer é ir x de frente menos um, e isso vai nos levar para o local bem ao lado dele. O menos um ponto. E poderíamos ter feito o que fizemos com a parte de trás onde removeu e disse fazendo isso. Mas eu queria fazer os dois lados aqui, então estamos fazendo X de frente menos um é igual a sete. E então isso vai nos levar ex de negativo igual a sete. Mas isso não funciona. Não podemos acrescentar um inju negativo. Nosso raio terá uma segunda queda. Vamos sair dos nossos limites. Números negativos não aparecem em um aumento. Então o que podemos fazer e disse é que ele realmente vai fazer este algoritmo aqui onde nós vamos tomar o qualquer número é. Então nós inserimos em um negativo e nós vamos adicionar quantos, hum, hum, pontos existem aqui e então você pode ver que há 123456789 10 11 12 Porque lembre-se, isso está em menos um. Aqui, isto é em menos um. Então isso significa que o nosso em é igual a 12. Então vamos fazer é pegar o limite ilegal e vamos adicionar a ele. E neste caso, Então é negativo um mais e então estamos adicionando como 12. E isso vai nos dar a posição de 11. Então, agora, quando vamos para este negativo, nós vamos então re associá-lo, e nós vamos realmente inserir isso na parte de trás, certo? Assim, insira este sete aqui na parte de trás do raio. E agora o que vamos para Dio é pegar esse elemento e vamos arrastá-lo até aqui assim E agora a frente do nosso raio é Deixe-me ir em frente e correr até lá para não chegarmos a nenhuma flecha aqui. Então agora a parte de trás ou a frente da nossa taxa está na verdade na parte de trás da nossa direita, e então isso fica um pouco confuso. Você está tipo, o que é a frente? O que é a parte de trás? Então nós temos que não pensar nisso assim, nesta linha reta mais. Temos que pensar nisso como se estivéssemos enrolando isso em círculos. Então nós estamos fazendo é fazê-lo para emular essa onda é que nós estamos realmente tomando a frente e a parte de trás nós estamos mantendo o controle deles, e isso nos permitirá inserir em ambas as posições, apenas chamando um certo número e inserindo Lá. E isto vai continuar por aqui enquanto este vai continuar por aqui. E, claro, você pode chegar a um ponto em que eles começam a se sobrepor um ao outro. E mais uma vez, isso não é algo que estamos tentando lidar com você. Isso é um erro. Se alguma vez tiveres a tua frente e as tuas costas tipo de tentar atacar exactamente a mesma área. Isso é um erro da sua parte na implementação do seu programa e terá que ser abordado em algum lugar. Mas isso não é sobre o código. Isto é sobre a teoria. Então, com isso, o que criamos aqui com este raio circular adicionando os ponteiros dianteiros e traseiros e, você sabe, eles poderiam ser apenas variáveis que literalmente nossos números. Então podemos dizer agora frente é igual a 11. Enquanto nós poderíamos dizer volta é igual a dois e então se nós alguma vez quiséssemos inserir, nós poderíamos apenas ir x de volta como nós fizemos lá em cima é igual a algo. Ou podemos ir x de frente menos um. E eu fiz ambos o menos um e o exato nisso porque, como eu disse, eu só queria mostrar os dois caminhos, mas você pode querer mantê-los meio parecidos. Hum, então deve ser para trás menos um e frente menos um ou para trás e para frente. Será confuso se um deles for diferente do outro. Mas o que estou tentando dizer aqui é que temos essas variáveis e são muito fáceis de acompanhar. Depois de criarmos algo, dizemos “frente” mais um “traseiro” mais um “ou o que for”. Nossa frente menos um atrás mais um e então podemos continuar ligando. Começando na parte de trás, na frente deste raio, nós o tornamos circular. E através de tudo isso que criamos, podemos riscar o o de dentro e com um raio circular são tempo de inserção realmente se torna o de um. 14. 2 a 6 matrizes dinâmicas: até este ponto, nós meio que ignoramos um caso importante. E esse é o fato de que um aumento pode encher e o que fazemos, ganhar um aumento, encher. Nós temos discutido antes deste ponto basicamente o que são conhecidos como arrays fixos, que são levantados para que uma vez que eles chegam ao fim, uma vez que eles estão cheios de capacidade, nada mais acontece. Você vai ter que sobrescrever alguma dúvida, um subsídio para apagar alguns dados. De alguma forma, um compromisso terá que ser feito. No entanto, há uma espécie de matriz que pode crescer com o seu programa, e isso é chamado de matriz dinâmica. E então o que vamos discutir nesta palestra é o aumento dinâmico de como eles funcionam e alguns dos tempos de execução que podem estar associados a tal aumento. Então a primeira coisa que precisamos entender é que um lado e Ray fica cheio. Então vamos dizer que temos em um raio bem aqui e uma vez que ele fica cheio de números ou pedaço de dados. Então nós temos, tipo, um três aqui um dois, talvez um 1 1007 você sabe, não importa uma vez que está cheio. Assim que o nosso Ray estiver cheio, o que fazemos para acrescentar a isso. Tudo bem, então se nós, você sabe, rotular aqui em baixo certas áreas aqui. Então nós temos a coluna 01 234 A única outra maneira que nós podemos adicionar a isso é que nós temos que sobrescrever algo. E se quisermos adicionar ao fim, então chegamos a um grande problema porque não podemos adicionar ao e não há fim. Ele vai dizer, hum, por exemplo, se você tem um programa que apenas incrementa ID por um cada vez, nós queríamos adicionar ao final. Quando chegarmos a este ponto e tentarmos adicionar ao fim mais uma vez, vai ter uma segunda queda. Nós vamos ter algo como, você sabe, hum, hum, nós temos que somar a ex de cinco agora é igual a sete. Isso não vai funcionar. Isso vai acabar em uma falha, porque não há cinco aqui. Não há cinco à direita aqui, então ele vai tentar tocar dados que ele não tem a capacidade ou o conhecimento de tocar,o tocar, que vai colocar falha no programa. Vai sair do ar e nunca vai executar. Então, o que fazemos nesta situação? O que podemos fazer é aumentar dinamicamente o tamanho da matriz. Agora o problema é que, uma vez que um array é criado, o tamanho é criado. Se você se lembra, volta a ter uma memória foi criada, por exemplo, nós tínhamos um monte de segmentos e digamos que em cada um desses segmentos ele criou este array bem aqui. Mas o problema é que este é segmento já foi atribuído e depois disso foram dados adicionais . Então você não pode simplesmente aumentar o tamanho da matriz. Isso não funciona porque você estaria substituindo alguns outros talvez dados críticos do sistema aqui . E isso é um problema. Não queremos fazer isso. Então, o que você pode dio é em vez de apenas adicionar ao final, você pode fazer um novo array e copiar todas as informações lá em um novo, maior array. E então essa é a técnica comum que normalmente é usada. E assim lá. Você sabe que há um par de maneiras diferentes de fazer isso. Digamos que em vez de um cinco, array queria adicionar um ao final. Então agora o que temos que difundir é vamos nos criar em um raro bem aqui. Digamos que é em vez de cinco intolerantes, seis grandes. Então está aqui. Aqui, aqui, aqui, aqui estava o 123456 Ok, e então então nós copiamos sobre um dado. Então nós temos três e isso segurar o problema aqui é que o que nós temos para criar um novo array? Porque o que acabamos de falar, não podemos aguentar mais tempo. Então temos que criar um novo array, mas não há aumento vazio. Agora nós vamos realmente ter que entrar e pegar cada pedaço de dados e copiá-lo . E quando fizermos isso, o que vai acabar sendo é que vamos ter que fazer uma transação. Então um custo aqui é três, então um custo para obter o custo 21 para obter o custo 11 para obter o custo 10 1 para obter o sete e, em seguida, a inserção aqui. Então, por exemplo, vamos criar uma inserção. Agora ele cria ex de cinco. Dissemos que era igual a sete. E assim nós temos que sete inseridos. Mas você vai notar que em vez da inserção normal até o fim com que estamos lidando, lembre-se, de volta em tudo isso, dentro para trás deve ser tempo constante. Então o Ray dinâmico o problema é que quando tentamos inserir na parte de trás de um array que já estava preenchido, adicionamos um adicional, mas levou tempo. Por que demorou a tempo? Porque aqui em números há 12345 Então nesta situação estão no nosso em igual a cinco . Mas tivemos que tomar. Adicionamos um aos nossos fins com um R N que se tornou seis, e foram necessárias seis operações para copiar tudo. E então imagine se isto fosse uma matriz de, digamos, 100 destes aqui. Levaria 100 operações para copiar tudo. Então isso significa diretamente proporcional ao número de números que temos aqui. O quão maney temos aqui. Isso é exatamente quantos, hum, operação vai demorar. Então, em vez de nosso odor rápido primeiro, ou são tempo constante não é mais que esta inserção realmente se torna o de tempo final, e isso é um problema porque inserir em uma corrida deve ser rápido. Essa é uma de suas vantagens. No entanto, se chegarmos ao fim do tempo do que algumas de nossas outras opções começam a se tornar muito mais apetitosas, porque não temos mais inserções instantâneas. Então, o que vamos fazer? Na verdade, há uma maneira de contornar isto. Há uma maneira de você não ter que fazer essa implementação para que você não precise alterá-la até o fim. Você pode manter relativamente isso aqui, e tudo se resume a algumas médias. Então, digamos que em vez de fazê-lo da maneira ingênua, que seria inserir uma nova caixa toda vez. Então, se precisarmos de seis, levaríamos nós inseriríamos uma caixa aqui no final, que fizemos aqui mesmo. E se precisássemos de um, criamos um novo array aqui embaixo, e então ele tem você sabe, B B 7 grande, e poderíamos continuar fazendo isso. Mas tudo o que o tempo que fazemos que se torna devido ao fim, então podemos fazer em vez enfraquecer fazer em vez disso é o dobro do tamanho da matriz agora. Então, se você tem um array que foi criado, vamos passar pelo tipo duplo de gráfico aqui. Então você tem uma matriz. Agora está preenchido com um. Agora você insere até o fim. Agora, agora nós dobramos. É muito que quatro de oito em 16 de 32 em 64 1 28 e assim por diante. Vai para cima que estamos fazendo para Exponential está aqui para fazer o X bem aqui em cima. Isso é o que estamos fazendo aqui é cada vez que os foguetes se encheram, vamos dobrar o tamanho da matriz e a maneira que a razão que isso ajuda é porque se você vai notar que há uma quantidade decrescente de tempo que temos que usar sobre o fim. Então, por exemplo, você verá que em cada um desses pontos, tem que ser O até o fim. Nós temos que você. Temos que copiar todos os dados a partir do acima. Temos que copiar os dados anteriores para o novo. Mas você também percebe algo aqui é que há uma quantidade crescente de distância entre cada um desses números. Cada vez mais, está ficando mais longo, que significa que se não precisarmos redimensioná-lo, não teremos que redimensionar aqui ou aqui. que significa que entre, por exemplo, 65 65 a 27 não temos que redimensioná-lo, que significa que todas essas operações são uma estrada para uma, porque estamos apenas fazendo inserções regulares naquele ponto. Então esse é o tipo de o que isso aqui representa o inferior bem aqui é o que eu estou representando aqui é que estamos pegando esse tamanho e em vez de ter cinco, estamos dobrando para 10. Então agora copiamos os dados aqui e vamos para três, 21 10 107 e no sete. E agora, em vez de ter que fazer sobre o final para as próximas quatro operações, esses anúncios serão todos oh, para o único porque nós não temos que redimensioná-lo enfraquecer. Basta inseri-lo como uma matriz normal. E assim este foi o “O” até o fim. E então se o trouxermos de volta, se olharmos para aqui, podemos pensar sobre isso para que este tenha sido o até o fim para inserir, e então teve que dobrar. Então este teria saído até o fim. Mas então temos um lugar de 02 com um oh para o um e então teríamos um duplo. Este foi cinco. Deve ser quatro. Se estamos fazendo isso dessa maneira, vamos ver que ele começa a ficar cada vez mais quantidade de O para os uns. E por que isso é tão importante? Porque isso significa que em vez de toda a nossa operação ser O até o fim, podemos realmente criar uma espécie de média. Então vamos dar uma olhada nessa média. Então nós entramos aqui e vamos passar por alguma criação simulada aqui. Então nós temos uma inserção 23456 Eu só vou descer a lista aqui. Vamos criar uma pequena mesa aqui. De todas as inserções possíveis que poderíamos fazer até certo ponto e você começará a ver o padrão aqui, você começará a entender por que isso é realmente bom para fazê-lo para dobrar a matriz dinâmica , e Vamos subir para 25 aqui mesmo. Nós estamos realmente vamos subir para 32 porque esse é um dos nossos bits são um dos nossos pontos duplos . Certo, então quando inserirmos 12 aqui, será uma operação constante. Temos uma matriz. Vamos criar a nossa direita e vai ser tamanho F. Então isso vai ser constante vai ser um aqui mesmo. Agora, uma vez que você chegar a este ponto, vai correr para o espaço, então nós tivemos que dobrá-lo. Então agora é muito grande. Então esta era uma ode à operação, que, na verdade, era um não a uma operação porque só tínhamos uma parte de dados que tínhamos que transferir . Mas tecnicamente é uma ode até o fim, por isso vamos sentar-nos sem ti lá dentro. Agora temos um espaço aberto aqui, então se você pensar sobre isso, eu vou desenhar o quadro aqui um pouco no início para ilustrar o que estamos fazendo aqui. Então, tínhamos um lugar. O problema era que queríamos inserir um 2º 1. Não há mais vagas. Então o que fizemos foi duplicar copiar os dados. Então agora há pontos suficientes. Agora queremos ir para o três. O problema é que, quando chegarmos a três, temos de o duplicar de novo, porque não há vagas disponíveis. Agora vamos dobrar de novo, e vamos encher essa insulina vai ser outro O até o fim. Mas agora o número quatro para preencher o quarto lugar, está aberto, então podemos ir para o que não temos que fazer dobrando este lugar aqui. A taxa spot aqui está aberta, e então continuamos, e notamos que cinco precisarão ser dobrados porque corremos nas vagas para podermos ir em frente e duplicar de novo. Copie todos os nossos dados para o novo array. E então agora vamos em frente e remover a ambiguidade ali mesmo. E agora temos todos os nossos dados. Os nossos dados neste momento estão a preencher este e este e este este este um e cinco, e agora, uma vez que vamos lutar. Então as cinco operações que um nos levou foram até o fim, e agora, quando chegarmos ao seis aqui, podemos preenchê-lo imediatamente. Então ir para o 17 é exatamente o mesmo caminho sobre o um e são lugar tem oito lugares. Então é o até o fim bem aqui ou o meu mal, o meu mal. Ainda é mais um com um porque temos um espaço aberto aqui com outro O para um. Então agora temos a totalidade do array preenchido mais uma vez, este é 12 12345678 Ele está preenchido, e agora temos que dobrar mais uma vez, então nós dobrá-lo novamente. E agora o que temos que fazer é criar um não para a operação em operação, e eu vou continuar desenhando agora porque agora você pode ver um padrão. Aqui está, então nós dobramos. E agora é bom até 16 vagas, então poderíamos sair com um. Oh, aquele com um. Podemos continuar até chegarmos à próxima parte dupla. E agora estamos em 16. Então agora é ir para o fim, e então vamos continuar tempo constante, tempo constante, tempo constante, tempo constante, tempo constante, tempo constante, tempo constante. Não vou mais escrever o Theo. Eu só vou corrigir os tempos constantes constantes, constantes, constantes, constantes, constantes. E, em seguida, até se fizemos 32 constante 33 dentro e assim por diante. E por que isso é importante? Bem, você vai notar no início, que tivemos um monte de operações de O para o N. Mas depois disso estava ficando cada vez menos assim até o fim. E cada vez mais cabine de log ou cada vez mais, mawr tempo constante. Nós, por exemplo, aqui temos três constantes de um tempo linear. É assim que se chama. Vamos começar a chamá-lo linear um tempo linear, em seguida, um monte de tempos constantes, um tempo mais mabrio do que uma quantidade extraordinária de tempos constantes do que uma vez. E o que acontece é que, ao longo do tempo, esses tempos constantes ou não constantes, esses tempos lineares vão ficar em desvantagem numérica. Eles vão ser superados. E isso é porque o fato de que estamos dobrando cada vez, então quando dobramos, estamos criando um log de ocorrências rítmicas de O até o fim. Então estamos criando uma ocorrência como esta que você pode ver essa leitura. No início, temos um monte de gente livre do começo. Temos um monte de diferentes. Ele vai de, tipo, tipo, zero dedo do pé. 1234 chamadas de logado. Mas depois disso, cinco chamadas estão aqui. Seis chamadas para vir para cá. Sete chamadas está completamente fora do ecrã. E assim fica cada vez menos ao longo do tempo. E tudo isso se resume a um tipo importante de, um, uma realização importante. E isso é deixar-me ir em frente e fazer alguma coisa aqui. E esse é o fato de que se dobrarmos cada vez que dobrarmos, o que estamos realmente fazendo é criar log de no tempo, um log de uma média de quatro nossas extremidades, que significa que esse tipo de entra em algum pouco de um truque O Matthew. Então, eu só vou dizer isso para você e apenas meio que entender. Talvez anexemos um documento que entenda um pouco mais. Mas o que acontece aqui é aquele log de fim, porque em está associado a isso, porque nossas chamadas, porque nossas chamadas para porque nossas chamadas para terminar começam a entrar em um log de in. Podemos reduzir isso a tempos constantes. A média torna-se tempo constante, que significa que o pior cenário geral torna-se, para todos os fins intensos, tempo constante. Agora é um toque acima dotempo verdadeiro e constante, tempo verdadeiro e constante, mas para fins relacionais compará-lo a outras coisas que podemos entender e enfraquecer. E acredita-se muito amplamente que esta inserção se torna tempo constante. E assim, através de tudo isso, você só pode pensar nisso. Há algumas maneiras diferentes de implementar um array dinâmico, mas há uma maneira muito eficiente de fazê-lo. E vocês notarão que muita ciência da computação tem coisas assim onde há uma maneira muito eficiente de implementar esses projetos e esses padrões. E há uma maneira muito ineficiente. E assim, nesta situação, dobrar em cada vez é muito suficiente no fato de que ele sai para o tempo constante todo o caminho no final por causa dessa mudança rítmica log. E é por isso que é compreensivo. A matemática é uma espécie de importante, porque através disso, Matthew poderia entender que quando você cria essa média longa de cadeias ao longo do tempo que sua operação realmente meio que média para o tempo constante, e que seria a maneira mais eficiente de fazer isso. Então isso é arrays dinâmicos e um pouco da teoria por trás deles. Um pouco de matemática por trás deles e apenas uma boa introdução ao trabalho dinâmico e como você poderia criar uma taxa dinâmica, que é apenas criar uma nova e, em seguida, duplicar o tamanho e, em seguida, preencher todos os informações em cada vez que dobra. Então esses são dinâmicos elevam sua realmente, muito legal porque eles removem parte dessa limitação do tamanho do espaço ter que ser constante , e eles permitem que você tenha um monte de flexibilidade ah em sua programação. 15. Revisão de dois a 7: Então nós cobrimos muito sobre um aumento em apenas estas últimas palestras. E então eu meio que queria apenas dar um passo para trás e apenas rever tudo de novo muito rapidamente e meio que amarrar tudo isso juntos em 11 vídeo. Então, nós vamos estar indo para cima rapidamente. O que aprendemos nas lições anteriores tipo de re, você sabe, re ilustrando o que aprendemos e, em seguida, apenas amarrando todos esses aspectos juntos para que possamos realmente ter uma boa compreensão de um aumento, como eles funcionam o que seus tempos de execução, etcetera. Então a primeira coisa que precisamos fazer é lembrar como a corrida funciona. Então raise são apenas um ponto de dados dentro de nosso disco rígido ou nossa RAM ou algum outro ponto do nosso computador. E esses dados são trazidos para um segmento em sempre que criamos um array estavam apontando para o pedaço de dados como um todo, e estamos dando um nome a ele. Então, por exemplo, ele tem um endereço físico, um endereço de computador, mas podemos estar apenas declarando-o como uma variável como, digamos, X é igual a uma matriz do que é um comprimento de classificação cinco. E assim, nesta situação, podemos estar declarando nossa matriz de do nome de X enquanto na conversa de computador. É encontrar um endereço de lugar específico e memória, e então uma vez que chamarmos esse endereço, ele vai nos trazer para o próprio array. E a matriz tem esses muitos nomes, que eu gosto de chamá-los, que são apenas o tipo de parte da matriz que queremos contatar. E então nós podemos entrar em contato com todos esses e eles geralmente são como eles podem até mesmo ser colocados no final bem aqui. Então isso pode ser zero, etc. No entanto, o computador faz esse tipo de fora do escopo deste curso, Mas o computador fará sua coisa para que possamos acessar cada um desses pontos instantaneamente apenas dando-lhe seu nome completo. E depois são muitos nomes. Então, nesta situação, se quiséssemos, se preenchêssemos a taxa de dados e sem pecado aqui, então, por exemplo, nós temos, você sabe, apenas alguns números aqui, e queríamos pegar um ponto específico ou um lugar específico aqui. Tudo o que temos que fazer é apenas dar-lhe o nome e, em seguida, o mini-nome nesta situação, também. E depois recuperaremos os resultados. Então, por exemplo, isso seria configurá-lo para 10 e, em seguida, para obtê-lo de volta, nós diríamos que nós apenas chamá-lo e ele iria chamá-lo de volta e ele iria nos dar 10 porque iria. Este é o seu nome principal. Está pegando seu nome crina. Ele é usado em seus muitos nomes, e então ele recebe nosso pedaço de dados assim e assim um aumento também pode ter propriedades adicionais , o array nesta situação. O que estamos fazendo é, na verdade, estamos indo de um para o outro, e estamos chamando arbitrariamente dizendo que deve ser 10 3 deve ser 44. No entanto, se você quiser adicionar um pouco mais de um estilo uma estrutura para isso, podemos começar a adicionar para trás ou adicionar para a frente e apenas por si só. Nessa situação, começamos a entrar no problema em que, se quisermos adicionar à frente, teremos que pegar todos os nossos dados e desligá-los por um, porque não há nenhuma maneira associarmos. Mas esta é a frente. Este é o fim. Não podemos ir para um negativo. Negativo é uma falha da SEC que não existe no nosso programa. Então teríamos que mudar tudo para baixo. E isso traz um problema para que possamos consertar isso. O problema é que podemos começar a criar uma espécie de aspecto mais honore. Então, se quisermos torná-lo circular, lembre-se, isso foi ensinado a Se você quiser torná-lo circular, nós apenas adicionamos um ponteiro frontal e um ponteiro traseiro nele e isso irá emular uma matriz circular . Ele irá emular este tipo de coisa onde o array é realmente circular em que ele vai se você quiser adicionar à frente tudo que você tem a fazer é mover um para a esquerda, indo para a parte de trás. Tudo o que você tem que fazer é mover um, ou nesta situação, sentido anti-horário ou no sentido horário. Se você quiser adicionar para a parte de trás e assim podemos, em seguida, mover esses ponteiros o que está em tudo podemos, em seguida, mover esses ponteiros de uma área para a próxima. Se assim escolhermos assim, uma vez que adicionamos um elemento aqui. Podemos associar a parte de trás aqui. Podemos associar a parte de trás para aqui. E então podemos adicionar para trás em tempo instantâneo e adicionar para a frente e tempo instantâneo também . Mas então nos deparamos com o caso em que, por exemplo, são matriz pode ficar sem espaço. Então, por exemplo, podemos ter esse direito, e pode ficar muito grande. E então, se nosso raio acabar ficando muito grande, o que podemos realmente dilatar é que podemos ir em frente quando podemos dobrar seu tamanho. Então isso o torna um array dinâmico, enfraquecer realmente, qualquer maneira de torná-lo maior? Poderíamos fazê-lo ir, por exemplo , adicionar um ao fim. Mas aprendemos que isso não o torna eficiente. Isso faz com que seja realmente ineficiente. Então, se tivéssemos uma matriz de para, assim poderíamos dobrar o tamanho uma vez que alcançamos um ponto inválido e poderíamos torná-lo um array de quatro como este e continuaremos dobrando para cima e para cima, e veremos que ele vai ficar maior lentamente e maior e maior para caber nossos dados ao longo tempo, e isso nos permitirá criar uma tabela ou um array, que ao longo do tempo adiciona uma inserção do final de O de um por média. Então nós vamos ter um par de instâncias essas instâncias bem aqui onde ele vai ser em que vai ser um tempo linear em cada uma dessas instâncias, e isso apenas chega ao fato de que nós temos que copiar todo o nosso conteúdo de cada vez re dimensioná-lo. Temos que copiar nosso conteúdo do A mais antigo para o novo raio e depois adicionar nosso número adicional . E então toda vez que temos que expandir isso, nós vamos acabar tendo que copiar tudo, que vai ser em, hum, procedimento. Então vai ser um procedimento em cada vez que temos que fazer isso. Mas se dobrarmos cada vez que este procedimento se torna cada vez menos comum até que ele sobe em um ponto infinito no qual basicamente se torna, nós vamos ter que redimensioná-lo. Nós vamos ter que usar quase zero vezes então pensando se nós formos para o infinito em algum momento, haverá um momento em que nós estamos usando, você sabe, você sabe, um 1.000.000.000 de operações constantes e, em seguida, uma em operação. E se você pegar um e dividi-lo por um 1.000.000.000 você obtém um número tão pequeno que poderia muito bem ser zero. E por causa disso, calcula que as extremidades à medida que vão para o infinito, as extremidades aqui à medida que vão para o infinito, na verdade acabam se tornando zero, e elas se tornam basicamente inúteis. Não olhamos mais para eles. Então nós apenas olhamos para aquele tipo de um fora, e esse é o uso constante do tempo constante. Então, se dobrarmos nosso aumento A cada vez que eles ficam sem dados, podemos obter uma inserção de tempo constante na parte de trás, e isso torna nosso programa muito mais eficiente. Então isso é apenas uma espécie de resumo do que temos vindo a cobrir nestas últimas palestras sobre um aumento, como você pode torná-los circulares, como você pode torná-los dinâmicos, e em algumas das vezes associar-se a cada desses raios. Então isso será testando esse tipo de dados no próximo tipo de lição, onde nós estamos realmente fazendo um pequeno teste aqui apenas tipo de certificar-se de que tudo isso é cimentado em suas mentes e você entende pelo menos o básico. Você não tem que entender tudo isso 100%. Muitos cientistas da computação não entendem tudo isso 100%. Só queremos ter uma boa compreensão disso para que se esquecermos alguma coisa, possamos ir procurá-la. E temos uma base boa o suficiente para entender o que não entendemos. Se isso faz sentido, entendemos a parte que estamos tendo problemas para olhar para cima. E se entendermos um pouquinho, se tivermos uma base que possamos continuar nosso aprendizado. Estou animado que chegamos tão longe que nós começamos a aprender sua primeira estrutura de dados em um aumento, e eu mal posso esperar para vê-lo na próxima unidade onde vamos discutir listas vinculadas listas vinculadas 16. Exemplos do mundo do real 2-8: Agora que temos uma boa compreensão de um raise e como eles teoricamente funcionam, vamos olhar para alguns exemplos do mundo real de onde podemos ter interagido com uma matriz sem sequer sabê-lo. O exemplo mais comum, ou algo que é usado muito comumente é em nossos smartphones. Ah, muitas vezes as listas aqui e o tipo de layout APP são todos baseados em matriz. Então o que eles fazem é uma tempestade em um aumento. E sempre que você clicar sobre isso, ele chama o comando qualquer array que você tem. Então, por exemplo, vamos ter esta grade aqui à direita. Você pode ver que temos 12345678 todo o caminho para baixo. E esta é a matriz. Os números em cada um deles são armazenados em um desses arrays. Então, o que temos de clicar num botão? Então, por exemplo, se clicarmos na taxa do Facebook aqui, que alinha com o número 10, ele vai para a matriz e procurar o comando em 10 . Uma vez que ele vê que o comando em 10 está aberto no Facebook, ele vai abrir o Facebook, e nós vamos fazer o mesmo com se tivéssemos 15. Vai voltar para cima. Tínhamos 19. Vai para o local, etc., etc. Então o que ele faz é quando ele constrói, ele cria um array com um monte de referências do que ele deve abrir. E esses raios também têm outras informações. Como o quê? O ícone deve ser as cores. Você sabe, um, e outro tipo de informação que funcionaria com cada um desses, o nome do APP, coisas assim. E então sempre que clicamos nele, ele entra e encontra a peça real do software para abrir sempre que clicamos nele. E aqui também temos uma lista. Muitas vezes estes são criados com um aumento, então você terá a matriz de contas, que terá um monte de coisas diferentes aqui. E então você terá a matriz geral que terá um monte de propriedades diferentes aqui também. A razão de matrizes funcionar. O melhor aqui é por causa de como eles são instantâneos. Então, quando clicarmos em 18, não queremos nenhum atraso entre isso. E se clicarmos em um, aprenderemos sobre outra estrutura de dados na próxima lição, que leva mais tempo quanto mais você for. Então, por exemplo, se houvesse 45 APS, não queremos que o número 45 demore mais que o número um. Queremos todos no instante. O mesmo com aqui quando clicamos em algo, queríamos ser exatamente ao mesmo tempo. E, como estivemos falando sobre um aumento, temos essa habilidade. Você pode chamar a matriz de dois ou quatro ou 10 e obter esse elemento instantaneamente, e é por isso que eles são tão importantes. E eles são muito importantes para usar. Se você quiser ver o que algumas das chamadas para um aumento podem ser em diferentes idiomas, há realmente um artigo realmente necessário na Wikipédia sobre ele. Mas há uma tabela incrível aqui e você pode ver todas essas línguas, e cada uma delas tem uma matriz de alguma forma, forma ou forma. Aqui está uma espécie de os grandes jogadores na programação bem aqui você tem você sabe, seu rubi, seu python, seu javascript, Java C C plus então realmente, os grandes jogadores no mercado e eles são todos chamados com o nome da matriz e no número de índice Então, por exemplo, isso pode ser matriz AP, e então este é o índice 10. Então isso seria uma chamada de APP Array 10 e chamaria tudo dentro disso, então isso é apenas uma maneira interessante de olhar para ele. Você pode ver que mesmo que todas essas línguas sejam tão diferentes umas das outras, se todos eles usam um aumento de alguma forma, ou alguma forma outro uso comum de um levanta com bancos de dados com bancos de dados realmente, realmente grandes, Às vezes, eles não são armazenados em um aumento, eles são armazenados em maneiras ligeiramente diferentes, como árvores ou coisas assim. Só porque uma vez que você tem uma matriz tão grande, você gosta de bilhões, ele fica um pouco tedioso e um monte de ram tem que ser armazenado se você quiser armazenar todos aqueles instantâneos. Então o que eles fazem é criar coisas que são quase instantâneas, mas que vão levar um pouco mais de tempo. Mas isso é para explicações posteriores. Isto, porém, é o que em um raio pode parecer. Se você tem um menor ou mesmo apenas tabelas dentro de um banco de dados, eles estarão usando um aumento. Então, por exemplo, se quiséssemos classificar por utensílios de cozinha, poderíamos pegar todos aqueles que igualam utensílios de cozinha e depois ligar de volta. Will poderia fazer talvez uma lista de todos esses números, e então passamos para uma função, e então ele só chama todos esses números. Então, por exemplo, para estaria em nossa lista e, em seguida, 13 e 14 estarão em nossa lista. E quando ligamos para 13 14 nós poderíamos construir outra lista com apenas utensílios de cozinha para que pudéssemos filtrar esta lista. Arrays também são comumente usados na Web. Este é realmente um dos meus sites que eu tenho, e isso está usando WordPress. Mas com a parte legal sobre isso é que eu passei pelo código e cada parte deles está realmente usando uma matriz de alguma forma ou forma basicamente o que ele faz que chama todos os artigos como uma matriz. E isso os coloca aqui, assim como nosso exemplo de aplicativo anteriormente. E sempre que você clica em um desses, ele chama as funções, os nomes que tudo o que vem com ele, e meio que passa por isso. Então estas páginas web Facebook, Twitter eles todos usam um aumento de alguma forma ou forma para mostrar os dados. E então também, eu queria mostrar alguns dos códigos de back-end aqui. Então isso é na verdade algum código do site, e esse material é muito, muito complexo. site, e esse material é muito, Eu nem entendo isso tão bem. Leva um pouco de tempo para entrar aqui e começar a entender as coisas. Mas uma das partes legais é que você pode ver bem aqui. Este é um formulário de comentário sobre WordPress. Ele constrói na matriz. Ele cria uma matriz de todas as informações que ele coleta a partir do comentário. E é usado bem aqui. Você pode vê-lo. A matriz é declarada aqui. E, na verdade, há Honore aqui em baixo e matriz aqui em cima. Há raios de em um aumento em uma corrida. Como eu disse, muito, muito complexo. Este código é uma espécie de bobagem, a menos que você realmente olhe através dele e tipo de passar horas, horas e horas e horas analisando-o . Mas eu só queria mostrar a vocês que uma matriz está presente em tudo isso também. Então, em qualquer lugar que você olhar que tem a ver com a codificação de um aumento nosso lá presente e eles estão sendo usados um aumento são quase o mais. Faça isso se não for a estrutura de dados mais usada lá fora. Então, compreendê-los muito bem e, em seguida, entender alguns de seus benefícios como eles são rápido tempo de execução, tipo de mostrar a você por que eles são usados no mundo real com tanta frequência. 17. 3-1 nos nós: Então, antes de entrarmos em listas vinculadas, precisamos entender o que são vinculados lista composta do que eles são feitos? E então nós vamos estar falando é sobre o que eles foram tirados. E há chamados de nós. Então, o que é exatamente um bilhete? Uma nota é realmente apenas um objeto de localização. É um objeto que faz referência a outros objetos, e isso pode ser um pouco de uma definição confusa. Então vamos em frente e tipo de escrever isso. Vamos ilustrar o que é uma nota. Então, estas caixas aqui em baixo, estas duas caixas no fundo, esta à esquerda, uma à direita, seriam contadas os nossos nós. E aqui em cima temos memória. Então eles podem ser uma matriz. Pode ser o Ram. Pode ser qualquer tipo de memória aqui em cima, mas o que eu sei é que tem um monte de propriedades diferentes sobre isso. Então, por exemplo, poderia ter, hum, vamos com, como normalmente tem uma propriedade de dados. Então essa é a propriedade importante. Por exemplo, ele poderia ter um pedaço de dados como este, e talvez este tenha um pedaço de dados como este, mas eles geralmente não estão dentro da nota porque isso é apenas suposto ser como um objeto de localização. Então o que o nó realmente faz é que ele tem um ponto para os dados no topo, e então ele tem outro tipo de características da parte inferior, que nós vamos passar por aqui em um segundo. E esta parte superior dos dados, na verdade contém o endereço para um ponto de memória. Então, por exemplo, digamos em nossa memória, aqui temos, hum nós temos essas áreas e isso não é um array estes ou eles apenas, você sabe, há memória adicionalmente aqui e aqui e estes ar apenas pontos reais na memória. Então, como este é F zero. Este é o Fum. Este é F dois, e este é F três. E então o quê? Ele está realmente armazenando aqui, é armazenar a localização dos dados para que ele não precisa estar em ordem. Por exemplo, este poderia armazenar zero x f três. Então ele tem um ponteiro que basicamente aponta para este pedaço de dados. Bem, este aqui poderia talvez armazenar zero x f um e então ele vai ter isso significa que Pointer está bem aqui. E assim agora sempre que queremos nossos dados sempre que um dos nossos dados do nosso nó. Então, se quisermos os dados dos nós, o que podemos fazer é chamar o nó, e então qualquer que seja sua parte de dados é chamada e ele vai nos dar ele vai e fazer o trabalho para nós. Ele vai encontrá-lo e depois devolvê-lo para nós. E então a parte importante sobre nós e a razão pela qual eles são usados com tanta frequência é porque eles têm outra característica especial. E eu vou usar este fundo galáxia Penda mostrar esta característica, e esse é o fato de que eles têm a habilidade de se conectar um ao outro. Então, por exemplo, poderíamos dizer que... Bem, digamos que temos um estreito vindo aqui e temos uma flecha saindo aqui. Poderíamos ter aqui algo como um próximo, então poderíamos ter uma próxima parte de cada um desses nós. Poderíamos ter uma parte anterior para um desses nós e estes podem realmente ser qualquer coisa. Isto pode ser a frente. Nós saímos da frente em um desses lados que sempre apontará para a frente. Podemos sempre apontar para a parte de trás. Poderíamos ter sempre apontar para locais específicos, mas uma técnica comum é o tê-lo anterior e frontal. E então vamos em frente e apenas para a direita que um pouco claro anterior, próximo. E assim cada um destes tem anterior e seguinte. E então o que acontece é que nós contamos. Onde o próximo deve ir quando podemos apontar para outro nó? E nessa situação, poderíamos apontar para uma nota anterior, e esse nó anterior pode apontar nessa direção para trás como então deixe-me. Foi um ar ruim. Deixe-me ler toda essa flecha para que ela possa apontar para trás assim e então esta pode apontar para frente, que está bem ali, e pode ter uma flecha que aponta para trás em direção a ela, assim assim. E então o que isso faz é criar uma lista vinculada, e isso é o que vamos discutir é que estamos usando esses caras esses nós aqui para criar listas vinculadas, e então vamos repassar exatamente por que listas vinculadas são importantes como eles nos ajudam , e como eles se comparam a outras coisas, como a matriz que já falamos. Então, neste tipo de palestra do tipo de unidade iria estar discutindo listas vinculadas. 18. Lista de links 3-2: Então, agora que temos uma boa idéia de como os nós funcionam, vamos investigar um pouco mais e ficar atrás da intuição de listas vinculadas. Então, que lista ligada é o que eu descrevi na última palestra onde você tem um monte desses narizinhos. Então, por exemplo, poderíamos ter um monte desses. Quero dizer, essas coisas podem ser infinitas, então poderíamos ter uma nota aqui. Uma nota aqui, uma nota aqui, uma nota aqui, nota aqui, e novo faz isso por diante e assim por diante. E a abreviação para tipo de desenho isto está dentro vai ser o ponto de dados. E se apontar para outro lugar, é só desenhar uma flecha. Então o que temos aqui é que temos um monte de diferentes locais aleatórios na memória que estão todos ligados entre si por estes ponteiros. Então estamos em uma matriz. Tínhamos tudo no espaço linear. Honore, por exemplo, tínhamos em um array. Tínhamos tudo dentro, como um espaço linear onde era um após o outro. Então isso seria como 34 10 12 e 11 bem aqui, onde tivemos um depois do próximo em, em um desses tipos de em uma lista vinculada, o que você vai ter é que isso vai estar em toda a memória. Então este pode estar em algum lugar. Como, por exemplo, este quatro pode ser, você sabe, aqui em baixo enquanto este 10 está em algum outro pedaço de memória e este 12 não é algum outro pedaço de memória e assim por diante e assim por diante. Então, o que uma lista vinculada vive você dio é que permite que você conecte dados em todo o lugar juntos. E então o que isso lhe dá a capacidade de dialogar é que ele lhe dá a habilidade. Vamos nos livrar disso. Ele lhe dá a capacidade de realmente adicionar continuamente na lista de comprimento sem ter que fazer coisas como expansão ou dobrá-la. E se você pensar sobre isso quando estamos falando sobre o array, como ele tinha que dobrar cada vez para ser eficiente quando ele ficou maior, muitas vezes nós poderíamos encontrar um caso onde apenas metade do array é preenchido, o que significa que nós temos todos os seus outro quarto na outra metade. Isso não está preenchido, o que é ineficiente. Estamos desperdiçando espaço. Há apenas ser Ele está esperando para ser alocado, mas não é alocado. Então lista ligada realmente nos permite sempre e constantemente ter, um a memória que é necessária para manter nossa lista e não mais e não menos. Então, se precisarmos adicionar um número a isso, podemos adicioná-lo ao fim. Então, por exemplo, se quiséssemos adicionar ah, quatro a isso, poderíamos ir. E então nós apenas vamos para o final e nós adicionamos antes para a lista bem aqui e o que eu estou falando aqui são listas ligadas Singley. E o que isso significa é que você tem um ponto de partida, certo? Assim E assim isso é marcado como iniciar a nota inicial. Então, quando você ligar para começar, você vai para cá. E o que vai dizer é que você vai partir daqui e você vai basicamente apenas a única maneira que você pode atravessar é ir daqui para aqui, aqui para aqui, aqui para aqui, aqui para aqui e apenas seguindo as setas uma após a outra, todo o caminho até você chegar ao último e, em seguida, a maneira que você sabe que você está no final é porque em vez de este apontar para outro nó, então nesta situação, como por exemplo, pode apontar para, pode apontar para outro nó aqui. Digamos que este é como um cinco, mas se estamos no final de uma lista, vai apontar para algo chamado Não. E o que não significa é que não é nada. Está apontando para nada. Não há memória alocada. Na verdade, não tem um local na memória. Está apontando para nada. E uma vez que entendemos isso, estamos em nada. Então, quando inserimos algo, nós apenas substituímos esse nada pelo nosso novo nó. Então criamos esta pequena nota aqui. É como, por exemplo, deixe-me mostrar como podemos fazer isso. Criamos um novo nó, um novo conhecido aqui chamado 15 e queremos anexá-lo a esta lista vinculada. E então, neste momento, este está apontando para Não. E então o que queremos fazer é vencer. Anexe isto a ele. Então vamos para este começo. Vamos para o começo. Eu estou indo para baixo, estão ligados lista. Tem alguma coisa. Tem alguma coisa. Tem alguma coisa. Tem alguma coisa. Oh, é que sabe. Então vamos fazer, vamos mudar isso. Não, vamos selecionar isto. Vamos tirar isso daqui para fazer com que seja uma espécie de Nós vamos pegar isso. Não, nós vamos movê-lo para fora daqui, e nós realmente vamos pegar o novo nó aqui, e nós vamos soltá-lo e este novo nó por padrão. Quando criamos o nó, o próximo local foi definido para saber. Então, por padrão, quando este aviso criou o próximo, mas disse para saber e você vai ver que isso ajuda porque agora, quando nós realmente selecionar isso e agarrá-lo e movê-lo aqui, você vai notar que o fim novamente aponta para saber. E este foi agora re alocado para apontar para o novo nó. E o ciclo continua. Se quisermos inserir outro, podemos ir em frente e 13 aqui, e criamos isso. Ele automaticamente coloca para saber que não está em nossa lista em, você sabe, ainda. Ainda está sendo criado. Agora queremos adicioná-lo à lista. Então, quando vamos para o início, descemos, descemos, descemos Agora este não é um não. Então, como OK, há outro. Aqui vamos nós para 15. Tipo, “Oh, não há aqui. O que significa que agora vamos fazer 15 em vez de apontar para saber que vamos mover o ponteiro. Então vamos excluir o não aqui, e vamos mover seu ponteiro 2.2, nosso novo nó. Então, tecnicamente, faria isso porque o nó não se moveria aqui. Estávamos apenas dizendo para apontar para este novo pedido que nós criamos este novo ativo aqui , este novo pedaço de dados que nós criamos e, em seguida, desde que nós já criamos para já ter um nulo do fim uma vez que ele vai para ouvir, ele vai se mover para o knoll. E agora, se quisermos responder a outra coisa, ele vai passar direto para este ponto e nós podemos começar, você sabe, ter um bom tipo de gráfico indo. Agora. Então o que acontece se quisermos, Por exemplo, um, excluir algo deste em uma matriz quando excluímos algo dele. Tudo o que tínhamos que fazer era, por exemplo, ter uma matriz bem aqui. Tudo o que temos que fazer é chamar o local que queremos apagar. Então, no 321012, poderíamos apenas chamar X de dois igual a não ou algum tipo de algoritmo de exclusão entra em jogo. E eu era tudo o que faz é dizer, Oh, Oh, sair para não é igual a nada mais feito. Nada para se preocupar se quiséssemos liderar o 1º 11 Fácil feito. Nada para se preocupar com a lista de links. No entanto, você percebe que existem dependências entre aspas se você excluir se apenas excluirmos . Se dissemos que queríamos apagar 10 era um delete 10 aqui. O que acontece? Como é suposto chegarmos ao resto da nossa lista para já não apontar para nada para apenas automaticamente foi predefinido para apontar para saber. Então ele aponta para saber agora porque 10 está lá, que significa que este não é o fim, e nós perdemos o resto da nossa lista aqui. Então nós realmente temos que fazer um pouco de um tipo complexo de operação para excluir deixe-me apenas trazer isso de volta. Então excluir em vez disso o que podemos dio. Digamos que temos um nó aqui. Uma nota aqui e uma nota no meio. Temos o Singley apontou ponteiros simples de ponteiros. Então é a lista da liga Singley aqui. E se quisermos excluir isso dará todos esses valores para que possamos chamá-los por alguma coisa. Se quiséssemos apagar 10 aqui. O que precisamos fazer é, antes de deletar isso, precisamos dizer Ei, três agora vai apontar para gostar, então precisamos ir para três. Vamos apagar o próximo. Então vamos para três e dizemos: “ Ei, Ei, você precisa de 2,22 e então, uma vez que essa nova alocação é criada, essa realmente vai cair naturalmente.” Agora é um mau treino. Deixe isso aqui porque isso ainda é tecnicamente um som. Então, por exemplo, disto é um começo, este gráfico aqui ainda é tecnicamente sólido. Ele vai ir 3 para 2 e depois aqui aponta para saber. E então tudo isso ainda funciona ainda é tecnicamente correto. No entanto, o que temos é que desperdiçamos espaço aqui. Na verdade, não deletamos o não. Então nós podemos realmente, antes de fazer isso, nós podemos realmente salvar isso para algum tipo de variável como antes. Como poderíamos dizer, você sabe, um, ter usado o Excel. A corrida vai w igual a esta nota de 10. E então uma vez que nós estamos fazendo essa coisa que podemos dizer, você sabe, nós podemos chamar deletar sobre ele e nós estamos realmente removê-lo da memória para que nós não temos esta coisa sentado aqui mais. Mas o que eu queria mostrar é que tudo o que temos que fazer para excluí-lo é em vez de excluir o próprio ativo, tudo o que temos que fazer é redesenhar a seta. E, na verdade , tecnicamente, este ainda estaria apontando para lá. Então temos que fazer é redesenhar a nota assim e então este está tecnicamente fora da lista. Não há como voltar aos 10. Não há maneira de ir acidentalmente para 10. É apenas arrepiante lá, e sempre pode estar lá, e a nossa lista ainda seria boa. No entanto, a maneira eficiente seria excluir isso para que nossa lista não esteja armazenando dados extras que não precisa armazenar. E então nós temos mais um caso para cobrir de como a lista ligada funciona, e isso vai ser sobre como exatamente um pode exatamente como se pode inserir exatamente no meio de um raio. Então, por exemplo, o que fazemos aqui é, digamos, estamos no meio de uma lista vinculada. Então, se você quiser inserir em um array, dizer sua taxa assim em um raio aqui, o quê? E nós temos um dois aqui temos um sete aqui. Nós temos um quatro aqui, e você sabe, nós temos 0123 e se nós quisermos inserir direito nesta parte aqui, tudo o que nós temos que fazer é ex de dois igual a sete e você sabe, ele vai para sete realmente fácil de fazer. Se você quiser inserir em qualquer outro lugar. que você realmente tem que fazer é apenas sobrescrever algo. Então, se quisermos fazer isso igual a zero, podemos ir em frente. Ele só vai sobrescrever isso e torná-lo igual a zero. Sem riel, Outras coisas adicionais necessárias. No entanto, um ray ou listas vinculadas não são tão fáceis com uma lista vinculada. O que temos de difundir é que temos de o fazer. Nós realmente temos que tipo de realocar ou re pontos e coisas. Assim como na elite, tínhamos uma caixa de três. Ele se move para 10. E então vamos dizer que este se move para 25 agora temos uma caixa aqui nós temos uma caixa que nós criamos um novo nó que nós criamos que talvez 18 e que aponta para saber. Então, como fazemos isso aqui? Como colocamos isso aí? Como vamos fazer isso ir bem ali? Bem, não podemos simplesmente inserir. Não podemos chamar o segundo lugar. Diga, insira, não há nenhum Poninters vai ficar todo confuso. Então o que temos que fazer é levar este aqui. Temos que apagá-lo. Temos que dizer que agora aponta agora para baixo para 18 e, em seguida, temos que assumir este . Temos de criar um novo ponteiro que aponte até 10 e há alguns pequenos desafios com isso. Porque se você notar algo se voltarmos para onde começou se excluirmos isso primeiro, então de repente perdemos o resto da nossa lista. Não há como chegar ao resto da nossa lista aqui. Não podemos mais tocar. Então o que temos que fazer normalmente é que temos que salvar este próximo, este aqui, em uma variável. Então, Então, o que não podíamos fazer, há algumas maneiras de fazer isso. O mais eficiente seria, na verdade, definir o próximo primeiro. Então, uma vez que chegamos a uma vez que temos este ponto na memória, uma vez que atravessamos são lista ligada. E chegamos a esta nota aqui. Weaken não disse: “ Ei, Ei, queremos que 18 seja igual a isso. Não, queríamos apontar para este bilhete. Queríamos apontar para esta nota. Então nós podemos dizer que isso agora aponta para esta nota também. E agora o que podemos fazer é voltar ao início aqui. Podemos apagar isto, e agora podemos apontar isto para baixo. Agora podemos apontar isso para R 18 e agora temos uma boa inserção e não perdemos os dados no back-end. Então, listas vinculadas lá um pouco complicado lá um pouco difícil de entender. Mas eles têm alguns benefícios, e um dos maiores benefícios é o fato de que podemos continuar aumentando até o fim. E só vai criar dados. Isso é como, hum que criar dados. Isso é, você sabe, muito grande que precisamos que seja, não temos que continuar dobrando as coisas e isso nos permite uma espécie de anúncio por capricho. Poderíamos adicioná-lo ao final. Nós não temos que nos preocupar com a classificação ou a organização dele, e nós não sobrescrevemos coisas se vamos inserir nós tudo o que é próprio pedaço de dados que podemos pegar e mover em vez de ter uma matriz onde tudo é uma espécie de trancado em uma caixa que limita algumas das coisas que poderíamos fazer com ela, especialmente mais tarde. E o que também é interessante sobre essa abordagem é que uma única lista vinculada em si é, você sabe, apenas uniformemente ligada. Mas poderíamos, por exemplo, ter cachos de nariz apontando para diferentes áreas. E isso permite tantas coisas. E é aqui que entramos em árvores mais tarde, adicionando um monte de notas. Mas isso é uma espécie de o básico de que pode ser ligado lista por si mesmos. Apenas sozinho. Lista vinculada não são a coisa mais útil, mas vai ser construindo em coisas realmente úteis mais tarde. Então essa é a lista de comprimento de Singley. A próxima parte. Vamos passar a ligá-los duplamente e, em seguida, entender os tempos de execução por trás de tudo isso e como ele se compara a algo como ele array. 19. 3-3 lista de vinculados: Agora temos uma boa e intuitiva compreensão de como as listas vinculadas funcionam. Vamos para lá. execução Provavelmente disse em ciência da computação, tempos de execução são importantes porque eles nos permitem analisar essas estruturas de dados e entender seus pontos fortes e fracos. Então, vamos fazer uma atualização rápida sobre os tempos de funcionamento do nosso raio aqui. Então o que temos aqui é que temos os tempos de execução que saímos para o array e então eu vou colocar isso aqui. Isto é para a matriz. E também, quero designar isto para exclusão aleatória. Se você estiver excluindo, por exemplo, em uma matriz, um, no início, como, por exemplo, é uma matriz circular desconhecida e você excluiu o início bem aqui. Então você exclui este e você quer que tudo para mudar para trás que também será ove em apenas como o em tipo de frente. Então este pode ser dois diferentes, dependendo de como você quer olhar para ele. Mas excluir aleatório sempre vai ser sobre o único enquanto excluir. Basicamente, frente de ladrão será devida até o fim. Então eu só queria colocar essa pequena ressalva lá sozinho, esse tipo de complexidade temporal pode obter um pouco de exatamente o que você está olhando, como especificamente para que eles possam ficar um pouco confusos nesse aspecto. Mas se você realmente apenas pensar sobre eles intuitivamente pode entender. Então, por exemplo, na matriz, se estamos excluindo da taxa inicial aqui, tudo tem que mudar de volta. Então temos que nos mover em número de, hum, em número de lugares na pior das hipóteses. E vamos apenas uma espécie de intuição por trás disso. Mas podemos ver algumas dessas coisas aqui. Temos a inserção aleatória. Temos em busca na frente. Excluir pesquisa, pesquisa não classificada classificada. Então vamos passar por essas operações em uma lista vinculada. Então vamos criar um pouco de um exemplo de lista vinculada aqui. Então o que precisamos criar é criar nossos nós. Então nós temos o início da lista, que nós podemos apenas criar como, começar aqui para que pudéssemos criar, como Iniciar, e então ele aponta para o início do nosso primeiro nó. Digamos que nossa primeira nota tem um três, e então esta é uma única lista de links. Nós ainda não falamos sobre o dobro, então nós vamos apenas ir com uma lista de comprimento único. Eu dobro apenas melhora pequenas partes de coisas, pequenos cálculos, e então vamos para, tipo, tipo,digamos, 19 aqui ou algo assim, e então este é o fim. Então esse é um, então aponta para saber aqui. Ok, então nós temos são listas vinculadas assim, e vamos em frente e criar nosso 1º 1 Então aqui em cima nós tivemos inserir aleatoriamente. Então, se você quiser inserir algo e isso é aleatoriamente assim em qualquer lugar dentro da estrutura de dados , na verdade vamos fazer o mesmo. notação é a última também. Então queremos inserir aleatoriamente em uma matriz que nos levou tempo instantâneo porque estaríamos substituindo as coisas se você estivesse tentando calcular a substituição. Então talvez você possa ter algumas advertências nisso, mas se nós apenas vamos sobrescrever algo perfeitamente bom, você poderia apenas dizer ex de cinco é igual a algum número qualquer que seja, e ele irá substituí-lo em uma lista vinculada. No entanto, torna-se um problema é que você só pode entrar daqui. Você não pode simplesmente pular para qualquer uma dessas posições. Então, se eu quisesse chegar a 19 aqui, eu teria que ir desde o início acima de 123 e então chegar a ele, e eu teria que fazer isso por qualquer quantidade dentro disso. Então o que isso significa é que nossa inserção aleatória realmente se resume a em O de na notação. E isso porque nosso pior cenário é inserir aleatoriamente na parte de trás. O que significa que vai inserir 1234 estão dentro. Esta situação é quatro. Então vai levar quatro para voltar para aqui, e isso vai com qualquer lista de qualquer comprimento. Há 1000 destes e você quer inserir perto da parte de trás. Pode levar de 950 a 1000. Então isso significa que nosso pior caso cenário para inserção aleatória realmente se torna realmente O de N. E isso é só porque não há acesso instantâneo. Não há nenhuma maneira que nós sabemos como saltar entre estes mais rápido do que ir desde o início e seguida, movendo-se para baixo assim e assim o nosso próximo vai ser inserido na frente, então inserir frente e na frente, então com inserir frente e vai fazer inserir de volta também com um básico, hum, uma lista básica ligada. Vai ser o até o fim também. Ou, na verdade, a resposta para a frente será um tempo constante. Bem, no começo, a parte de trás vai ser O até o fim. E isso é porque vamos inserir a frente primeiro. Se quiséssemos inserir um novo nó, digamos que temos uma nota aqui. Uma nova nota aqui de quatro. Se quiséssemos inserir isso na frente, como exatamente faríamos isso? Bem, na verdade é bem fácil. Seja qual for a nossa frente, seja qual for o nosso ponteiro, tudo o que temos para dialogar é que temos que dizer OK, em vez de apontar para este ponto, e então tivemos que definir quatro para o nosso antigo. Então eu tive que definir quatro para a nossa antiga frente. E então o que isso faz é que ele vai realmente apenas adicioná-lo em 123 passos cada vez, não importa o que você está inserindo lá, então sempre vai ser um tempo constante e a maneira como você realmente quer fazer isso. Na verdade, há uma maneira que você deve inserir aqui porque este tipo de entra com perda memória. Se eu excluir isso e, em seguida, fazer este ponto para este como então eu perder a habilidade Eu perder esta primeira nota aqui, Eu não tenho mais permitir para agarrá-lo mais porque nós excluímos o único ponto que temos para ele. Então, se você quiser inserir na frente, o que temos que fazer é pegar nosso nó. Nós temos o primeiro disse isso para os três. E isso ainda está apontando para a frente. Então nós vamos dizer, Ei, quatro, quatro, nós vamos dizer, Ei, quatro, quatro, agora você está apontando o seu próximo em vez de Não, agora está apontando para três. Está apontando para o nosso começo. Vamos dizer que aponta para o início, e isso vai alocá-lo para o início. Então, uma vez que ele está apontado para aqui, nós vamos excluir daqui, e nós vamos fazer o ponto de partida para baixo para aqui, e então isso vai criar nossas inserções ou inserir é sempre tempo constante. Vai ser sempre aquelas três operações criar atribuído para o início um sinal começar dois novo não para nova nota. Então será sempre um tempo constante. Então esse é o tempo constante. E então temos inserção na parte de trás. Então inserir na parte de trás, no entanto, vai nos levar um pouco de trabalho porque, como eu disse, não há maneira de voltar aqui, a menos que mais tarde, eu vou para cima como você pode criar pouco dicas para ajudá-lo. Mas agora, com apenas uma lista básica ligada ao Singley, não há como chegar aqui sem passar por toda a lista. E assim isso vai ser sempre dentro. Vai estar sempre dentro, que significa que, por padrão, é o pior caso também. Então é o pior caso também será porque, como eu disse, não há maneira de saltarmos aqui. Não podemos começar do início e depois ir para o fim. Não há nada nos apontando para o fim. Não sabemos o que está aqui. Não sabemos quantos nós de ar entre isto. Tudo o que sabemos é por onde começar e como chegar ao próximo. Então vamos ter que fazer é começar a correr. Tivemos que criar um novo nó. Então, se você quiser adicionar um ao final, digamos que queremos adicionar este quatro ao final. A única maneira de fazermos isso é termos de ir. Ok. Bem, o que há no final? Desça 4 a 3. Pague um 2 a 10 este é o Não, estamos no final. Ótima. Agora, uma vez que estamos no final, temos a nota final. Então podemos contar. Ei, você vai se mudar. Você não sabe mais que vai ser definido para quatro. Assim e então, é claro, por padrão. Quando criamos isso, isso foi apontado para saber que nossa lista funciona novamente. Então, uma vez que você chegar aqui, a operação é apenas como um ou dois tipos de números de criação. Mas chegar aqui é devido até o fim. E é por isso que nossa corrida pode tempo será Odeon também. E então o próximo que queremos pegar será deletar aleatório. Então, queremos excluir aleatoriamente. E assim, com um delish nele tipo de depende de como você está excluindo e onde você deseja excluir. Então o problema é que se estamos excluindo da frente, é muito fácil. Se apagarmos da frente, tudo o que temos que fazer é dizer, começar igual à frente a seguir. Então deixe-me escrever isso porque esse tipo de entra em algum. Como se você começar a escrever essas coisas, vai ser como, hum, começar é igual a esta nota aqui. Iniciar ponto em seguida. E essa flecha seria chamada a seguir. Então o que estamos dizendo é que o início agora é igual a começar a seguir e então este apenas obter tipo de removido fora do ciclo e a seta recebe re ID associado fora daqui, e então ele vai direto de volta para aqui. Então, se apagarmos a frente, é com uma vez. Então, se apagarmos a frente, vai sair uma vez. Mas se excluirmos aleatoriamente, que está em qualquer lugar aqui, se quisermos dizer que queremos excluir o quarto elemento ou o nono elemento para fazer isso, vai precisar de Odienne porque vamos ter que atravessar a coisa toda. E então, se você notar, não podemos ir para trás. Então, se você quiser liderar esta pedra. Vais ter de agarrar a anterior, e depois vamos ter de o fazer. Então, por exemplo, se quiséssemos excluir três aqui, vamos ter que ir para dois e então vamos ter que dizer que ele é próximo vai ser igual a seu próximo vai ser igual ao próximo ponto Em seguida, o que fica um pouco complicado. Então seria como se estivéssemos no número dois aqui. Estamos neste nó, certo? Aqui estão todas as ações, certo? O que? Os números estão tão certos. Nó quatro. E o que dizer? Nó quatro pontos Próximo é igual a ponto próximo ponto. E então o que você está fazendo é que você está agarrando a próxima extremidade na próxima. Está dizendo que agora é igual a isso. Então você está ignorando este aqui mesmo ignorando isso, você remove-o. Mas para chegar a este ponto, para chegar a este ponto, você tem que saber que ele vai assumir o fim, o que significa que a liderança aleatoriamente vai estar fora também. Então isso vai ser o até o fim e nós apenas, mas nós descobrimos que excluir da frente vai ser constante é constante e você já vê um pouco de melhoria lá. Então tivemos um monte de coisas que podem levar mais tempo. Mas entre a matriz, Se você ver que excluir da frente em uma matriz levará O para o fim enquanto excluir da frente em uma lista vinculada levará o que faz Isso deve ser constante. Isso deve ser constante. Enquanto a ilusão disto vai demorar o será um tempo constante, que significa que não vai escalar, o que é ótimo. E, mas você também vê algumas outras diferenças aqui é que a inserção aleatoriamente foi instantânea. Enquanto a inserção aqui vai ser até o fim, uma frente insurgente aqui era Odienne. Mas a frente de inserção em uma lista vinculada acabou com um. Então, estamos vendo algumas compensações aqui. Algumas diferenças entre estes dois. E então agora vamos em frente e excluir essa última jogada. Não vamos mais apagar este. Vai voltar a uma lista de links bem aqui, e o que precisamos agora é procurado por ordenados e não ordenados. Então, o que? Temos esta busca por ordenados e em busca de não-ordenados. E assim ambos vão acabar sendo O até o fim também. E vou explicar isso em um segundo. E a razão é que não importa se isso é classificado ou não classificado. Você ainda tem que atravessar a coisa toda para encontrar o que você está procurando. Se soubéssemos que era 12345678 então não importa porque ainda não há como pular para dois ou pular para o número oito ou em qualquer lugar aqui. Não podemos saltar. Temos que começar e, em seguida, mover do início para baixo a lista vinculada. que significa que não importa o que, se quisermos entrar aqui, se , como , por exemplo, encontrássemos os dois que poderia levar até o fim, poderia estar no final do para encontrar esta coisa. Quer seja ordenado ou não. Vai ser uma reversão de lista vinculada inteira, e, portanto, vai ser tempo linear. Significado vai ter que passar por cada nó no pior dos casos. Então, a busca é um pouco mais lenta nesta situação. Enquanto se formos a uma matriz, veremos que a busca não ordenada tem o mesmo. No entanto, se classificar o array que podemos começar a fazer login, podemos realmente melhorá-lo um pouco por causa do que falamos anteriormente, onde cortamos ao meio. Continuamos cortando e 1/2 até encontrarmos o número que procuramos. E então lá temos. Esses são os tempos de execução de uma lista vinculada. Como eu estava dizendo anteriormente, há algumas semelhanças aqui. Um par de pequenas advertências entre os dois e às vezes como, por exemplo, inserção aleatória e inserção na frente aqui, você verá que eles são diferentes. advertências entre os dois e às vezes como, por exemplo, inserção aleatória e inserção na frente aqui, Na verdade, o insurgente é mais rápido do que na matriz. Enquanto a inserção para a frente é mais rápida na lista vinculada, a inserção na parte de trás vai ser muito lenta enquanto em busca na parte de trás em uma matriz vai ser muito rápido. Delish in vai ser mais lento na lista vinculada. Mas mais rápido no ah, mais rápido na primeira busca vai ser basicamente o mesmo se não for classificado. No entanto, se for classificado, o array sai à frente. Então você pode ver que mesmo que esses dois sejam muito diferentes, eles são completamente diferentes. Você pode pensar que talvez, como, talvez você prefira um em vez do outro era mais intuitivo do que o outro, que todos eles têm um tipo de advertência muito específico. Então, por exemplo, se colocarmos aqui um aumento e aqui tivermos nossas listas vinculadas, pode haver certas situações em que queremos usar uma sobre a outra. Se tivéssemos um programa que inseriu na frente muito inserido em direção à frente um tempo não quereríamos usar um array para isso porque se usássemos um array para isso, teríamos que, uh, mudar tudo sobre e continuar criando um novo aumento para fazê-lo realmente funcionar bem, em uma lista vinculada, tudo o que temos a fazer é criar um novo nó e uma espécie de frente. Então, se quiséssemos inserir na frente, este teria uma vantagem. Inserir programas pesados frente parte minha escrita aqui. Então insira programas frontais pesados, todos de uma matriz, se quisermos classificá-lo e então procurar Seria melhor. Então, o que podemos ter uma matriz ordenada? E nós queremos. Então, é como buscas de array ordenadas ou sortidas queiram fazer. É lamentável em uma corrida de pesquisa de dados classificados, e assim você pode ver que cada um deles é bom em um determinado campo e ruim em diferentes campos. E é assim que entender isso ajuda os outros cientistas da computação, porque você começa a entender qual deles você deve usar com base nas vantagens de um sobre o outro. 20. 3-4 listas vinculadas de 3-4: Não é. Temos uma boa compreensão de como as listas vinculadas individualmente funcionam e algumas de suas vantagens algumas de suas desvantagens com um aumento e outras estruturas de dados. Agora podemos começar a melhorar a ideia básica de uma lista vinculada, e entramos nessa ideia de uma lista duplamente vinculada. Então, o que é uma lista duplamente ligada? Bem, vamos voltar à nossa ideia de um nó. Lembra que eu disse que tínhamos uma nota aqui e podemos ter qualquer nota e pode ter, tipo, um pedaço de dados no topo. E poderia ter um monte de tipos diferentes de ponteiros aqui em baixo. E um dos pontos principais é que você pode adicionar é você vai adicionar o próximo. E isso cria um monte de Singley Singley aqui mesmo. Então não temos apenas um monte de próximos aqui. Deixe-me fazer este o mesmo formato aqui e, por exemplo, este é como quatro. Temos um próximo aqui, mas a questão é que, com apenas o próximo, só podemos ir em uma direção na lista para torná-la duplamente ligada. O que podemos fazer é que podemos realmente adicionar no anterior é também. E isso significa que ele também vai apontar para trás, duplamente ligado. Isso significa que para cada época haverá duas flechas, uma entrando e outra saindo. Agora, como isso nos ajuda? Por que isso nos ajuda? Como é que nos permite ir de, por exemplo, para recomeçar ao longo de toda a lista? Como isso nos ajuda? Bem, se olharmos para os tempos de execução, podemos notar que ele não vai realmente nos ajudar muito em nenhum dos tempos de execução. O que vai fazer vai fazer um pouco mais de trabalho nos bastidores porque não importa se vamos para frente ou para trás. Ainda vamos atravessar a lista, pelo menos quer chegar ao papel. Mas vamos pensar em um cenário diferente. Vamos pensar, por exemplo, nosso objetivo aqui é, digamos, digamos, encontrar sete e excluí-lo e excluí-lo de são lista vinculados. Então temos uma lista vinculada aqui. Digamos que temos um aqui e um dois que se move por aqui. Temos um três e depois temos uns 75 25 e depois baixamos para sete, e vamos fazer mais um. Então isso continua ligando para baixo para 17 e isso aponta para um não. Então pense nisso. Se precisarmos primeiro encontrar sete e depois apagá-lo, o que vamos fazer é procurar primeiro. Então vamos procurar a coisa. Então vamos escrever um pequeno registro do que fazemos. Então nós vamos procurar, e então nós vamos ter que ir. 1234 Encontramos que está aqui às sete. Ok, ótimo. Como é que o apagamos? Porque a única maneira de apagá-lo é que temos que tocar no anterior, e não sabemos onde está o anterior. Quando chegarmos aqui, não tem como apontar para trás. Assim que chegarmos aqui, se você quiser excluir isso, nós realmente temos que refazer a busca novamente. Temos que voltar a partir deste início e depois descer e ir para o anterior e dizer-lhe para apontar para o próximo ponto. E isso vai realmente causar algo assim. Então nós temos a busca para encontrar É oh of in. E então nós temos a exclusão também vai acabar agora. O que isso vem a ser é realmente pode fazer isso. Na verdade, vai acabar sendo, se você quer ser realmente técnico sobre isso vai acabar sendo O para o N menos um porque você vai encontrar o anterior por trás disso. Então não importa o que esse Hulk se resume é que vamos ter esse tipo de relação. Nós vamos entrar, oh, oh, de in plus in o of in E então para nossas comparações de outras coisas, lembre-se, isso vai chegar todo o caminho para ser basicamente um O de dois dentro. E lembrem-se do que dissemos no início é que iríamos simplesmente riscar isso, e isso acabaria. No entanto, no mundo real, duas vezes podem ser realmente uma grande diferença, algo que queremos realmente acompanhar, entender e melhorar. E se pudermos cortar o tempo que vai levar pela metade, queremos fazer isso. E assim, por exemplo, você verá que ele pesquisa. E agora temos que fazer a exclusão. E assim fica um pouco entediante dessa maneira. Então o que podemos fazer é criar isso e torná-lo uma lista duplamente comprida. Então agora nós temos uma lista duplamente ligada aqui onde todos eles apontam um para o outro e deixe-me realmente, realmente,vamos fazer o vamos fazer essas setas. Vamos torná-los de uma cor diferente aqui para deixar isso um pouco claro. E então o que temos é uma flecha apontando para trás. Eles estão nomeando de volta, ganhando de volta, apontando de volta. Depois há uma flecha que vai apontar para trás. E agora temos nossas listas duplamente vinculadas, e nesta situação, este aponta para saber também. Então a frente esta vai apontar, hum, para saber por aqui e então é anterior vai apontar para lá. E agora temos essa coisa toda bem trabalhada. E então agora vamos tentar refazer essa operação que é encontrar sete e excluí-la. Bem, nós estamos indo. Vamos começar pela frente. Nós vamos descer. Nós vamos passar por cima, sobre, sobre, sobre Oh, nós encontramos sete. Então, agora para excluí-lo, o que podemos realmente dio é que podemos ir e usar este tipo de pseudo código aqui, sete pontos anteriores. Então, agora temos. Estamos agora neste nó bem aqui. Sete pontos anteriores Próximo é igual a sete pontos a seguir, e então isso pode ser um pouco complexos, tipo, entrar no aspecto de codificação real dele. Mas tudo o que estamos dizendo aqui é que estamos indo para sete estavam dizendo seu anterior seguinte. Então nós estamos selecionando este e agora estamos dizendo agora, já que estamos aqui dizendo que é o próximo, a pequena parte aqui estava dizendo que uma pequena parte de 25 que é o próximo agora vai igualar quer que seja sete, É o próximo. Então vai igualar o que quer que seja. Sete. O próximo é o que vira 17. Eu sei. Uma vez que fizermos isso, agora temos uma conexão. Cria uma conexão onde desfaz curto-circuitos. Faz essa conexão e agora ele vai se mover direto para baixo e se conectar aqui e nesta linha aqui vai desaparecer. E tudo o que temos que fazer agora é mais um passo. Este 17 ainda aponta para o lugar errado para que possamos fazer algo como se agora estivéssemos de volta ao nosso 25 nós acabamos de reiniciá-lo. Então vamos dizer que, tipo, tipo, 25 pontos próximos pontos anteriores é igual a 25. E então isso é tudo pseudo código. Isso não é como você não pode colocar isso em qualquer lugar onde essas duas coisas aqui à esquerda apenas significam como seus comentários como se eles fossem apenas uma espécie de pseudo-código do que seria dio? Mas agora o que podemos fazer é dizer 20 cinco e o próximo ponto anterior é igual. Então nós estamos selecionando a parte anterior da parte de dados aqui de 17 aqui estavam dizendo que seu anterior agora é igual a 25. E então ele volta e aloca como este sete agora é removido e nós temos o nosso produto final aqui. E o que fez isso geral, dio vamos tudo o que fez foi permitir que nossa pesquisa e excluir aqui para se tornar um para fora até o fim e vamos apenas nos poupa um pouco de tempo. O geral, em vez de ser muito até o fim, é apenas ir para o fim. E assim, como eu disse, isso não melhora nenhum desse tipo de velocidade de cima para baixo aqui. Mas o que ele faz é que na verdade nos poupa um pouco de tempo, e nos permite criar um pouco mais de intuição por trás das coisas porque agora não estamos. Não estamos presos nesse tipo de ir em uma direção. E se temos que ir para trás, começando de novo e depois indo uma direção novamente agora podemos realmente mover intuitivamente para frente e para trás através desta lista. Ainda vai levar em média Oh, então para chegar a qualquer lugar. Mas podemos melhorar coisas minúsculas, como melhorar de dois para ir mais rápido, e isso torna a nossa codificação um pouco mais fácil porque nós não como eu disse, nós não temos que manter a contabilidade para começar de novo e, em seguida, passar por isso novamente. Então eles estão duplamente ligados. Lista uma boa adição para adicionar à sua lista vinculada, e eles tornam geralmente sua vida muito mais fácil 21. 3-5 apontador de cauda: Então agora vamos cobrir mais uma coisinha sobre a lista vinculada e algo que realmente vai melhorar um de nossos tempos de execução. E essa é a idéia de um ponteiro de conto. Então o que isso significa é que um conto Pointer vai nos permitir fazer exatamente isso. Vai permitir-nos apontar para o fim do nosso tipo de lista estão ligados. Então, por exemplo, vamos em frente e apenas desenhar o amor realmente curto. Aqui, Vamos ir três pontos para dois pontos para 15 e vai dizer que isso vai saber. E aqui este vai saber porque nós estamos realmente fazer esta uma lista duplamente ligada aqui. E, sim, bom aspecto. Certo, então o que temos usado é que há esse tipo de ponteiro de início. Há sempre um que nos diz onde está o início de nossa lista vinculada, e isso tem sido apenas uma espécie de padrão. Isso tem sido o que podemos usar logo no início, porque se não tivéssemos esse ponto ou bem, seria difícil descobrir como trabalhar com ele porque nunca conseguiríamos descobrir onde isso é. Então temos um começo, ponteiro. Mas o que podemos realmente fazer é ir em frente e podemos criar um ponteiro de conto também. E o que um conto Pointer faz. Então, hum, vamos desenhá-lo bem aqui. Vamos colocá-lo. Talvez como vermelho diga o ponteiro da cauda. Então, vamos dizer o ponteiro da cauda bem aqui. O que um conto Pointer faz é que permite que você sempre acompanhe o que é o último nó e como isso nos ajuda é ter esse conto. ponteiro não leva basicamente nenhum tipo de energia. Toda vez que criamos um novo, tudo o que vamos fazer é mover o que vamos mover o ponteiro de cauda sobre o próximo novo nó e então ele vai fazer, é em uma operação extra dedo adicionando um ao fim agora. Mas o que nos permite fazer é que ele nos permite agora inserir na parte de trás em oh, dentado, inserir na parte de trás para que possamos cruzar isso se ele tem um ponteiro de cauda e nos permitiu inserir na parte de trás em tempo constante. E por que isso nos permite fazer isso? Bem, vamos correr para o tipo de exemplo de inserção agora. Então agora temos uma nova nota aqui. Temos um novo nó de 20 bem aqui, e queremos inserir isso na parte de trás antes que o que temos que fazer é ir para baixo no início, foram para descer o início e, em seguida, passar através da lista ligada até chegarmos para trás. E isso foi um problema, porque é assim até o fim. Não importa o que seja sempre preciso, por mais que haja na lista para chegar ao fundo, será um tempo linear. Então nós vamos fazer esse tempo constante, embora em vez de ter que passar por toda a lista, nós apenas vamos para onde o ponteiro da cauda nos aponta para, que é uma operação. E então agora nós definimos este nós ao lado dos nossos 20. Dissemos o nosso nó dos vinte anos. Então nós dissemos que este é para remover o não, nós removemos o norte. Vamos movê-lo para aqui. Criamos esta taxa definida aqui e neste por padrão está apontando para saber. E então, por causa disso, o que nos permite ao Dio é tudo o que é preciso é a única operação para chegar até aqui. 12345 talvez operações para adicionar na peça. Mas isso vai ser constante. Não importa mais porque agora, uma vez que fizemos isso, tivemos em apenas um pouco de uma adição bem aqui onde nós apenas ir em frente e nós estamos desenhando um pequeno ponteiro para nossa nova volta. E agora, se você quiser inserir em volta novamente, vai ser exatamente isso. Vai ser aproximadamente cinco ou mais operações para fazê-lo, que significa que se ele sempre vai ser 555 não importa o quão grande é dentro não importa o quanto está em vai mesmo se é aquele infinito que ainda podemos inserir na parte de trás do infinito e apenas Cinco operações. Você sabe, isso é, claro, teórico bem aqui. Se pudéssemos inserir em cinco operações, isso significa que sempre será tempo constante. Então, que ponto de história? Ou será que é apenas um pequeno pedaço de dados extra que aponta para o fim da nossa lista? Ele nos permite chegar ao final da lista muito mais rápido em uma operação e configurar em operações O para N. E por causa disso, aumenta nossa inserção para a parte de trás para ir para o um em vez de, um em vez de, um tempo linear. E também podemos pensar nisso da mesma maneira. Eu não escrevi isso aqui, mas se quiséssemos apagar da parte de trás também, então vamos adicionar isso aqui. Exclua da parte de trás também. Também melhoraria isso, porque sem esse ponteiro de conto, se quiséssemos excluir da parte de trás, teríamos que descer o caminho inicial, chegar para trás, excluí-lo e, provavelmente, correr através dele novamente para que podemos realocar o que estava ao lado da parte de trás. E assim ele vai ser devido ao fim sem um poner cauda sem um dizer poner é o até o fim. Mas se tivermos um ponto de cauda ou podemos riscar isso e ele realmente se tornará constante, então isso não faz você saber realmente, muito constante. Ele não faz mudanças muito, muito grandes, mas o que ele faz é melhorar apenas duas dessas que nos permite inserir. Isso nos permite realizar melhores operações na parte de trás. E por causa disso, porque agora que podemos inserir e excluir da parte de trás e com um deles faz com que seja mais rápido , estão exatamente no mesmo ritmo que uma matriz a esse respeito. Então esse é o ponto da cauda. É muito, muito simples. Apenas uma coisa que aponta para o final realmente montado tipo de implementar uma vez que você começa se você entrar no código, mas pode economizar um monte de tempo e no geral, certifique-se programa executar muito melhor. 22. Revisão de lista de vinculados: Então vamos dar um passo atrás e amarrar tudo o que aprendemos juntos para que possamos ter, você sabe, uma boa atualização em tudo e como tudo isso interage uns com os outros. Então o que temos é que temos coisas chamadas uma lista vinculada, e uma lista vinculada é uma série de nós. Então é uma série de basicamente peças que apontam para um determinado pedaço de dados e, em seguida, também apontam para outros nós. E então nossa pizza que pode ser três e então nós não temos o próximo e nós temos uma taxa anterior aqui eo que nós podemos fazer isso. Isso é que podemos, então, tomar esses nós. Podemos criar uma lista a partir desses nós, e esta lista nos permite vincular um monte de dados entre si. E a parte boa disso é que podemos inserir aleatoriamente. Nós não precisamos, você sabe, alocar um certo tamanho para isso. Vai se expandir indefinidamente. Não temos que curtir, dobrar. Não há nada desse tipo de coisa acontecendo, que significa que podemos continuar ligando as coisas à medida que nos deparamos com elas, e isso vai continuar dinamicamente cada vez maior. Algo desvantagens para isso é direto do bastão é que você sempre tem que entrar nesta área de início e para passar pela lista, você tem que ir de um para o outro o próximo. Não há rotas diretas para nada além do início nesta situação, que significa que pode levar O a tempo para fazer muitas operações. Podemos melhorar isso, adicionando-o como um menos duplamente ligado. Isso nos permite não ter que ir. , Por exemplo, se quisermos ir aqui, vou fazer algo com o anterior. Não teríamos que voltar ao início e encontrar o anterior. Poderíamos ir e voltar nesta lista como quisermos. E então o que podemos fazer para melhorá-lo mais longe é que podemos adicionar um pouco, um pouco, um, um, um ponteiro de conto ao final sobre o que o ponteiro da cauda nos permite fazer é ir diretamente para o fim. E isso nos permitirá aplicar operações até o fim muito, muito, muito rapidamente. E isso nos permitirá melhorar um par de nossos tempos de execução. Agora, quando nós meio que olhamos para nossos tempos de execução aqui, podemos ver que ele tem um monte de tempos de execução que são diferentes de raise, e alguns tempos de execução que são os mesmos. E então alguns tempos de execução que são melhores. Por exemplo, inserir na frente será fora do bastão apenas em linha reta até o tempo constante. Você não tem que fazer circular fazendo esse tipo de lógica avançada. Tudo o que você tem que fazer é criar tudo que você tem a fazer é apenas inserir para a frente e mover o ponto de partida sobre aquele novo e o mesmo. Se criarmos este ponto de conto ou na parte de trás, podemos obter exclusões fora da parte de trás e inserções na parte de trás em tempo constante também. Algumas das trocas é que não importa se está ordenado. Nós sempre vamos ter que ir para procurar essa coisa, que significa que nós temos que quanto maior o conjunto de dados, vai demorar para resolvê-lo, o que você pode saber se nós somos, se isso é uma prioridade para o nosso programa, é encontrar dados, então você sabe, você meio que pensa que talvez a lista de comprimento seja da melhor maneira. Talvez uma matriz ou algumas das outras coisas no futuro que passarão por cima sejam melhores do que isso. Mas isso, em poucas palavras, é ou tudo isso é listas vinculadas. Temos uma única lista de links. Temos listas duplamente ligadas. Temos ponteiros de cauda, e todos eles se unem para formar esse tipo de estrutura de dados vinculados que nos permite adicionar e excluir dinamicamente nossa estrutura de dados por capricho. Tem algumas desvantagens. Ele tem algumas vantagens, mas é uma das estruturas de dados chave, e assim que é uma espécie de fim desta seção lista de links. Eu estou realmente animado para saltar para a próxima unidade onde nós vamos ser uma espécie de implementar isso em nós vamos estar construindo fora deles e criando um novo conjunto de estruturas de dados chamado Pilhas e Filas. Então eu vou ver lá 23. Exemplos de de de internet: Agora que temos uma boa compreensão do que são listas vinculadas, vamos em frente e olhar para alguns exemplos do mundo real de listas de comprimento. Agora, esta seção será um pouco mais curta do que a maioria das outras seções, porque nós realmente vamos estar falando em detalhes sobre dois dos principais usos de listas vinculadas. E essa é a árvore e o Q. A próxima seção será, na verdade, em verdade pilhas e filas. Então você vai estar vendo a fila lá dentro e, mais tarde, vamos cobrir árvores. Esses são dois grandes usos de listas vinculadas, mas outro uso de uma lista vinculada é com armazenamento de dados. Seja qual for o seu disco rígido preenche os dados, ele procura memória livre, e meio que liga a memória livre. Agora, em um mundo perfeito, você teria, você sabe, alguma memória alocada em um lugar para qualquer programa que você está armazenando. Mas digamos que no início do disco rígido, você só tem um gigabyte. Vamos cada parte disto é um gigabyte, e todos estes são preenchidos até aqui. Então, digamos que estes três aqui estão preenchidos. Bem, se você tem apenas um gigabyte, a frente e talvez um gigabyte livre aqui e um gigabyte livre aqui e aqui e aqui. E você tem um 13 gigabyte, você sabe, download chegando. Você não quer o programa que Hey, nós podemos instalar isso. Não temos muito disso em uma Siri. Então o que ele faz é realmente vincular essas áreas. Ele instalará um gigabyte dos arquivos aqui. Em seguida, ele irá apontar um ponteiro para esta área. Ele vai apontar para aqui, colocar um aqui e aqui, e ele faz não é uma maneira um pouco mais eficiente do que o que você pode ver aqui. Mas este é o básico de como ele funciona. Ele vai ligar o programa juntos através de vários desses tipos de loops, e ele vai realmente apenas mostrar a você, ou ele vai mostrar que quase em tempo real vai escanear através de tudo isso e trazê-lo de volta realmente Rapidamente. Mas o que ele realmente está fazendo é criar uma lista vinculada para esses dados. E o tipo de coisa legal é, quando você desfragmenta seu computador, você realmente remove um pouco disso. Você está tentando colocá-lo bem ao lado do outro e você está permitindo que o próprio disco rígido real tem que procurar, que é para onde ele se move para ir. Procure por isto. Outras partes podem estar em lados separados do disco rígido. Ele os coloca ao lado do outro, então há menos tempo com isso também reduz os tempos de carga. Outro exemplo do mundo real é, na verdade, com um navegador da Web. Se você pensar sobre isso, esta é uma lista vinculada. A parte de trás e o Ford Arrow. Agora estamos no final da lista, então não é uma lista circular. Eu não posso clicar, ir para a frente e voltar para o início. O que eu posso fazer é atravessar esta lista para que eu possa ir para trás e ir para a Pesquisa Google para ou o erro ortográfico da pesquisa do Google. Provavelmente todas as cinco vezes. Eu posso voltar para três de volta para trás do dedo um, então minha história está quase ligada listas de tipos. Posso ir para a frente para trás e atravessá-lo, mas apenas um de cada vez. A menos que, é claro, eu fui para a guia histórico, que seria mais como uma matriz nesse sentido, mas que é uma espécie de o mais próximo ou o mais riel lista ligada Exemplo que eu poderia pensar. Que todos provavelmente usaram até agora é o histórico em nossos navegadores da Web. Mas isso são apenas alguns exemplos de listas vinculadas. Vamos realmente saltar para alguns dos mais em pederneira como implementações dele em uma perspectiva de ciência da computação com algumas dessas futuras palestras. 24. Stacks 4-1: Agora que temos uma boa compreensão de algumas estruturas de dados básicos são matriz e nossa lista vinculada, podemos começar a construir sobre aqueles para criar estruturas de dados mais complexas, mas mais úteis. E a primeira coisa que vamos falar é de uma coisa muito importante em ciência da computação . E essa é a pilha. Então, o que é exatamente uma pilha? O que podemos pensar sobre isso? Isto de uma forma intuitiva. Uma pilha é basicamente a forma como as bandejas em uma sala de almoço funcionariam. Digamos que você tenha uma pilha de bandejas em um refeitório ou como um refeitório ou algo assim . E então você tem uma pilha. Há um monte de bandejas diferentes aqui, todas empilhadas uma em cima da outra. Agora, se você quer A, você sabe, se você quer uma dessas bandejas, você não vai até o fundo para pegá-la. Isso seria você ter que levantar tudo e, em seguida, tipo, você sabe, você pegar tudo, movê-lo, em seguida, pegar a garrafa e, em seguida, colocar tudo de volta. Então não é isso que queremos fazer aqui. O que fazemos é tipicamente tiramos o 1º 1 do topo e pegamos, você sabe, então temos essa bandeja, e então a próxima vai e quem pegar isso, eles têm uma bandeja. E depois, uma vez que fizermos, esses desapareceram. Então nós gostamos, remover esses dois da nossa pilha. Agora, se alguém aparecer com bandejas limpas, eles não colocam no fundo, eles o colocam de volta no topo. Então, temos novas bandejas limpas azuis desta vez. E assim eles são adicionados ao topo. Agora, se alguém quiser pegar um, eles vão em frente e pegam um. E então agora eles têm um assim e então eles têm uma bandeja Bleu e outra pessoa tem uma bandeja azul, e então alguém pega a 3ª 1 Então eles têm, Ah, comércio negro. E então, no final disso, você sabe, você sabe, continuamos subindo e descendo, subindo e descendo através deste tipo de taxa de estrutura aqui. E toda vez que ficamos sem bandejas limpas, elas são colocadas no topo e toda vez que queremos, quando tiramos do topo, então nós Onley meio que executamos em um lado desta pilha aqui. E é exatamente assim que as pilhas funcionam na ciência da computação. Então, basicamente, o que vai ser vai ser uma estrutura de dados na qual temos um monte de informações que é tipo de situado como este. Então nós temos, tipo, um três para, hum, nós poderíamos ter uma palavra aqui. Poderíamos ter um gato aqui. Podemos ter tudo o que quisermos dentro desta pilha. Mas o que sai disso é que se quisermos pegar da pilha, não podemos acessar em nenhum lugar aqui, exceto no topo. E se quisermos pegar algo, chama-se “pop”. Então não colocamos nada dentro desses príncipes porque não temos escolha. Onde é que estamos apenas estalando. Chamamos a pilha e dizemos: “ Ei, Ei, tire um elemento dela.” E quando poppin elemento a partir dele, temos o elemento superior na pilha bem aqui. Então isso significa que estes cinco vão acabar aqui. E eu também vou estourar. Nós pegamos um cinco e então ele é removido da pilha. E agora, se aparecermos de novo. Então, se chamarmos um segundo pop como então o que vamos acabar recebendo é o segundo elemento vai sair e ele vai ser empurrado ou Itália agarrado e colocar aqui colocar taxa aqui. E então fazemos exatamente a mesma coisa que excluímos deste e agora são Stack só tem dois e três sobrando. Mas se vamos adicionar alguma informação, fazemos algo chamado “empurrão”. E então, nos príncipes, temos que especificar o que estamos adicionando. Nossa pilha especificaria o que está acontecendo aqui que vai estar acontecendo aqui. E então enfraquecer colocar você sabe, alguma coisa aqui? Vamos colocar 107. Então estamos empurrando 107 para a pilha. Isso significa que 100 7 irá então para o topo da pilha e, em seguida, colocá-lo na pilha. E geralmente é assim que uma pilha funciona. E o que chamamos a isso é que chamamos de último. Em primeiro lugar vamos estar lidando com outro chamado F I F. Oh, isso é uma deixa. Isso vai ser tipo de próximo nesta série, mas isso é chamado de último a entrar primeiro a sair. Agora vou admitir que isto é um pouco ambíguo. Às vezes eu fico confuso com um Q porque você acha que o último a entrar é talvez o que esteve lá, o mais longo, e você está pensando que um é o primeiro a sair. Mas não é assim que funciona. Está falando sobre qual foi o último a entrar. Esse é o que vai ser o primeiro a sair. Podemos re pensar nisso como podemos re pensar nisso como em vez de última na primeira saída. Esta é a mais recente da mais recente. Então, é mais recente na primeira saída. E se isso, você sabe, permite que você pense nisso mais fácil do que ir para isso, lembre-se, L I f o vai ser uma espécie de padrão que eles vão dizer quando eles estão falando sobre uma pilha. Mas o que realmente significa é que apenas o mais recente a entrar é o primeiro a sair. E então, se nós apenas fizemos um empurrão, você sabe, nós empurramos em 107 nós pop 107 nós empurramos em 107. Nós estouramos 107. Continuamos fazendo isso infinitamente. Estes dois nunca serão tocados. Ficarão famintos. Eles nunca serão tirados da pilha. E em muitas situações, isso é realmente importante para nós na ciência da computação porque, por exemplo, isso pode ser usado para rastrear como um. Por exemplo, se você está tentando resolver um labirinto, esta seria uma ótima maneira de fazê-lo, porque toda vez que você tivesse uma vez, você poderia empurrá-lo para uma pilha. E então se você for pego, como um beco sem saída, você começa a sair da pilha e então, , digamos que houve um segundo. Havia uma segunda direção aqui. Então, a segunda direção aqui. Então você foi até aqui. Você desceu aqui. Você desceu aqui. Nós temos, tipo, uma pequena pilha de simulação bem aqui, e cada vez que você faz uma dessas voltas, você coloca isso na pilha. Então, você sabe, virou um para a terceira virada para você tipo, oh, nós encontramos um beco sem saída. Então o que você pode fazer é realmente apenas pop off off para ir para trás no tempo e, em seguida, começar em uma direção diferente e começar a empurrar em sua nova direção, que é este novo caminho azul e uma espécie de uma das pequenas aplicações que poderia ser usado é ótimo para, como, teoria dos grafos e alguns dos tipos mais avançados de conceitos em ciência da computação. Mas agora, tudo o que temos que entender é como uma pilha funciona, e também podemos entender como ela é implementada, porque não há tipo de, um, você sabe, maneira exata para fazer isso. Há algumas maneiras diferentes de criar uma pilha e suas maneiras que já falamos . Podemos criar uma matriz que é uma pilha, e podemos criar uma lista vinculada que é uma pilha assim e você tem que pensar sobre qual seria Mawr eficiente. Então nós temos nossa matriz aqui e vamos dizer isso. 01234 e então nós precisaríamos manter o controle do basicamente a frente da pilha todo esse tempo porque vamos dizer que a frente está bem aqui e então nós temos um cursor que você sabe que está mantendo o controle disso. Então temos um para um 10 e um nove para a frente é bem aqui. E então toda vez que chamamos Pop, então toda vez que chamamos Pop nesta situação, o que realmente vai fazer isso vai pegar qualquer que seja esse número de cursores. Então, por exemplo, neste momento este cursor está definido como irá chamar. O cursor See está definido como três. Então, quando nós pop, nós estamos realmente indo apenas para agarrar o elemento em Vamos dizer que toda esta matriz é definida como X. Nós vamos pegar o elemento em X três. Então nós temos que o elemento vai ser, ele vai nos entregar A. Ele vai nos entregar um nove um nove. Então vamos fazer isso. Ele vai nos entregar um nove, e então o que ele faz é, então pega esse número e ele diminui por um para que possamos ir. Então nosso novo R C agora é igual a C menos um, o que significa que agora é igual a dois, e então podemos continuar fazendo isso. Então, basta tirar essa informação. Pegamos e pegamos o cursor. Pegamos o cursor aqui e o movemos de volta, removemos um aqui. E assim é como ele pode funcionar em um array. Agora você pode estar pensando, isso vai ter uma limitação quando chegarmos ao fim. Se tentarmos empurrar mais alguma informação para este fim, vai quebrar. Vamos ter uma falha subsequente, e isso pode torná-la um pouco perigosa. Mas se você souber que está trabalhando apenas com 10 ou mais elementos, essa pode ser uma maneira mais rápida de implementar sua pilha. Agora. A outra maneira que poderíamos fazer é usar uma lista vinculada, e esta também é muito intuitiva. Tudo o que vamos fazer é que cada vez que tivermos um novo pedaço de informação, vamos colocá-la na frente. Então nós vamos adicioná-lo à frente como temos feito com o link Less Solicitous é , vamos colocar alguns números aqui apenas para tornar isso não tão confuso. E digamos que queríamos adicionar um quatro aqui, então tudo o que temos que fazer agora é apenas ligar isso assim e então, claro, mudar nossa posição inicial. Para que aponte para que aponte para o nosso novo. E então toda vez que queremos sair do começo, tudo o que temos que fazer é mudar. Pegue a informação disso e depois mude nosso motor de partida de volta, faça backup de um. E assim você pode ver que isso pode realmente ser um pouco mais rápido no sentido de que você não tem que tipo de configurar tudo aqui, mas, hum, hum, e tudo especial, porque nós não temos que agarrar qualquer coisa de trás. Não procuramos por isso. Este ar sempre tempo constante aqui em cima, e poderia ser expandido para o infinito. Então, você sabe, você pode continuar adicionando notas. Isso o tempo que você quiser. Você não tem que definir o quão grande vai ser. Portanto, esta é geralmente a maneira típica que as pilhas são implementadas. É algum tipo de lista de links. No entanto, eles podem ser implantados em um aumento. Eu só queria te mostrar isso também. E muitas vezes algo que não é, você sabe, completamente incomum para eles serem implementados com um array 25. Exemplo de pilha de 4-2: que temos um pouco da intuição por trás de uma pilha. Eu meio que queria cimentar a idéia de uma pilha passando por alguns exemplos, algum tipo de maneiras que podemos ver como um programa vai inserir os dados, a saída, os saída, dados e, em seguida, como tudo vai funcionar juntos. Então o que vamos fazer é rever alguns exemplos bem aqui. Então aqui, temos apenas um exemplo básico. Ele diz dar a saída final e os elementos restantes da pilha. Então o que vamos fazer é executar esses comandos e então ver o que nossa saída se torna e o que ainda é deixado na pilha no final. Então vamos começar fazendo isso passo a passo. Então vamos ter uma pilha vazia bem aqui. Não tem absolutamente nada nele. E depois a nossa saída. Eu vou colocar nossa saída aqui, na verdade, vamos colocá-lo, Vamos colocá-lo à esquerda aqui porque pode ser longo nós vamos colocar nossa saída bem aqui, assim e então a saída está indo para ter esses números podem cafeinado um sobre outro. Então eu vou explicar isso em um segundo, mas as saídas vão estar aqui embaixo embaixo e então nossa pilha vai continuar passando por cima? Então, este passo um diz empurrar para então vamos empurrar para aqui, que significa que nós apenas adicionar um quatro sob a pilha. E então agora vamos para o próximo que é empurrado para então nada mais aconteceu. Nada foi estourado. Então nós temos uma pilha de quatro, e nós vamos empurrar para ele. Então empurrado para, quero dizer, empurrar para escrever vai para lá. E agora vamos para o próximo passo diz: “ Empurre 15”. Então nós temos um quatro, nós temos um dois, e agora temos um 15 assim e então finalmente chegamos à nossa primeira saída. Nossa primeira saída, diz Pop, Lembre-se, precisa haver nada dentro do pote porque ele só vai pegar qualquer elemento que está no topo. Ele não tem um tipo especificado de elemento, vai agarrar. Você não pode pegar nada embaixo do topo. Então tudo o que temos a dizer é apenas estourar um elemento, então vamos fazer é estourar esse elemento fora. E então tudo o que nos resta é um quatro e um dois, e então que 15 em 15 viaja até nossa saída aqui em baixo. E então agora temos 15 em nossa saída. E então este foi este passo. E então o próximo passo que fazemos é empurrar 27. Agora temos quatro, temos que fazer, e depois temos 27 do topo. E agora o que vamos para Dio é fazer com Pops. Então vamos estourar o 1º 1 que é o nosso 27. Então, neste pop, o 27 vai se mover para baixo e ser colocado em nossa saída. Então agora temos 27 aqui, e você pode separar isso com vírgulas ou qualquer coisa. Só estou juntando todos eles. Então, 15. 27 nós vamos apenas juntar tudo isso assim e então nós temos que estourar novamente. Então este era este pop bem aqui. Onde aquele pop. Agora temos que estourar mais uma vez. Então agora nós temos apenas os quatro restantes na pilha e são muito bem, tipo que eles vão ambos assim. Então a mastigação, que é foi aqui, desce e é colocada na saída, certo? Assim como. Então, temos apenas os dois adicionados. E então esse foi o nosso segundo pop, certo? Como isso. E agora você pode ver que nós estamos indo para baixo esta pilha um tipo de passo de cada vez. O empurra os pops e esta pilha está sendo como, Dynamic está crescendo, está encolhendo, e ele está apenas acessando do topo o tempo todo. Então, vamos dar os últimos passos aqui. Vamos empurrar um três, então desenhe aqui, porque tudo isso aqui está ocupado. Então nós temos quatro e então três é adicionado, nós empurramos em nossos três, e então o próximo que vamos fazer é nós temos que empurrar em outros quatro, então antes de três e depois quatro. E então nós pressionamos que quatro assim e então agora o que temos é que temos três declarações pop . Então nossa primeira declaração pop vai estar aqui, segunda declaração pop vai estar aqui, e eu terceira declaração pop vai estar aqui. E então o que temos no 1º 1 é que vamos saltar esses quatro. Nós vamos pop off que quatro então ele vem para baixo para a saída, e então nós vamos saltar fora que três. Então tudo o que nos resta é antes então que três vão para a saída. E então, finalmente, vamos tirar o último elemento. Então temos uma pilha vazia aqui no final. E então nós temos os quatro grandes, assim, e você vai notar alguma coisa. Você vai notar que no início nós adicionamos este quatro e ele não foi removido até o fim. Havia um monte de coisas aqui na frente, mas não foi movido até o final, porque é uma pilha. E como eu disse, pode estar esfomeado aqui em baixo. Nunca mais poderia ser tocado. Então isso é apenas como uma das pequenas advertências que vem com uma pilha. E então deixe-me apenas desenhar essas flechas tipo de terminar. Este diagrama vai ficar um pouco agrupado aqui, mas é assim que tudo vai ser. Então, um passo de cada vez. Estamos lentamente movendo um para o outro, o próximo para o próximo, e nós esvaziamos esta pilha, e esta será a nossa saída final. Este número está aqui? 15 a 7 a 434 se quisermos colocar vírgulas aqui, é isso. Fora. Coloque assim. E então, sim, essa é a saída final da nossa pilha. E então nossa pilha final acabou sendo completamente vazia. Então vamos fazer outro exemplo aqui, e eu vou deixar este um pouco mais limpo. Agora que não temos. Não vou tentar desenhar essas flechas de novo. Isso foi bom para o 1º 1, mas vamos fazer isso de uma forma que pode parecer um pouco melhor. Ok, então eu coloquei números aqui. E então agora vamos. Passo um. primeiro passo é um empurrão para 10. Então tivemos um saco vazio para começar, colocar para fora, colocar aqui. Então tivemos um empurrão de 10 bem aqui. Então vamos em frente e empurrar 10. O segundo passo diz “Pop”. Então, pegamos esse 10 e o tiramos logo. Então agora estamos de volta em uma pilha vazia. E então esse 10 vai até aqui. Esse 10 vai até aqui e vamos colocar o passo que aconteceu acima dele. Então aconteceu no set to. E então vamos para o passo três. Esse é o empurrão para então nós vamos empurrar os dois para lá assim e então o passo quatro diz para empurrar um cinco para cinco. Passo 5 diz para empurrar um C. Então vamos misturar valores diferentes aqui cinco e depois ver no topo. O sexto passo é outro pop, então vamos estourar o mar. Então, tudo o que nos resta é um cinco e um dois, e vamos colocar a vista aqui em baixo. E então foi no sexto passo que isso aconteceu. E então vamos para sete, que é outro pop. Então agora nós temos apenas os dois restantes na pilha assim e então nós vamos também saltar fora que cinco e colocá-lo aqui em baixo. Este não é o passo sete, então estamos no passo oito agora. Oito diz que precisamos empurrar um 14 então temos um 14 9 diz que precisamos empurrar o cão. Então agora temos que 14 e, em seguida, cão no topo aqui. E agora vamos saltar todos os três elementos. Então, 10 vai descer para e 14 e nós vamos adicionar cão aqui em baixo. E isso foi no 10. E então nós vamos em frente e ir para a parada 11 bem aqui, que sai da 14. Então, tudo o que temos é muito comum, e isso foi no passo 11. E vamos apenas terminar é que muitas vezes podemos terminar este gráfico aqui em baixo. É um último pop, então é uma pilha vazia. Então nós temos ou meu pai 11 11 deve ser 14 11. Deve ser 14 bem aqui, e isto também deve ser . E então isso é no passo 11 e 12. Digamos, porém, que não tivemos o passo 12. Caminho saiu para exatamente a mesma coisa no final aqui nós veio com uma pilha vazia, o mesmo que fizemos no último exemplo. No entanto, vamos chegar a um não terminamos em uma pilha vazia. Então vamos dizer o quê? Nós riscamos o Passo 11. Digamos que somos o passo 12. Então riscamos o Passo 12 e não vamos usar isso. Isso significa que isso vai acabar em uma pilha não vazia para que possamos simplesmente apagar essa coisa toda . E isso é isso acontece muito para nesses tipos de exemplos é que a pilha não precisa estar em vazio para terminar. O problema é que ele ainda pode ter um valor dentro dele. Ou ainda pode ter vários valores dentro dele? E nesta situação, temos uma saída aqui de 10 c cinco cão 14. Mas ainda temos algo na pilha, e isso também é importante. É por isso que temos que fazer. Normalmente, ambas as situações foram para obter a saída e a pilha reinante nessas situações. Porque a pilha pode não estar vazia, ele pode não ser capaz de apenas começar como fizemos com este com anti Stack. Se voltamos a isso quando temos que entender que ainda há dois restantes na pilha e vamos fazer um exemplo ligeiramente diferente, digamos que tentamos algo onde aparecemos para 12 e depois 13. Nós estouramos novamente se fizermos um pop em uma pilha vazia. Então, há uma pilha vazia e tentamos implementar este último pop para que isso vá com o caso original onde estamos em uma pilha vazia. E agora estamos tentando tirar algo de uma pilha vazia que resultará em um ar . Se você tentar estourar de uma pilha vazia, você vai obter um ar enorme algo ao longo das linhas de um ar de falha ou não existe ar, qualquer tipo de programa usando ele vai lançar um ar diferente. Mas basicamente o que acontece é que você está tentando pegar informações que não estão lá, e então você pode escrever no código onde ele vai dizer, hey, hum, hum, ele vai ignorá-lo ou o que quer que seja. Essa não é geralmente a melhor prática de codificação porque significa que você está ignorando o problema , que seu código era inocência errado, onde ele está tentando estourar algo que não está lá, que significa inocência. Estava tentando estourar algo que não estava lá? Que tipo de coisa vem disso? Talvez o design estivesse errado no código. Talvez esteja tentando pegar algo que não tem, então não usamos. Quero ignorar isso. Queremos deixar o ar passar e então podemos consertar nosso código. Podemos corrigir os dados que entram e saem para corrigir isso. Então, apenas entenda, porém, que estourar. Se você tentar pop de Empty Stack, você vai obter um ar a partir disso. Mas esses são os exemplos e o tipo de intuição de como você pode descer um exemplo de pilha empurrando, copping realmente, muito simples, especialmente se você desenhá-lo para fora. Eu recomendo que você desenhe para que você possa ver o quão simples isso realmente é. A tua adição de coisas ao topo. Você está estourando fora do topo e você está apenas listando a saída no final 26. 4-3 filas: Agora que temos pilhas sob o cinto, vamos com o irmão deles. E essas são as pistas. cues são muito semelhantes ao Stax, exceto que eles têm uma diferença importante, e é assim que as informações são extraídas da estrutura de dados. Então vamos fazer exatamente o que fizemos com as pilhas. E vamos passar por cima da intuição por trás do que é um Q. E a melhor maneira de fazer isso é na verdade apenas na Grã-Bretanha, como a língua britânica e, eu acho, língua australiana. Chamam o que os americanos chamam de linha de Q, e isso é por uma boa razão. Por exemplo, digamos que temos, ah, caixa de banco bem aqui. Este é um caixa de banco e há uma fila, que é o que dizemos na América, um, uma fila de pessoas esperando. Agora você terá essa pessoa, essa pessoa, essa pessoa, essa pessoa e essa pessoa. E a forma como esta estrutura de dados funciona é que a primeira pessoa que está aqui sai . Eles são servidos, eles são removidos, e então qualquer nova pessoa é adicionada ao fim aqui. E isso funciona de uma forma que cria exatamente uma fila. As primeiras pessoas a entrar são as primeiras a serem servidas por aqui. Então este é o Lembrem-se de como na última vez que falamos sobre l i f Oh, este é f i f o. E isso significa primeiro a entrar, primeiro a sair. Então os primeiros que chegaram são os primeiros que sairão de denovo. E assim, como eu disse, este tipo de terminologia poderia ficar um pouco confuso. Então, se você quiser pensar sobre isso de uma maneira diferente, esta é a, hum, a espera mais longa, a espera mais longa é a 1ª saída. Então, a pessoa mais longa está esperando é a 1ª a sair, e é claro, essa seria a pessoa na frente aqui. E então a maneira como você implementa isso em uma estrutura de dados é em vez de desenhar uma pilha como esta, porque isso só permitirá que você agarre de uma extremidade é que você pode desenhá-la de lado. E é assim que eu costumo desenhar é que você tem esse tipo de estrutura de dados onde você , hum , tem , tipo, lados aqui, e então se alguém, isso poderia ser a parte de trás, e esta pode ser a frente. E se as pessoas são adicionadas a ele, elas são adicionadas às costas. Então, digamos que temos alguns dados aqui agora. Se as pessoas forem adicionadas a ele serão adicionadas a este lado, e quando as pessoas forem removidas dela, elas serão tiradas deste lado. Então, por exemplo, temos uma nova pessoa que entra. Então, há 31 pessoas que são servidas. Então este três é removido e as ações meio que se movem para baixo assim. E você vê que é um pouco mais difícil de desenhar porque não é exatamente estacionário, é apenas ele continua se movendo enquanto você vai. E isso é apenas uma espécie de natureza de um que nesta situação. E assim, por exemplo, ainda há as operações push e pop, no entanto, eles apenas funcionam um pouco diferente. O pop sempre vai agarrar da frente em vez de de trás, então o pop agarra da frente em vez de como em uma fila onde ele vai agarrar, ou em vez de como em uma pilha, onde ele vai agarrar exatamente do mesmo lado que empurrou . Então, o pai vai agarrar pela frente. Empurrar vai empurrar para trás. E essa é a grande diferença disso. E você pode estar pensando como exatamente? Com isto, sabes que mais? O que? Alguns. Os benefícios disso. Imagine um computador. Temos um processador bem aqui. Ah, processador. Então, uma CPU, como ele obtém dados? Bem, como é que ele obtém, na verdade instruções do que ele deve fazer? Bem, a questão é que, se usasse uma pilha para obter instruções, você teria um problema onde se, por exemplo, digamos que esta de cima fosse como, ah, Navegador da Web. E então este era algo que precisava fazer para o processamento geral justo. E aqui em baixo havia um documento de palavras. Imagine se isso fosse um saco e esses dois continuassem vindo em nosso documento de palavras congelariam porque ele nunca seria tocado. Seria o que é conhecido como fome no fundo aqui, e isso não é uma boa implementação para uma CPU. Ah, melhor implementação seria se em vez de ser uma pilha, em vez de ser uma pilha, o que realmente fizemos foi um Q porque agora ele vai executar. A primeira tarefa vai executar a primeira tarefa e na segunda tarefa e na terceira tarefa . E então, se alguma coisa precisa ser executada a seguir, essas serão adicionadas aqui em baixo. E este Q apenas vai continuar envolvendo e ao redor com um novo tipo de coisas que ele precisa para dio e nossa CPU vai apenas realizar um após o próximo após o próximo depois o próximo depois o próximo depois o próximo. E será capaz de percorrer todos os programas que precisamos. Você sabe que ele precisa realizar os cálculos que precisa dilatar sem nunca passar fome uma determinada tarefa. E assim é uma espécie de como uma CPU funciona. É um pouco mais complexo do que isso, só porque quero dizer, tem que estar fazendo isso como algo como três milhões de vezes por segundo ou algum número louco como esse, e certas coisas têm prioridade sobre outras coisas. Mas no sentido básico, é por isso que você usaria um Q sobre uma pilha é quando você quer que tudo tipo de ter a mesma quantidade de valor e você quer a coisa que está esperando mais tempo para ser servido primeiro. Então vamos tipo de olhar para as implementações. Como podemos fazer isso, poderíamos usar novamente uma lista vinculada ou na matriz até agora estão ligados lista. Fomos para o nosso Ray, o meu pai para a matriz. Teríamos algo assim aqui. E a coisa é, isso precisaria ser uma matriz circular. Isso precisaria ser circular. Lembra quando falamos sobre as pilhas que podíamos usar o direito normal quando tínhamos que fazer era ter uma maldição. um tipo de Sim, um cursor que apontou para a parte inferior, para trás, e então ele apenas se moveu para cima e para baixo. O problema é que a frente e a parte de trás estão sempre se movendo por todo o lugar. Portanto, o que precisamos fazer é que precisamos realmente implementar. Precisamos implementar uma direita circular para que a frente e para trás possam se mover. Então o que fazemos é que temos, digamos, algumas informações aqui, e teríamos um cursor que aponta para a frente e um cursor que aponta para a parte de trás solicit diria, talvez essa seja a frente. Talvez esta seja a parte de trás. E agora, quando adicionamos dados, eles seriam adicionados na parte de trás ou a frente não importa, desde que os lados sejam opostos. Você adicionou em um lado e você pega dados do outro lado. Então você moveria cada um desses para cima. Então, se você tomou ou se você adicionou na parte de trás, a parte de trás seria então movido. A parte de trás dentro de mim mudou-se para o novo pedaço de dados pouco duro ali mesmo. No entanto, seria movido assim, e então a frente não se moveria. E se você pulou da frente, então você pega este e você move este aqui também. Então é exatamente como falamos sobre a matriz circular. Temos que fazer circular. Para que ele funcione caso contrário vai correr para situações em que temos que continuar usando O para o n dedo do pé, mover todos os dados para frente e para trás. E isso fica muito, muito tedioso final realmente intensivo em recursos. A próxima opção enfraquecer Dio é que podemos usar nossa lista vinculada para que possamos ter nossa lista vinculada aqui e a maneira que vamos fazer isso é que precisamos ter tanto esse ponteiro inicial , o ponto inicial normal que temos. Também precisamos ter aquele ponteiro de cauda que falamos. A razão pela qual precisamos do ponteiro da cauda é para sabermos exatamente o que está no final da lista aqui. E se soubermos o que está no final e se conseguirmos chegar a ele imediatamente, então enfraquecer, agarrá-lo, enfraquecê-lo, apagá-lo e podemos tirá-lo. Mas há um problema aqui é que se nós apenas temos um ponteiro de cauda e tentamos estourar isso, este não vai ser reiniciado e isso vai ser um problema. Nós não podemos nunca ir anterior, então isso é realmente vai normalmente precisar ser uma lista duplamente ligada. Isso nos permitirá não só mover para o final, mas também voltar um e redefinir tudo isso para saber para que não tenhamos problemas onde isso ainda está entrando em contato com um não, que não existe mais. Então nós vamos ter que eles têm que usar a lista vinculada mais avançada que falamos , que é uma lista duplamente ligada com um ponteiro de cauda. E agora toda vez que queremos adicionar algo a isso, nós apenas adicionamos no início. Então nós apenas adicionamos mais. Nós apenas adicioná-lo assim e refazer as setas e ele é adicionado à frente toda vez que precisamos excluir algo, nós apenas removê-lo daqui e, em seguida, reajustar o ponteiro de cauda para trás tudo em tempo constante . E isso é essencial para tudo isso. Vamos falar sobre o fim disto, como são os tempos de execução de todos estes. Mas agora só precisamos entender, e isso vai ser. O ponto principal disso é que todos eles precisam acabar como um tempo constante. Caso contrário, ele começa a ficar muito intensivo em recursos e especialmente porque se você fizer isso direito , todos eles podem ser tempos constantes, então não há razão para fazê-lo ao longo do final. Se todos eles podem ser tempo constante. Então isso é um Q. E essa é a intuição por trás de um Que na próxima palestra. Vamos fazer exatamente a mesma coisa que fizemos com sacos e vamos repassar alguns exemplos 27. Exemplos de file 4-4: Não é. Repassamos a intuição por trás do Cues. Vamos para alguns exemplos para que possamos ver como a estrutura de status interage com os dados que é dado. O primeiro exemplo que vamos fazer vai ser muito familiar. É idêntico a um dos exemplos que fizemos para as pilhas, e a razão é que eu quero mostrar a vocês como os dados sairão de forma diferente para que vocês vejam isso aqui. O que temos é a saída de pilha que isso deu. E, em seguida, aqui em baixo é exatamente o mesmo conjunto de instruções que fizemos com a pilha para obter esta saída. Então vamos ver o que um Q vem com. Então tudo o que temos que fazer é basicamente a mesma coisa que fizemos com as pilhas no passado, onde vamos um passo de cada vez e indo um passo de cada vez, somos capazes de, hum, capazes de ver como estas pilha está sendo construído ou nesta situação, como o Q está sendo construído e, em seguida, qual é a saída final. Então vamos descer aqui e vamos anotar a saída também. E assim, as saídas serão aqui em baixo. Estão todos contados para nós. Para que possamos, você sabe, criar esta grade aqui dos passos. Então vamos começar. Vou desenhá-lo de lado. É hora de ter certeza que parece um Q, e vamos empurrar um 10. Então esse é o nosso primeiro passo aqui. O segundo passo vai ser pop, então temos que pop em elemento off. Há apenas um elemento aqui, então nós saltamos o 10. Então, agora que o Q fica vazio, o 10 vai para baixo aqui e, em seguida, nós também podemos direita na etapa em que isso aconteceu. E depois vamos para o três. Então nós estamos empurrando em um a quatro estavam empurrando em um cinco e depois cinco. Estamos empurrando um C. Oops. Devíamos ter a certeza de que temos os dois lá também. E então cinco estavam empurrando um C, então vai ser muito cinco. Veja, e então seis agora seis estavam estourando e em uma pilha estaríamos pulando do lado direito aqui, o lado que o que entrou aqui mais recente. Mas isso é acusado. Então, saltamos o que está aqui há mais tempo. E você verá que a diferença aqui está aqui na pilha. Nós fizemos. Nós saltamos do que pegou o primeiro o mar. Mas nesta situação em que vamos saltar o para então os dois vão para a direita aqui e isto agora só tem cinco e ver esquerda nele. E então podemos ir em frente e dizer, Que número? Os cientistas, o sexto passo, isso aconteceu. E em vez disso, sete, vamos fazer outro pop. Então tudo o que resta agora na pilha é o mar. E então colocamos o mar aqui e continuamos em frente com um oito. Então, com um oito estavam empurrando um 14. Então agora são 14. Para o meu mal é, Veja está à esquerda, Veja está pronto para ser atingido em seguida. Então é C e então 14 vai para a parte de trás, e então nós vamos para o nove e nós estamos empurrando o cão também. E então agora temos C 14 e cachorro, e então finalmente, vamos estar estourando. Então, temos um “pop”. Ele vai remover um elemento, o próximo Pops pode remover outro elemento. E então, finalmente, temos uma string vazia. Então, o primeiro pop, vamos remover o 1º 1 aqui, o que está esperando há mais tempo, o mar. Então tudo o que vamos ter aqui é que vamos ter um quatro, e depois um cão ou 14 14 14 e um cão. E então tudo o que nos resta aqui é um cão. E eles terão uma fila vazia bem no final aqui. Então o C sai, então é o 14 sai, e então o cachorro sai. Então o que temos aqui é que vamos ter Oh, eu cometi um erro. Cometi um erro. Isso não deve ser Ver, Deve haver cinco porque nós pulamos fora os cinco. Agora este é C e depois 14. E depois é cachorro. Desculpem por esse erro, pessoal. E então isso acontece às 10. Isto é o que acontece às 11 e este acontece às 12. E agora você pode ver, exceto quaisquer outros erros que eu possa ter cometido, você pode ver que estes são realmente muito diferentes um do outro. Suas saídas há uma espécie de reverso um do outro onde você pode ver que os dois é quase aqui, enquanto os dois estão no final. Aqui, cão é completamente diferente. Então não há realmente muito de um padrão aqui, Mas você pode ver que o estado inicial foi o mesmo, porque empurrar um pop é sempre o mesmo, se é um empilhador que apenas um logo após o outro. Mas o que você começa a obter mais dados lá. Eles lidaram com isso de uma maneira completamente diferente. Então isto é, se isso fosse como, por exemplo, um processador de computador ou algo assim, essas tarefas seriam realizadas de maneiras muito diferentes. E nessa situação, os dois foram empurrados para o topo. Mas não foi executado até a última declaração. Então este teria esperado muito tempo. Bem, este foi muito mais justo. O que veio primeiro estava esperando mais tempo. Foi a média deles. Assim, os tempos de espera eram todos relativamente médios em geral. E é por isso que isso é melhor para, como fazer processamento de computador e coisas assim. Então esse é o primeiro exemplo do Q é muito fácil. Tudo que você tem que fazer é Pop e então você empurra ou você empurra e então você sai do lado oposto e você tem esse tipo de bonitinho como a linha funcionaria. Então agora vamos fazer outro exemplo, e você vai notar que aqui os nomes mudaram e isso é porque pop e push podem ser usados. Mas também as pessoas usam em Q e D. Q. E a razão para isso é para que ele não se confunda com, por exemplo, outra pilha no programa de modo que a pilha teria popping push, e, em seguida, o O Q teria em Q e D. Q. E então o que isso faz? É, como eu disse, que separa aqueles dois. Você pode ver que você pode não, mas eu só quero apresentá-lo a esses conceitos para que você entenda. Se você vir um ANC, você é de que o que exatamente é. E agora neste, eu vou fazer um pouco de uma abreviação como eu poderia resolver este problema porque ficar muito, muito ver vangloriado. Por aqui, é É preciso muito espaço em um monte de escrita, então eu vou mostrar-lhe uma maneira mais rápida de fazê-lo onde você chegar onde você não tem que escrever os passos toda vez e você pode ter exatamente a mesma quantidade de precisão. Então vamos em frente e começar. A primeira coisa que vamos fazer é desenhar um Q bem grande aqui. Assim, nós vamos, você sabe, fazer isso muito, muito grande. E então vamos ter uma saída aqui e vamos começar. Então a primeira coisa que vamos fazer é ir em Q A 10, 15 e 17. Então nós incluímos esses três números. Então, agora estamos aqui para baixo, e agora nós batemos o seu primeiro 1 Então o que podemos fazer é apenas riscar o do lado oposto que estamos adicionando e colocá-lo em nossa saída. E então nós poderíamos apenas passar para o próximo passo em Q e L. Então agora nós em Q para este lado. E agora vamos fazer com o Deke. Use ridicu um. Estamos em um D bonito, também, então vai ser este 15 e neste 17 para que possamos riscar 15 17 e escrevê-los aqui. 15 vieram primeiro, e depois o 17. E agora estamos aqui. E então o que vamos fazer é em Cuba 14. Então nós colocamos um 14 aqui, e então nós temos mais dois uso de pau, então nós vamos em frente e de que o L d. Q. Q. o 14 l 14. Conserte esse 14 aqui em baixo l 14 e finalmente agora, bem no fundo. Aqui estamos nós, direto para as duas últimas operações, o em q de quatro, e então nós vamos de que isso para. E agora o que nos resta é que temos o nosso, hum e de fato, Q. E então esta é a nossa saída e vocês notarão que levou substancialmente, você sabe, menos tempo. E esta é uma boa maneira de explicar o conceito, porque você pode ver cada passo do caminho. E se você quiser olhar para trás, você pode ver o que aconteceu entre cada empurrão e cada pop. No entanto, quando você está resolvendo esses problemas, você pode querer ir com uma versão manual mais rápida e rápida como esta, onde você pode apenas ter um Q que você está entrando e saindo . Então você quer continuar redesenhando pistas e acompanhando as coisas, e isso vai ajudá-lo muito. Porque mesmo nessa situação, lembra como eu estraguei tudo aqui? Eu não coloquei um 5 e coloquei um C lá. Mesmo nisso, não me salvou disso até o fim para onde eu tinha que ir. Na verdade, verifique isso. Ele tem exatamente a mesma quantidade de precisão, e acelera seu fluxo de trabalho. Ele não mostra os conceitos também, mas vai conseguir o resultado final muito mais rápido. Então esse é o exemplo aqui. Como eu disse, muito mais rápido. Quando você faz isso assim e você pode ver que é exatamente como todas as outras dicas que você coloca deste lado. E então você, hum, na verdade, está colocando no lado direito aqui. Isto seria como a nossa frente e, em seguida, a sua Esta é a nossa parte de trás. Então nós pulamos deste lado, empurrado para o lado, e essa coisa meio que se move aqui enquanto nós lentamente fazemos isso. Então isso é alguns exemplos de pistas realmente, realmente estrutura de dados puro que você pode construir a partir de outras estruturas de dados e que tem tantas aplicações do mundo real e é realmente essencial para aprender um cientista da computação za. 28. 4a 5 de fila e de corrida e: Então, antes de encerrarmos esta seção, eu queria discutir algo que estivemos discutindo e todas as outras seções. E isso é o tempo de execução de pilhas e filas e os tempos de execução não são tão cortados e secos como, por exemplo, as listas elancet ou a matriz. E isso é porque essas estruturas de dados não são estrutura de dados do que elas mesmas. Eles são construídos a partir de outras estruturas de dados, que significa que os tempos de execução são realmente dependentes de qualquer estrutura de dados em que você construí-lo. Então, se nós descermos aqui e olharmos para nossas ações, temos um empurrão em um pop e nossas dicas não têm em Q e D.Q . .E nós podemos usar para ambos que poderíamos usar em array. Então você conhece o array clássico, ou podemos usar uma lista vinculada, então temos a escolha em cada um deles. No entanto, se você pensar sobre isso, cada um destes a matriz e a lista vinculada todos eles tinham a capacidade de se você escolher um dos outros dedos têm um odor, o um inserto significando inserção de tempo constante e um tempo constante exclusão no final, o que significa que precisamos filmar para em nosso tempo de execução de todos esses, precisamos filmar por tempo constante, porque isso pode ser feito em tempo constante. Assim, uma vez que pode ser feito em tempo constante, precisamos ter certeza de que toda a nossa tinta usada Pushes e Pops acusados também estão em tempo constante . Se ele é executado em tempo linear ou em tempo quadrado ou qualquer outro tipo de tempo maior do que o nosso Q e Stack seria terrivelmente ineficiente porque, como eu disse, nós já provamos que essas operações podem ser feitas em tempo constante, Então por que torná-lo mais lento do que isso? E como você pode fazer isso? Então vamos para o exemplo de uma pilha muito rápido. Então, digamos que temos uma pilha bem aqui. E se usarmos, por exemplo, um array com um array, tudo o que temos a fazer é manter o controle de uma extremidade. Então temos que fazer é, digamos, três a nós temos que apenas empurrar para o fim, e então nós podemos saltar do final, empurrar para o fim, pop do final. Podemos continuar fazendo isso para frente e para trás e lembrar que uma matriz é sempre constante, tempo inserindo se você sabe o número do local aqui. Então, por exemplo, como 123 Se você conhece o exemplo do holofote, então você pode simplesmente ir para que excluir um off, ir para aquele push one de volta, que significa que a exclusão e a inserção são os dois vão acabar com um. Você também pode fazer isso com uma lista vinculada, desde que tenha um ponteiro de cauda. Então, basta ter o ponteiro da cauda apontar para o fim. E, em seguida, sempre que você chegar lá, ele provavelmente vai precisar ser uma lista duplamente ligada para que possamos torná-lo uma rápida inserção e exclusão. Nós apenas removemos o final e, em seguida, mover o ponteiro para trás um. E se quisermos adicionar um, fazemos exatamente a mesma coisa onde adicionamos um aqui. E então movemos o ponteiro da cauda sobre um também. E assim ambos, como provamos anteriormente, podem ser tempo constante também. Então isso significa que tanto pop e push devem ser, Oh, para um, e é assim que você sabe que você tem uma pilha eficiente ou Q. E então nós podemos apenas fazer o tipo rápido de exemplo bem para o, hum para o Então vamos em frente e colocar fila aqui em cima e agora este é um pouco mais complexo, e aqui é onde você pode ter um ar ou algo assim. Se você escolher o design errado, você terá algo muito lento. Por exemplo, se tivéssemos Se implementássemos, é apenas por uma matriz normal. Então implemente isso apenas por uma matriz normal. Temos que empurrar e estourar de extremidades separadas, então temos que empurrar para este fim. E nós tivemos o pop deste lado. Mas o problema é com um array. Se não for circular, quando aparecermos, teremos que mudar todos os elementos de volta para baixo para manter o controle de tudo. E quando mudamos tudo de volta para baixo, isso se torna uma ode para o em operação. E como dissemos, não é isso que queremos. Então temos que ter certeza de que se estamos usando um array para isso que ele precisa ser circular , ele precisa ter ponteiros dianteiros e traseiros. Podemos desenhar o trilho circular aqui. Precisa ter ponteiros dianteiros e traseiros para que, como discutimos anteriormente, possa ser aquela circular onde possa ir em qualquer direção. E ele não precisa mover todos os seus dados para manter essa integridade. Então isso é uma espécie de pequena armadilha que as pessoas podem entrar onde eles tentam fazer um que, uh implementado através de uma matriz. E o problema é que precisa ser circular. Se eles não tiverem. Circular, eles terão um muito ineficiente ou bem aqui. E agora a próxima é uma lista vinculada, que é realmente muito comum para um Q. E isso é porque é muito intuitivo com um Que então ele precisa ser duplamente ligado com um ponteiro de cauda, e então ele tem o normal ponto de partida também. E então, se estamos empurrando, vamos empurrar para este fim. Então ele vai, você sabe, você sabe, por aqui e então se nós estourarmos, nós vamos estourar deste lado, ou se você quiser, isso é no Q. E este é o Deke. Você e essas duas dicas são muito comuns. Como eu expliquei anteriormente, o ponto final é muito fácil de mantê-lo apenas um pouco de código extra, um pouco de manutenção extra, eo ponteiro de início está sempre lá. Então sabemos onde estão ligados lista é. E com esses dois elementos que podemos empurrar, podemos Pushor em Q e Popper. Dick, você realmente, muito simples e sempre em tempo constante. Então isso é apenas a base do tempo de execução. Basta entender que eles devem ser sempre constantes. Hora de empurrar e aparecer. Q e D. Q. Se você chegar a uma situação em que é devido o fim, então é um algoritmo ineficiente e pode ser repensado para ser mais rápido, realmente bonito, simplesmente simplesmente correr para ele em um caso assim. Mas eu só quero que vocês , entendam esse conceito porque, como eu disse, como eu disse, este é um curso de ciência da computação e entender os tempos de execução. Tudo é muito essencial para entender, ganhar e onde usar tudo 29. Exemplos de 4-6 de pilha e de filas do mundo: para que tenhamos uma boa compreensão de pilhas e acusados. Vamos repassar alguns exemplos do mundo real de onde podemos tê-los visto em um aplicativo limpo ou dois deles. Então o primeiro 1 que todos vimos antes é desfazer e refazer. Então, por exemplo, em um documento do Word, se eu decidir ir para trás, você pode ver que eu posso desfazer as coisas. Mas se eu decidir não fazer nenhuma mudança, eu poderia voltar para a frente e isso funciona com duas pilhas. Então aqui temos, tipo, tipo, nossa ativação ou pilha de comando. E aqui é a pilha de reduções. Então, estamos no comando de fogo. Entramos em algo para o programa e queremos voltar para o comando para o que fazemos é que aparece cinco off e insere. Ele empurra-o para esta pilha direita. Digamos que queremos ir para os comandos de volta. Ele abre o quatro fora e empurra para aqui para a pilha certa também. Então agora o que temos é que temos esta pilha à esquerda, que é nossa ativação, ou nossa pilha de comando. E estamos agora no Comando 3, o terceiro comando que entramos agora estes dados não foram apagados. É só sentar nesse ato reduzido. Se quisermos refazer as coisas, refazemo-las. Ele aparece fora disso e trazê-lo de volta. Digamos que não queremos ler você. 55 foi onde um erro. Waas Queremos adicionar um novo 16 até este. Então o que fazemos é pegar e adicionar 60 aqui. Mas agora, se clicarmos em refazer, levaria este 500 estourá-lo em cima de seis e destruiria a integridade desta pilha aqui. Então, sempre que adicionamos algo, sempre que não refazemos, então, por exemplo , aqui, se nós este d f g bem aqui, se eu excluir todos esses e digitar outra coisa, não há nenhuma maneira de eu poderia voltar a isso. O que eu faço é, sempre que adicionamos uma nova mudança que não seja um rádio, nós simplesmente limpamos a pilha certa. Então removemos tudo de e tornamos assim novamente. E agora podemos começar nossos desfeitos e reduzir mais uma vez andando para frente e para trás. E se fizermos outra mudança novamente, tudo isso será limpo e removido novamente. Então é basicamente assim que desfazer e refazer funciona. Há também uma pequena coisa legal é se você já entrou em, como, como, um documento do Word ou algum outro programa, e você continua clicando no controle Z, que é indevido ou clicando no botão desfazer e você chegar ao fim do indevido. Isso é porque você encheu a pilha. Então, se expandirmos isso todo o caminho, você sabe, nós colocamos um digamos que temos o comando, você sabe, seis e então cinco realmente vai aqui. Não desfizemos nada. E, você sabe, nós colocamos um sete aqui em cima. O que foi? Se você quer colocar um oito Bem, colocar em oito, nós não queremos, você sabe, apenas dizer, apenas dizer, você sabe o que? Não vamos mais manter o controle disso. O que fazemos é pegar o único e apagá-lo, fomos removidos da pilha, e então pegamos tudo e desligamos. Então agora temos 2345678 e então vocês notarão que o Comando 1 não está mais rastreado. Isso significa que podemos desfazer Onley para comandar, e cada vez que fizermos outro comando, ele vai pegar esses e remover o fundo dele e, em seguida, empurrar tudo para cima também. Então é uma espécie de Ah, pilha modificada no fato de que podemos remover do fundo, mas isso é apenas quatro transbordos para a pilha. Apenas uma pequena advertência de, se você já se perguntou por que você não pode desfazer mais é porque sua pilha foi preenchida e não tem mais memória para armazenar esses comandos. Um tipo puro de uso de agendamento é ou puro uso de cuse é agendamento. Então, o que exatamente é o agendamento? Bem, em qualquer tipo de computador, comandos são dados a ele, e muitas vezes um monte de comandos são dados a um computador, e ele tem que entender Win para usar esses comandos. Vamos pensar em um exemplo de impressão. Digamos que temos 100 computadores em um escritório ou biblioteca, todos conectados a uma impressora, e todos estão tentando imprimir ao mesmo tempo. Como ele lida com quais imprimir primeiro? O que ele faz é que quem chegar lá primeiro termina seu trabalho primeiro. Então, por exemplo, digamos que estamos neste lugar na fila. Temos 345 O próximo trabalho a ser concluído é no lado inferior, e isso é uma espécie de que se acumulando. Então temos três. Vai em frente e ser impresso. E então agora, durante o tempo que estava sendo impresso para, decidiu que eles queriam ter um trabalho de impressão, e então um decidiu que eles queriam um trabalho de impressão também. Então o que ele faz, ele apenas os coloca no fundo da lista, e então ele continua para baixo. Uma vez que termina um trabalho e se move, , eu tenho um próximo trabalho aqui, ele vai para o Prince, e vai para os próximos 15 e então, você sabe, as pessoas podem voltar para o outro lado. Então vamos dizer que este Q continua se expandindo ou podemos realmente torná-lo circular. Então nós colocamos os três lá ele vai para ele impressões que o trabalho quatro tem outro emprego, então eles colocá-lo lá. Um agora vai ser completado e é assim. Então é apenas uma maneira de agendar todos esses comandos em um tipo agradável de linha bem ali . Então, é uma feira se você imprimir primeiro. O cara que imprimiu 10 minutos depois de você não deveria conseguir o emprego antes de você fazer coisas assim . É só uma forma de agendar para ser justo. Há também uma maneira de atravessar um labirinto com uma pilha. Este é apenas um tipo de exemplo divertido. Aqui, digamos que temos uma pilha com esta grade não se alinha exatamente aqui, mas é o suficiente para fazer o ponto o que você pode fazer com surpreender se vamos dizer que nós movemos através do labirinto e cada movimento, nós colocamos na pilha. Então você sabe, nós passamos por tudo aqui. Chegamos a este ponto, podemos ir para a direita. Bem, se formos para a direita, vamos colocar o que quer que seja este azulejo. Então, digamos que este azulejo é sete e este azulejo é oito. Então vamos colocar sete aqui e vamos subir agora. Tivemos uma parede. Não há mais opções e não há mais direções que podemos ir. Então o que fazemos é começar a sair da pilha. Começamos a recuar até chegarmos a um ponto em que possamos tomar outra decisão. Então voltamos a este ponto e pensamos, bem, bem, aquele caminho não foi bom. Então, vamos descer por aqui. Agora temos três decisões. Então, digamos que na primeira decisão, decidimos, vamos para a esquerda, move-se até aqui. Nenhum alcance morto em pop off, pop, pop, pop, pop, pop pop de volta a este. No entanto, podemos tomar mais decisões aqui. Vamos descer nenhum médico pop aqui e então mover todo o caminho nesta direção. Temos que tomar decisões. Vá para a esquerda. Não. Morto no pop, pop, pop, pop, pop, pop. E então nós vamos, Vamos tomar essa decisão ainda assim nós saímos do labirinto. É uma maneira que seu programa pode ser executado através de um labirinto e encontrar todo o caminho através dele. Seu amigo, seu programa pode ser muito rápido. Digamos que toma decisões corretas toda vez que acerta. É como ir aqui. Vamos descer. Certo, temos mais decisões aqui. Vamos para a direita. E depois vamos por todo o caminho. Vamos para a esquerda. Não. Vamos lá para baixo. Encontramos uma saída. Se isto não fosse uma saída, eu diria , OK, vamos voltar até aqui. Vamos para aqui. Ficou sem decisões para ir aqui e digamos que agora aparecemos de volta para este, e ele começa a olhar para este também. Então, é apenas uma maneira que você pode manter o controle de onde você esteve e quais direções você pode ir dentro de um labirinto. É uma forma divertida de usar uma pilha para fazer uma espécie de jogo. Essas são algumas aplicações puras de pilhas e filas. Eles são usados em todo o lugar na Internet só porque a Internet e qualquer programa são realmente apenas porque as filas são ótimas para agendamento? As pilhas são ótimas para tipo de colocar coisas e, em seguida, lançá-las de uma forma que funciona, por exemplo, com desfazer e refazer grandes estruturas de dados e grandes coisas para aprender. Se você está indo para a ciência da computação 30. Algoritmos de classificação de de 5-1: Então agora temos uma boa compreensão de algumas estruturas de dados básicos, especialmente de um aumento enfraquecer. Comece a discutir como classificar as estruturas de dados e as que vamos falar nesta unidade específica estão classificando diferentes matrizes. E você pode estar pensando, por que é tão importante classificar um array? Bem, lembre-se de como estamos falando sobre o algoritmo de busca, o tempo de execução de pesquisa para nossos arrays, e dissemos que o tempo de execução da pesquisa é devido até o fim. No entanto, se for ordenado, então é devido ao log de in. E então nós ainda dissemos que sobre o log dele é basicamente tempo constante. Então isso significa que aproximadamente nós podemos obter oh, tempo constante de procurar uma matriz, isto é, que é sortido. O que significa que a classificação melhorará nosso tempo de execução geral, todo o lote. Então, por exemplo, se nós tivéssemos, você sabe, um três um um um seis e um sete aqui em vez de ser assim, se nós classificar isso, se nós usarmos um algoritmo de classificação nele, então nós vamos realmente sair com algo que faz um pouco mais desde 1367 E isso nos permite aplicar novamente aquele tempo de execução de pesquisa mais rápido para ele, e isso nos permite aplicar algumas outras operações que são um pouco mais rápidas também. E assim classificar um array é extremamente importante. No entanto, há uma tonelada de maneiras diferentes de fazê-lo, e isso é o que vamos discutir nesta unidade são todos os diferentes ritmos de ordenação , seus tempos de execução quando você pode usar um que complexidades e apenas obtendo uma melhor compreensão de como podemos classificar algo como uma matriz para torná-lo mais rápido sobre o em diferentes aspectos. 31. Classificar de 5-2: Então o primeiro algoritmo de classificação que vamos cobrir é um algoritmo de classificação conhecido como Bubble Sort e bubble Sort é notoriamente fácil de implementar, mas muito ruim classificação fora deles, e vamos discutir por que isso é. Então vamos passar por cima da intuição de exatamente como a espécie de bolha funciona. Então vamos dizer que temos, por exemplo, em um raio aqui e vamos torná-lo um array simples. Vamos fazer seis longos seis grandes aqui, tão separados, e como, talvez como um aqui um aqui. Claro, são seis colunas diferentes lá dentro. E digamos que temos um 7 a 10 153 E então o tipo bolha faz é que começa em um lado disso, então começa para o lado esquerdo e sobe e pega o número mais alto que vê. Então, por padrão, ele vai pegar o primeiro número, e então ele pergunta, esse número é maior que esse número? Se sim, trocaram suas posições, e então uma vez que eles são trocados, ele passa para a próxima. Este número é maior que este número? Se sim, troque suas posições e continua subindo e descendo assim. Então vamos apenas rever alguns exemplos aqui. Então o que temos é que temos este sete bem aqui. E então sete é agora são alérgicos. O número é sete maior que dois. Por que, sim, é. Então o que fazemos é ir em frente e trocamos suas posições para sete. E deixe-me colocar essas em vermelho. Então, somos bastante consistentes aqui. Então trocamos as posições para sete. Agora sete é maior que 10? Não, não é. Então o que fazemos é mantê-los no mesmo lugar, e agora 10 se torna o nosso maior número. 10 é maior que um? Por que, sim, é. Então nós trocamos suas posições e então nós temos o 10 aqui e o outro vai bem aqui . 10 é maior que cinco? Sim, é. Nós trocamos suas posições, então eles cinco vão para cá. O 10 vai aqui e, finalmente, fazemos isso mais uma vez, onde o 10 vai aqui, e então os três se movem para trás. Então você vai notar que agora nós temos um lugar. Tin Ordenado é o nosso maior número. Já foi resolvido. Está no topo, muito bem aqui. E então o que fizemos foi pegar o 10 que começou originalmente aqui, e movemos todo o caminho para cima. E agora temos o primeiro número. Temos um ponto resolvido. E agora o que podemos fazer é dar mais um passo aqui. Podemos dar mais um passo aqui. Vamos redesenhar isto muito rapidamente. E então vamos começar com o nosso são dois é um maior do que sete. - Não. Então os dois vão ficar onde estão, e então vamos dizer que o sete sete é agora o nosso maior número é sete maior que um. Sim, é. Então vamos trocar o de trás para frente e vamos nos mover. Estes sete são sete maiores que cinco. - É. Então vamos trocar de posição. Então agora cinco está aqui e sete está aqui, e nós vamos apenas desenhar o resto. E aqui está sete maior que três. - É. Então trocamos suas posições mais uma vez e agora temos 37 Então agora temos duas partes classificadas . Temos duas áreas aqui classificadas. Vamos continuar aqui. Vamos continuar aqui mesmo. E eu vou ser assim de ser capaz de copiar. Vamos destacar isso no currículo de controle e movê-lo para baixo e depois consertar a pequena linha ali. Deveríamos ser bons Dogo. Ok, então o próximo passo é fazer de novo e de novo é um cinza do que para ele. ISS Então agora nós movemos estes e nós trocamos estes em torno de 12 é maior que cinco. Não é. Então agora cinco é o nosso maior número. Cinco é agora o nosso maior número. Aqui são cinco maiores que três. Então trocamos aqueles 35 e agora eles estão na posição certa. E então agora você vai notar que vamos correr através dele mais uma vez e nós percebemos que um não é maior que 22 não é maior que 33 não é maior que 55 não é maior que 77 não é maior que 10. E estamos acabados. Nossa pequena hum nossa matriz aqui foi classificada usando o tipo de bolha. Então, a razão pela qual se chama Bubble Sort é porque você está borbulhando o número mais alto até o final e você está classificando um por um de cada vez. Deixe-me mostrar um pouco mais de uma forma intuitiva de ver. Este é um ótimo site chamado Visual Go e então eu não estaria mostrando a sua representação do algoritmo bem aqui. Então deixe-me ir em frente e clicar no botão play sobre isso, e então você vai notar aqui é que ele está fazendo exatamente a mesma coisa. O quatro é maior, e ele continua verificando e o que quer que seja maior que ele troque. Então, o 47 é maior do que todos os números até agora, então ele continua trocando-o, e então 50 se torna grandes números. Então agora temos uma área classificada que vem em amarelo, e agora fazemos de novo. O 44 é agora o nosso maior número, então ele está subindo e está lentamente trocando um de cada vez, e então 46 se torna o maior, e agora temos uma garantia de pontos que são classificados. Faça isso de novo. Continuamos subindo com um 38 e você vê isso devagar. Ele está ficando cada vez mais sortido como nós G o. Agora nós temos três lugares garantidos, e ele vai continuar assim até que ele termine então nós podemos realmente acelerar isso até uma guia aqui e agora você pode ver que quando ele faz, Isso vai fazer isso quase instantaneamente. Hum, ele vai passar por todo o seu muito, muito rápido. E esta é a essência do que o tipo de bolha está fazendo, e agora a coisa toda é classificada. Então isso é uma espécie de bolha em poucas palavras. Então agora vamos quebrar isso e ver por que isso é um algoritmo tão ruim? Bem, se tivermos apenas um tipo simples de olhar para isto, digamos que temos talvez quatro aqui. Se dermos uma simples olhada no que ele precisa para dialogar, vamos dar uma olhada no pior cenário. Então o pior cenário é que ele vai ter que pegar um elemento e, em seguida, movê-lo para o topo cada vez. Assim, o pior cenário seria realmente um completamente inverso um gráfico completamente inverso, que significa que ele foi classificado na direção errada. Então, nesta situação, em vez de ser, em vez de ser 37 para 1, seria seria 7321 e então esta é uma espécie de direção exatamente oposta. E isso significa que toda vez que borbulha, vai ter que pegar isso, movê-lo todo o caminho, pegar o próximo e movê-lo todo o caminho. Pegue o próximo, mova-o todo o caminho. E assim você verá que o número de operações necessárias realmente sobe muito exponencialmente. Então temos que pegar isso e movê-lo. 123 e agora os três estão aqui. Então eu tive que movê-lo para cima. 12, depois um. E então estamos resolvidos. E isso realmente sai, também, porque o pior cenário é que temos que pegar isso e temos que compará-lo em número de vezes e movê-lo em número de lugares que sai para uma equação que é oh, de fim dos tempos. Oh, de dentro. que significa que o pior cenário para isso é na verdade no quadrado. E se você realmente fizer alguma matemática por trás disso, você realmente entenderá que o cenário médio dos casos é bastante semelhante. O cenário de caso médio para classificação de bolha também é em quadrado, que significa que este é um tipo de ordenação no quadrado. Lembra como conversamos sobre Exponencial? Se você tem algo acima, talvez, 1000 ou 10.000 coisas que você precisa para resolver isso pode começar a levar minutos, horas, dias para ser concluído. E então, se tivermos debaixo de uma pequena mesa aqui, esta mesa estará preenchendo toda essa coisa. Bem, nós poderíamos ver nosso tipo médio aqui. Vamos usar a notação para ele são média é realmente no quadrado e nossos grandes fantasmas ou pior caso cenários no quadrado. Agora, vamos olhar para o melhor cenário. Então, digamos que isso veio completamente resolvido. Bem, você ainda teria que ter certeza que estava completamente resolvido, então você ainda teria que descer e verificar. Isto é maior do que isto? Isto é maior do que isto? Isto é maior do que isto? Então, se foi completamente resolvido, por exemplo, digamos que temos este aqui. O que chegamos a isso foi como, Ok, hora de resolver isso. Isso é ótimo nisso? Não. Não, não, não, não. Ok, está resolvido. Isso está dentro. Ele ainda tem que tocar todo o comprimento da matriz pelo menos uma vez, modo que está dentro. Então isso significa que o nosso melhor cenário é O até o fim é realmente Ah, este é o melhor caso. Então queremos usar a notação adequada para isso, que é o Sigma ou o Omega. Então o que temos aqui é que este é o tempo de execução da bolha subiu por causa de sua natureza, onde ele tem que comparar em número de números em número de vezes, nós nos obtemos em relação quadrada, e em média, é vai ter que compará-lo. Então, se não fizermos a média aqui, podemos calcular isso muito rapidamente. A média é em mais de duas vezes em mais de duas, o que vai ser igual em quadrado sobre quatro. Nós desconsideramos o exponencial, e ele ainda sai para no quadrado apenas um pouco de matemática rápida lá. Se não o fizeres, tudo bem. Basta entender que a média eo pior cenário caso estão em quadrado eo melhor caso está em. E então este é um dos nossos piores algoritmos. No entanto, é muito fácil de implementar em código, tudo que você tem a fazer é ter uma espécie de é isso maior do que Deixe-me apenas mostrar um pequeno trecho de código dele aqui. Ele realmente tem o código escrito, e você pode ver que é apenas como cinco ou seis linhas aqui. Basicamente, ele sobe todo o elemento. E se os elementos à esquerda do que ele selecionou for maior que o direito, ele troca seu lugar e então ele o move e continua fazendo isso repetidamente. Então é um código muito, muito simples para implementar muito, muito simples. Mas por causa disso, aqui é onde nós meio que falamos sobre complexidade e tempo. Por causa de sua simplicidade, ele realmente corre para ser um dos piores algoritmos aqui. Então isso é tipo bolha. Vamos começar a seguir em frente para os diferentes tipos à medida que descermos, e vou começar a mostrar-vos mais e mais eficientes tipos. Eles podem ficar um pouco mais complexos, mas sua eficiência definitivamente aumentará. 32. Classificação de seleção de 5-3: Então o próximo pensamento que vamos cobrir é o tipo de seleção. Então, o que é exatamente o tipo de seleção? Então vamos rever a intuição disso. E então nós também vamos falar sobre os tempos de execução e, em seguida, olhar representação individual também. Então espada de seleção é ligeiramente diferente do tipo bolha. Na verdade, é muito semelhante, mas é definitivamente diferente. Então, digamos que temos uma matriz aqui. Então nós nos colocamos em um raio como normal, e ele tem quatro números nele. E esses quatro números são, digamos, 17 18 2 e depois 4. Então, o que selecciona ou faz é que tem uma porção não ordenada e uma porção sórdida. Então vamos em frente e desenhar uma porção desordenada e ordenada. E basicamente o que vamos fazer é mover esta parte aqui , como ela, selecioná-la, vamos movê-la. Então tudo à esquerda disto, tudo à esquerda está ordenado. Tudo à direita é desordenado. E então o que fazemos é passar por essa lista e procuramos o valor mínimo. Uma vez que encontramos o valor mínimo, nós o trocamos para o primeiro espaço que está à direita deste. E então mudamos isso e continuamos fazendo isso de novo e de novo e de novo. Então vamos passar por um exemplo aqui. Então vamos para o 17. Nós dizemos que não. 17 olhos agora são o nosso número mínimo. Agora é o menor número que temos porque não comparamos com mais nada. Então tomamos que 17 podemos compará-lo com o próximo é 18 menor que 17. Não, compará-lo com o próximo é menor que 17. Sim, é. Então agora também é o nosso menor número. E então agora estamos comparando dois com tudo o resto é menor que quatro. Não é assim que significa que é o nosso menor número. Então agora o que fazemos é pegar esse número e trocá-lo com o número ou a posição que está à direita de nossa porção sórdida. Então pegamos isso e trocamos com o que está à direita, que é o nosso 1º 1 Então isso significa que vamos pegar o 17 e os dois vão trocá-los . Então os dois vão aqui e o 17 vai aqui, então agora o que podemos fazer é pegar isso e vamos nos mover, estão ordenados porção acima, certo? Assim como. E você sabe, tudo o que resta está resolvido. Temos o 1º 1 que meio que descobrimos que é o mais. É o número mínimo nesta lista. Então vai para a nossa primeira posição. Então, agora vamos fazer de novo. 18 é agora um número mínimo. Nós ouvimos 17. Um 17 menor é agora um número mínimo. Ouvimos uma força menor no nosso número mínimo e não há mais nada a comparar. Então agora pegamos nosso número mínimo, que acabou por ser quatro, e trocamos com o 18 aqui porque é o 18 é a posição à direita do lugar inicial. Então pegamos e trocamos. Então agora renuncia aqui 18 vai aqui e então pegamos nossa porção sórdida e movemos para aqui . Agora só temos dois números para Dio. Tomamos 17, movemos, dizemos que é 17 menor que 18. Sim, é. Então pegamos isso. Nós movemos mais de 18 do último número deles. Então pegamos isso e movemos para cima, e agora estamos confirmados que ele foi classificado. Então funciona assim. Verifica o número mínimo. Em seguida, ele troca-o para o primeiro espaço disponível, e então a porção sórdida se move, e continua fazendo isso até que ele seja concluído. Então vamos em frente e olhar para uma representação visual disso e você pode vê-lo tipo de passando em movimento rápido, assim Então nós temos isso aqui. É uma, hum novamente, por visual go dot net porque eu tenho um material muito bom aqui, e nós vamos apenas clicar no botão play e nós podemos assistir esta coisa, fazer a sua coisa. Então, três, você vê, é o mínimo que ele encontra é um mínimo trocado para a primeira posição. Esta à esquerda é agora a posição não ordenada. Podemos abrandar um pouco, se quiser, e você pode ver os quatro. Agora está comparando um de cada vez. Quatro é o mínimo, troca-o. Todos os amarelos estão no tipo de posição, e começa de novo. Começa às cinco, é o mínimo, e agora está comparando com cada um desses. Com o tempo, cinco acabam sendo o mínimo. Nada muda se compara, foi encontrado. 15 não é o mínimo que está se comparando com, e vai continuar. 15 é o menor neste menos à esquerda. Então vai trocá-lo com a próxima posição disponível e mercado como ordenado. E vai continuar fazendo isso ao longo do tempo até que termine a produção bem aqui , que agora vai acelerá-lo de volta para que possamos ver esse tipo de ir em movimento rápido e você verá que ele mantém a troca, assim, encontrar o mínimo, trocá-lo para a direita do tipo de posição até que a coisa toda seja classificada. E lá vamos nós. Agora está resolvido. Então, como exatamente qual é o tempo de execução de algo assim? Então vamos rever o tempo de execução bem aqui. Vamos pensar sobre esse tipo de intuitivamente tentar descobrir o que o tempo de execução é apenas olhando para isso. Então nós temos um aqui e digamos que nós mesmos temos isso e vamos desenhar são classificados como assim E então alguns números aqui para um vinho 17 para coisa não triada aqui. E então o que temos para diligir? Temos que passar por isso para cada número aqui. Nós vamos ter que passar por isso no máximo n vezes, pelo menos em menos os tempos de descanso. Então isso significa que não teremos que passar por isso em média, em média, em mais de duas vezes. E como terminamos de novo também? Bem, isso tem que ser feito por dentro. Isso tem que fazê-lo até o final menos um. Isso tem que fazê-lo em menos dois em menos três. M menos quatro. E então o que você pode ver é que no lado esquerdo aqui, nós vamos ter coisas que são ponderadas para dentro e no lado direito da areia. Estamos tendo coisas que são meio que ponderadas em direção a uma. E isso significa que no centro aqui, o tempo médio vai levar todas essas duas corridas vai ser em mais de duas. É a média de todos esses tipos combinados de como a média funciona e então, basicamente, como isso sai é que o tempo de execução disso vai ser para cada ponto aqui. Vai ser em mais de dois. E já que temos em números que temos que fazer isso, multiplicamo-los juntos. Então eles vão estar em número de valores aqui, multiplicado por em mais de dois, e isso significa que vai sair como em quadrado. Então, o tempo médio de execução aqui está no quadrado, que também é o pior tempo de execução caso. Mas você tem que pensar em outra coisa. Isso é um pouco diferente no tipo de bolha, no sentido de que não. Não há nenhuma chance de que ele pode realmente apenas verificar e confirmar que a totalidade da matriz foi classificada. Ele tem que fazer esse tipo de movimento sobre o que ele tem que tomar, você sabe, a parte não ordenada, e ele tem que movê-lo para cima e verificar para cada número único. Mesmo que tenhamos um número completamente ordenado, ah, matriz aqui. Então, se tivermos, se isso sair resolvido, por exemplo, se tivermos 1 a 8, deixe-me colocar isso aqui. Vamos fazer um pequeno exemplo aqui. Vamos criar uma matriz completamente ordenada aqui. 12345 Então temos um direito completamente ordenado. Como sabemos que está completamente resolvido? Bem, o nosso programa, tudo o que ele sabe fazer é correr e verificar. Este é o número mínimo é um menor Sim, Sim, sim, sim. Está bem. É menor que todos eles. Isso significa que ele pode dizer em seu lugar que ele se move sobre o tipo de nota. Isto é mais pequeno? Sim. Sim, sim, sim. Ok, vamos movê-lo. Sim, sim, sim. OK, vamos movê-lo. Sim, sim, sim. OK, vamos movê-lo. Sim. Está bem. Vamos movê-lo. E assim continuamos movendo-o, não importa quantos. Não importa o quão ordenado, ele realmente começa a ser. E isso é importante. Porque isso significa que, mesmo no melhor cenário, mesmo no melhor cenário, ele ainda vai estar ao quadrado. Ao contrário do tipo bolha, que pode executar através disso e verificar imediatamente se ele é classificado dizendo, isso é menor do que isso? Não. Isto é pequeno nisto? Não. Não. Não. Uma vez que ele recebe o e é como, Oh, nós já estamos classificados. Acaba com o programa. Não pode fazer isto. Tem de mover esta grelha ordenada. E assim o problema com a classificação de seleção é que nós entrar em todos os três valores estão no quadrado . Então nosso melhor cenário, nosso melhor cenário caso, hum, ainda vai estar no quadrado, o tempo de execução médio ainda vai ser no quadrado, e então o pior tempo de execução vai ser no quadrado ou A notação Big O está no quadrado também. Então este programa é realmente muito, muito ineficiente. É o álbum inicial mais ineficiente com o qual vamos lidar, e você pode ver que a intuição por trás dele é realmente muito legal. Você está criando uma porção variada. Você está movendo números para frente e para trás. Parece quefuncionou muito bem. que O problema é que, por causa desta porção sórdida estavam tendo este caso onde ele sempre vai ser no quadrado. E assim, no final de tudo isso, nós obtemos outro que está no quadrado, no quadrado e no quadrado, apenas como os tipos de bolha. Estes dois são muito maus. Seleção são algoritmos de classificação muito ruins e estes são você sabe que eles são bons para aprender porque eles mostram um tipo intuitivo de maneiras de fazê-lo. Você sabe, maneiras que você pode, hum, maneiras que fazem sentido, mas eles não são as melhores maneiras de fazer isso. Então estes são os maus ritmos de classificação, e em seguida, vamos estar nos movendo para alguns algoritmos de classificação melhores que realmente têm tempos de execução mais rápidos . E vai ser mais complicado porque é assim que a programação funciona. Então você não pode apenas ter isso, você sabe, trocar onde você pode apenas obter tempos de execução mais rápidos e ser mais simples. Normalmente vai ser um pouco mais complexo, mas eles ainda fazem sentido uma vez que passamos por ele algumas vezes . Então, sim, isso é tipo de seleção. E vamos saltar para alguns algoritmos de classificação mais rápidos. 33. Classificar de 5-4: a última palestra que falamos sobre como vamos entrar em alguns algoritmos que foram um pouco mais rápidos e eu menti apenas um pouco porque ainda temos que passar por Insertion Sort, que ainda é insurgentes bastante lentos. Ou é o próximo passo lógico porque ele tipo de constrói fora de bolha curta e seleção tipo de conjunto para este novo tipo de algoritmo de partida. Parece um pouco mais que deveria ser feito. Mas ainda tem essas tendências lentas. E por isso vamos rever esta. Vamos rever como funciona do que mostrar a visualização e depois fazer os tempos de execução como o resto deles. Então vamos começar com isso. A primeira coisa que vamos fazer é crescer um pouco de Ray bem aqui para que pudéssemos olhar para isso intuitivamente assim e então eu tenho esta matriz aqui e agora vamos colocar alguns números aqui. Oito por 17 assim E então o que insurgentes ou fazem é como eu disse, funciona fora da seleção onde temos essa porção ordenada e não ordenada. Exceto diferente da seleção. O que fazemos é pegar o número e, em seguida, inseri-lo de volta na seção sórdida . Não procuramos o mínimo aqui. Nós apenas pegamos o 1º 1 e em ordem ele de volta. Então vamos fazer isso. Primeiro, vamos pegar nossa seção ordenada. Vamos movê-lo. Na verdade, devemos tirar nosso número primeiro, então salvamos como uma variável ou algo assim. Nós trazemo-lo para fora e depois pegamos isto e movemo-lo para cima. Então agora tudo aqui é a seção sórdida. Então nós estamos inserindo isso, mas nós inserimos em um ponto onde ele deve ir. Então o que fazemos é inseri-lo de volta neste novo espaço vazio. Tecnicamente, como em teoria, tiramos e colocamos de volta. Mas na realidade, se você viu o que aconteceu lá, ele não se mexe. Então estamos apenas movendo essa parte e porque sempre à direita da porção sórdida, tudo o que temos que fazer é mover isso para cima, então agarrar isso e já está na posição que deveria ser Então o que fazemos é pegar isso e agora nós comparamos e fazer uma espécie de bolha para trás para descobrir onde deve ir. Então, digamos, ele vai? Isto é mais pequeno que isto? Por quê? Ontem? Então pegamos isso e trocamos com isso, e então mudamos de volta assim? E então o que fazemos é fazer exatamente a mesma coisa. Pegamos isso, movemos para cima e citamos, vamos tirar isso e depois inserimos de volta nesta matriz sórdida. Mas em código, mantemo-lo aqui, e trocamo-lo até encontrarmos o local onde precisa ir. Então nós pegamos isso e fomos assim para trocar assim, isso ainda é menos? Sim. Então pegamos isso de volta, trocamos isso, e então trocamos esse de volta para aqui, e então fazemos exatamente a mesma coisa para terminá-lo. Peguem estes, movam-se. Então, não, está tudo na nossa porção sórdida. Agarre. Esta é a lição. Isto é. Então abaixamos e pegamos essa troca. E isso não é menos do que isso. Então terminamos com nosso algoritmo de classificação. Então vamos dar uma olhada em uma visualização de como isso é feito em um pouco de uma escala maior. Então basta clicar no botão ir e você verá que ele agarra, retira-o, e então ele basicamente insere na porção sórdida. Então está procurando para onde deve ir. Inserido em tira-o para fora. Se ele está exatamente nos lugares certos já, classificar ele apenas coloca de volta e ele diz que não estamos classificados, e então ele troca-los até chegar ao ponto em que ele é classificado. E assim faz isso todo o caminho até que seja feito. Apenas pegando o primeiro 1 cada vez e, em seguida, fazendo tipo de uma espécie de bolha reversa para colocá-lo no lugar certo e assim você pode ver que ele tipo de combina como eu disse, classificação de seleção porque nós temos uma porção ordenada e não ordenada e classificação de bolha, porque bolha é como estamos colocando isso nesses lugares aqui. E então lá temos. Agora temos um algoritmo sortido aqui. Vamos rever o tempo de execução. Quanto tempo isso leva? Como se compara com os outros? Bem, basicamente, isso vai ser quase o mesmo que bolha Sort. E você pode pensar no porquê? Porque ele corre fora da bolha Sort. Mas vamos repassar apenas uma diferença fundamental, o que na verdade faz com que seja assim. Então o que temos aqui é que temos porção variada e lembre-se, com tipo de seleção, tornou-se para fora para todos no quadrado e a razão que saiu para todos em quadrados porque você tinha que encontrar o mínimo. Você tinha que encontrar o valor mínimo aqui para a direita, e para fazer isso levou aspas em quantidade de tempo, em média, cerca de dois, que sai para o fim do tempo. Então tivemos que procurar o mínimo. E então nós o colocávamos em um lugar sortido sem ter que revistá-lo . Porque quando encontramos o mínimo, sabemos que é o próximo passo lógico. Mas fazer isso aqui fez com que não importasse se fosse resolvido ou não, sempre saíamos para acabar ao quadrado. Mas agora se temos alguns números aqui, o que isso faz é nos permitir realmente chegar a, ah, ah, um pouco mais rápido, melhor das hipóteses. Então, se você pensar sobre isso, nós temos que levar em quantidade de dados. Então nós tivemos que levar em quantidade de dados na quantidade de dados, e nós temos que compará-los em quantidade de vezes. Hum, porque nós temos que inseri-lo aqui. Então o máximo que poderia ter que fazer é trocar em quantidade de vezes. E isso, na verdade, como nos outros exemplos, sai para terminar mais de dois. Mas os dois são removidos e acabamos por ter no quadrado bem aqui. E isso vem à tona para o pior caso. E o caso médio aqui é que a média no pior caso, o pior caso é que está completamente invertido. E tem que fazer o máximo para fora, que é este fim em mais de dois. E o tipo de caso comum é que ele tem que fazer talvez menos. Ah, trabalho. Ele não tem que ir sempre para a quantidade mais distante de swaps. Talvez ele tenha sorte um par de vezes e colocá-los logo em seguida é um pouco menor do que no quadrado, mas ainda está na ordem de no quadrado, então nós podemos colocar esses dois em nosso gráfico bem aqui. Assim, a média é em quadrado e o pior cenário é em quadrado. No entanto, preço é um pouco melhor no seu melhor caso. E vamos dar uma olhada nisso aqui. Vamos apagar. Isto não desenha aqui. Vamos apagar isto. Isto e isto e vamos resolver isto. Então nós temos esse algoritmo e ele já foi resolvido. Veio ordenado. Então o que fazemos é pegar o 1º 1 e inserimos aqui. Bem, não há nada para fazer. Não fazemos nenhuma troca. Então, quanto tempo demorou? Bem, foi preciso esta operação para movê-lo e esta operação para verificar se estes dois se este é maior do que este. Então saiu para duas operações que fariam exatamente a mesma coisa novamente. Nós movemos isso, pegamos isso e movemos. Pegue isso e movemos para cima e verificamos as notas ainda ordenadas. Pegue isso e mova-o para cima e verificamos nota, ainda ordenado. Então cada uma dessas vezes só levou dois, hum, para tipo de ciclos. Tudo o que tínhamos que fazer era mover o cursor. Então nós movemos o cursor e então nós verificamos, se maior que e assim cada vez. São só duas operações. O que significa que está sempre a correr para as operações. Não importa quantos fins existam, vai ser 222222 Nunca vai escalar com base em pontas, então isso significa que é tempo tecnicamente constante. Então agora temos em quantidade de transferências aqui temos em quantidade de transferências, hum, ou em quantidade de dados. Eu acho que você poderia chamá-los com em quantidade de dados multiplicado por multiplicado por tempo constante . Em seu melhor cenário, o que significa que nosso melhor cenário vai realmente ser em apenas tipo bolha. Nós vamos ter esse melhor cenário de dentro, e tudo se resume ao fato de que quando ele é classificado, nós só temos que fazer operações constantes. Para mudar isso sobre este direito aqui se torna constante, em que a seleção ordenar. Isso sempre foi em mais de dois, o que significa que ele sempre sairia para terminar ao quadrado. E assim que é inserção classificar em poucas palavras. Como eu disse, combina manchas de Theus de tipo bolha e seleção, tendo o desordenado e ordenado e depois borbulhando o número mínimo. Como eu disse, combina manchas de Theus de tipo bolha e seleção, E então ele combina com este tipo de novo chamado Insertion Sort. E ele vem para estes tempos de execução bem aqui, que é idêntico ao tipo bolha. Hum, então ainda é bem lento. Então, estas são apenas a base dos anos 60. Todos os cientistas da computação basicamente nariz fora da cabeça deles são três tipos, e então nós entramos nos mais rápidos aqui. E é aqui que algumas, como, realmente intuitivas realmente como, tipo de idéias inteligentes surgem e nós começamos realmente a melhorar os algoritmos de classificação de comparação para torná-los realmente rápido demais, assed rápido, como no login, e coisas assim 34. Classificação rápida de 5-5: Ok, então vamos entrar ou discutir sobre o primeiro algoritmo que vai ser mais rápido do que os outros álbuns de que falamos. Então, quando olhamos para os outros algoritmos tempos de execução, percebemos que no pior dos casos, eles estão todos no quadrado. E mesmo no cenário médio, eles estão todos ao quadrado, e um deles é ligeiramente mais rápido no melhor tempo de execução. Mas isso se já começou. Então isso nem conta, porque esse é um de uma quantidade infinita de casos. Então, tudo o que realmente queremos olhar é aqui, e vemos que eles são todos muito ruins. E então o que vamos fazer é olhar para o próximo passo no tipo de evolução do algoritmo de classificação . Vamos entender uma maneira muito mais rápida de começar no tempo médio. Você vai notar que algumas das outras partes ainda são as mesmas. Mas nosso tempo médio vai melhorar, e então entramos em Fusão, classificamos. Vamos ser capazes de melhorar tudo com isso. Então o que vamos passar nesta palestra é rápido. Vamos falar sobre a intuição por trás do Quick Sort. Como ele realmente funciona e funciona. E eu vou estar fazendo um exemplo em mostrar-lhe passo a passo como você sabe, exatamente a classificação rápida funciona. Então faremos um pouco de visual, e a próxima lição passará pelo tempo de execução porque ambas as partes são um pouco complexas e em seus próprios direitos. E eu não quero que você saiba, como um vídeo de 40 minutos sobre isso em uma pausa isso para que possamos entender cada parte individualmente. Então vamos atrás da intuição para um tipo rápido. Então vamos em frente e criar um belo raio aqui em cima. Vamos fazer um “A “um pouco maior Está um pouco perto do topo. Vamos abaixar só um pouquinho aqui. Então nos metemos em um raio e vamos fazer, um, oito grandes. Então vamos continuar dividindo o centro aqui e agora temos oito lugares diferentes e vamos encher isso com esses números aqui. Digamos 15 22 13 27 12 10 20 e depois 25. Vamos em frente e corrigir este 10 aqui para que seja perceptível. E agora temos a nossa matriz. E então o que tipo rápido faz é que ele funciona com essa idéia de algo chamado pivô. Então, o que é exatamente um pivô? Um pivô vai ser o lugar como ele vai se separar. Então o que estamos fazendo é criar submarino A a partir desta matriz. Então estamos aplicando o algoritmo de classificação rápida para diferentes sub-arrays pequenos, e então vamos continuar aplicando-o até termos apenas um ou dois, um, pedaços de dados em nosso aumento, e então vamos trazer tudo para cima . O que isso faz é criar uma abordagem de divisão e conquista para o programa que vai acelerar o tempo de execução geral. E tudo isso fará sentido à medida que começarmos a repassar isso um pouco mais e começarmos a entender como exatamente isso funciona. E então o tempo de execução explicará por que é mais rápido. Então vamos continuar com isso por agora e então espero que faça sentido enquanto passamos por isso. Então o que temos aqui é que vamos escolher um pivô. Tudo menos do que o pivô vai para o sub-array esquerdo. Tudo menos vai para a esquerda e tudo maior do que vai para a direita. Então, qual é o nosso pivô? Que número vamos escolher como nosso pivô? Bem, nós temos que pensar que isso está completamente, hum, meio escondido para nós. Não sabemos o que são esses números. Não conseguimos encontrar médias ou medianas ou qualquer coisa assim porque não está ordenado. E nós poderíamos, você sabe, tentar encontrar o número do meio. Mas como eu disse, é desordenado, então teríamos que saber muito mais informações e temos que classificar para encontrar o número do meio para que não faça nenhum sentido. Então, o que podemos fazer é enfraquecer. Basta escolher o pivô com base na esquerda, elemento mais. Então, nessa situação, o que vamos fazer é pegar o pivô aqui mesmo. Vamos dizer que é a esquerda, a maioria dos elementos. E agora o que vamos fazer é colocar todos os números que são menores do que o nosso pivô para a esquerda, todos os números que são maiores do que o nosso pivô para a direita, então o que fazemos é pegar nosso pivô e desenhamos para baixo assim agora está no centro . Agora, este pivô está no centro, e por definição vai ser ordenado porque tudo à esquerda vai ser menor do que e tudo à direita vai ser maior do que ele. Então terminamos com esse número. O que precisamos fazer agora é separado para que tenhamos aquele sub-array esquerdo e temos esse resumo direito. Vamos em frente e drawl são sub-matrizes em e vamos olhar para quais números são maiores ou menos do que isso, O que temos aqui é que temos os números 10 13 e, em seguida, 12 colocar à esquerda aqui porque esses são todos os únicos que são menos do que isso. Então nós temos 10 13 12 e há um monte de algoritmos diferentes para encontrar isso para pesquisar isso e descobrir o que é menos, você poderia ir apenas da esquerda para a direita, procurando os números que são menos do que ele. Então, nessa situação, isso pode sair para 13 12 10. Ou você pode ir da direita para a esquerda ou do pivô indo para a esquerda. E depois do pivô indo para a direita, há realmente um monte de maneiras diferentes de fazer isso. Onde vai chegar com qualquer algoritmo que venha a ser? E isso é só porque vai provar algumas coisas à medida que passarmos, vai fazer o mais sentido. Então agora temos à esquerda. Aqui temos o 20 para 27 20 e depois 25. Então, todos esses números à direita são maiores. Todos esses números à esquerda são menos então. E agora o que fazemos é aplicar esse algoritmo a ambos mais uma vez. Então nós encontramos o pivô e neste caso, vai ser este número à esquerda novamente. Vai ser este número aqui e aqui dentro. Vai ser este número aqui. Vamos descer a sub-árvore esquerda primeiro, e esta é a idéia de um algoritmo recursivo. Ele vai atacar as sub-árvores da esquerda primeiro. Em seguida, ele vai voltar para cima, vai lidar com estes estes todo o caminho para baixo. Então ele vai voltar para cima e vai atacar a sub-árvore direita em seguida. E algum tratado significa que é o resumo separado, um resumo. Então o que vamos fazer é encontrar um ponto de pivô. É aquele 10 que acabamos de escolher. Então agora isso vai descer e nós vamos ter um 10 bem aqui. E então vamos colocar todos os números maiores do que ele para a esquerda. Todos os números menos do que ele para a direita e suas letras que 10 é realmente o mínimo aqui. Árvore submarino esquerdo não tem nada tecnicamente, nele. Então isso significa que este são 10 nesta situação vai ser o nosso número mais esquerdo, e então na sub-árvore direita, onde vamos acabar tendo são os outros dois números, os outros dois números. Então vamos ter um 13 e 12 aqui, e depois aqui, vamos dividi-lo mais uma vez, com 22 sendo no centro. Então nós sorteamos quando para baixo e 22 vai ser o nosso novo número. E até à esquerda, vamos ter 20 e 25. Ou, na verdade, meu 25 ruim é maior que então nós vamos ter apenas 20 vai ter 20 aqui, e então para a direita vai ser o resto dos números para a direita vai ser 27 e 25 e então você vai notar que nós ainda temos uma vaga aberta em ambos. Então vinte e 27 25. E ainda temos que um raid arrays que são maiores do que um. Então vamos escolher outro ponto de pivô para ambos aqui e aqui. E então o que vamos ter vai ter um 13 que vai para baixo e depois os 12 fantasmas saíram. Não há nada no subconjunto esquerdo. Então nós temos o 12 aqui, e então vamos fazer exatamente a mesma coisa à direita. Aqui temos o 27 que vai para baixo o 27 que vai para a direita aqui, e então o 25 será para a esquerda dele aqui, qual 27. 25 estarão aqui e, tecnicamente, será o seu próprio sub-array. Assim E então agora o que temos é na verdade uma matriz ordenada. Não parece que seja. Mas temos uma espécie de raio, porque agora o que fizemos é que tudo isto acontece dentro da matriz aqui em cima. Então, agora, se rastrearmos isso, temos o array ordenado do menor o maior. Temos o 10. Então descemos e temos 12. 13 quando voltarmos para cima, e então temos o 15 2022 25 27. E assim são Ray é criado através deste método aqui. E então vamos dividi-lo nos oito originais que tínhamos. E então vamos fazer esse rastreamento apenas mais uma vez. Então vamos para o lado esquerdo aqui, e o que vamos fazer é este é um algoritmo recursivo. Então dividimos ao meio, e agora dividimos este ao meio e verificamos. Não há nada à esquerda. Nós verificamos. Só há um elemento aqui, então pegamos isso, escrevemos e verificamos o lado direito. Ainda restam dois elementos, então fazemos de novo, verificamos o lado esquerdo. Bem, há um elemento lá agora para que possamos anotar isso. Verificamos o meio. Há um elemento lá para que possamos anotar isso. E agora não há mais nada para verificar. Não há mais passos. Então ele retraça de volta e então nós verificamos o meio agora então nós verificamos a sub-árvore esquerda . Agora verificamos o meio e temos um 15 e depois vamos em frente e verificamos o lado direito. E a primeira coisa que chegarmos aqui é que estamos sempre checando a esquerda primeiro. Então nós descemos aqui e há um 20 por si só. Então pegamos o número um e está no nosso raio. Vamos quando verificamos o meio, há um 22 por si só e então verificamos o sub-array certo e ainda há coisas aqui. Então aplicamos o algoritmo, descemos pela esquerda e vemos que isso é tudo por si só. Então temos um 25 e no meio também é por si só 27. E no final aqui não sobrou nada. Então esse é o fim. E temos uma matriz ordenada. Então tudo isso funciona fora desse pivô no início porque estamos dividindo esse problema em subproblemas. E com esses problemas submarinos, dividimos em mais subproblemas e mais subproblemas até chegarmos a unidades de um. E então uma vez que fizermos isso por causa de como o algoritmo está funcionando como um todo, todos eles serão classificados. E então tudo o que temos que fazer é rastrear essa nova árvore que criamos, e vamos passar por cima como, tipo de traços de árvore um pouco mais tarde. Mas imagine que tudo isso está acontecendo no lugar, que significa que não vai entrar. Criar esses metrôs é realmente apenas fazer tudo dentro desta matriz. Aqui em cima, você vai notar que uma vez que ele faz tudo isso, ele está colocando-os no lugar certo enquanto ele vai para baixo. Então, ele vai começar toda essa esquerda fazendo esse tipo de coisa. Então ele vai classificar todo esse direito fazendo esse tipo de coisa, e no final, ele vai se parecer com isso como uma versão classificada final. Então vamos dar uma olhada nisso visualmente, e eu acho que vai fazer um pouco mais desde então, então essas grandes pessoas no visual go dot net criaram esses álbuns de classificação que temos usado. Se você quiser verificar qualquer um destes, certifique-se de ir para o seu site, porque eles fornecem tudo isso gratuitamente. Então nós criamos são ordenados. Agora vamos começar o tipo aqui, e você vai notar que o que ele está fazendo é alocar um sub-array. Então ele escolheu o uh três aqui como o ponto de pivô. E o que ele está fazendo agora é que ele está indo e ele está classificando o sub-array direito e, em seguida classificar o resumo esquerdo deste novo pivô vai ganhar através disso e ele encontrou um pivô. E então ele está classificando o lado esquerdo, classificando o lado direito daquela pequena caixa que a esquerda criativa encontra que o pivô amarelo classifica. Agora estamos classificando o lado direito, então nós apenas meio que a esquerda. Agora estamos indo para o lado direito e estamos classificando por aqui, e, você sabe, isso é um pouco mais complexo. No exemplo, eu passei por cima, e isso é porque quando você realmente implementá-lo em código, ele tem que ser esse tipo de maneira que ele troca Onley porque a troca de Onley é muito, muito importante. Se criarmos todos esses pequenos resumos, vai levar espaço extra, tempo extra e então vamos realmente ter que fazer como traços, que irá adicionar na hora final. Então o que ele está fazendo aqui e nós podemos tocar isso novamente mais uma vez. Podemos criar um novo aqui, e podemos realmente inserir os números que fomos com aqui se quisermos. Então me dê um segundo e eu farei isso. Era 15 de 22 13 27 de 12 10 2025 10 2025. E então podemos clicar. Vá bem aqui. E então agora este é o array que tínhamos originalmente, então vamos ver como ele faz isso. Estamos a clicar no ir e, em seguida, ir para classificar e clicar. Vá nesse tipo, e assim você verá. O que ele está fazendo é que ele escolheu o 15 como o pivô, e ele está pegando todos os números que são menores que e você verá que ele vem com este 10 13 12 também, porque ele está fazendo troca então ele está apenas agarrando todos os números . Vamos fazer isso mais uma vez. Você vê os 15. É pegar todos os números que são menores do que e trocá-lo para o próximo espaço disponível . Então ele agarra o 13 1º e então troca-o para o espaço. Isso é à direita da 15. Agarra o 12. Em seguida, ele troca para o espaço que é o próximo neste lugar sórdido, que é 12. E então ele agarra o 10 e ele vai trocá-lo para este lugar e então ele agarra isso e ele é troca-lo para a frente da lista. Então, como eu disse, um pouco mais complexo e como o código realmente o implementa. Mas está fazendo exatamente o que fizemos. Ele criou esta sub-árvore esquerda esta 10 13 12 e criou esta sub-árvore direita esta 22 27 20 e 25 eo pivô está no centro e você vai notar que o papel ficou laranja ,o , que significa que está completamente ordenado. E agora o que ele está enfrentando é a taxa de sub-árvore esquerda aqui, e você vai notar que apenas o que ele fez lá foi que criou a sub-árvore esquerda e nada realmente aconteceu. Os 13 ou 12 dizem no mesmo lugar. Então ele caiu e fez mais uma variação. E então é trocado o 12 e o 13 para colocá-los no lugar certo. E agora ele está enfrentando a sub-árvore direita aqui, então você vai notar que ele está fazendo exatamente os mesmos passos que nós fizemos. Está a separá-lo nesta taxa de variação aqui, trocar as posições e a certificar-se de que está ordenado. E então agora você verá que todos os gráficos classificados. Então isso é basicamente como a classificação rápida funciona. Funciona a partir da divisão em problemas menores e menores. Isso lhe dá uma maneira mais rápida de fazer isso, e vamos ver exatamente por que isso é mais rápido na próxima palestra, onde vamos falar sobre tempos de execução. 35. 5-6 de execução de de uma classificação rápida: Então agora vamos rever o tempo de execução deste algoritmo que acabamos de falar sobre o algoritmo de classificação rápida . Quão rápido é esse algoritmo? O que? Precisamos pensar nisso assim e isso vai ser a mesma intuição para o próximo onde discutirmos Merge Sort. E então o que vamos fazer é quebrar isso, e isso vai ser como eu disse, no próximo, nós nos fundimos, fundimos, classificamos. Vai ser a mesma intuição. Mas eu sinto que se passarmos por isso duas vezes seguidas, isso vai realmente ser um tipo de cimento, e vai começar a fazer algum sentido. Então o que, isso é que estamos cozinhando, basicamente pegando esse problema, e estamos dividindo-o em um monte de submarinos. tipo de problemas da Siri. E a maneira que isso ajuda é que ele o divide nesses níveis bem aqui. E você verá que neste nível, quando quebrarmos e tivermos que fazer comparações, tocará no máximo em elementos, e acredito que acabará com comparações. Mas nós vamos apenas deixá-lo em n. Então este nível leva neste nível bem aqui vai tomar em bem. E você vai notar isso por causa da, hum, tipo da maneira que isso funciona aqui é que ele vai ter que entrar em contato. E é um pouco menos do que em enquanto descemos aqui. E, em seguida, este nível aqui em baixo vai absorver também. E então o que temos aqui é que temos um programa que leva três em bem, o que precisamos olhar. O que precisamos examinar é como isso cresce ao longo do tempo? Como é que este número, a quantidade de pontas que poderíamos chamar a este X? Como o X de em cresce? Porque uma vez que encontramos a resposta para isso, uma vez que entendemos como esse número cresce, então entenderemos o tempo de execução desse algoritmo. E então o que podemos fazer é pensar nisso logicamente. Quantos temos aqui? Tínhamos oito variantes diferentes aqui. Então, o que fizemos foi na melhor das hipóteses, tínhamos oito no topo. Então, como oito tipos diferentes de partes para isso, ou nós podemos realmente fazer esse tipo inverso de como isso funciona. Começamos com oito e então o que fizemos foi dividi-lo em dois grupos de quatro e dividimos isso em dois grupos de dois. E então você dividiu isso em uns e você vai notar que isso é o que isso emula aqui é que nós tivemos o oito. Nós o dividimos em cerca de dois grupos de quatro. E então porque o pivô está envolvido, um pouco menos no lado esquerdo, e ele meio que desce a partir daí. Mas ele mantém essa forma geral, esse tipo geral de forma onde ele vai para esses diferentes níveis. E então, quantos níveis tínhamos? O que? Tínhamos um também três níveis antes de chegarmos a todos e o programa terminou. Então isso significa que às oito temos nós três. Agora, quantos teremos se começarmos com 16, por exemplo? modo que podemos realmente fazer aqui é podemos destacar estes e vamos em frente e removê-los . E então vamos duplicar isso aqui. Então vamos pegar essa coisa toda aqui. Controle CND. Vamos pegar isso. Vamos movê-lo para a direita. Na verdade, mova-o para aqui e vamos pegar este e movê-lo para baixo também. Apenas selecionando todos eles, tentando apenas economizar um pouco de tempo aqui. E então o que temos é que temos esses dois pequenos subconjuntos de oito. E então este é apenas um 16. Isso acrescentou. Então tudo o que fez foi adicionar um nível adicional. Nós vendemos depois de todo aquele trabalho lá de copiar e colar. E tudo o que fizemos foi adicionar mais um nível. E esse é o nível de oito. Então temos dentro, dentro também. E então o que temos aqui é, nós temos se tivéssemos 16 nós temos quatro. E imagine se fizéssemos isso de novo. Se copiarmos e colarmos isso tanto para a direita quanto para a esquerda e, em seguida, apenas adicionamos o próximo nível de 32 bem, isso nos daria 32 igual a cinco e 64 seria igual a seis. E 128 seria igual a 12 ou minha matemática 12 com igual sete e assim por diante e assim por diante e assim por diante. Então o que isso significa é que o número de níveis lembrar, Isso é o que estamos tentando encontrar Esta taxa X aqui, o número de níveis realmente cresce. A um certo ritmo, cresce quando isso dobra cada vez. Então ele cresce a uma taxa exponencial inversa, o que significa que a distância entre esses dois a distância entre como os números Maney que temos vai lentamente ficar cada vez maior e maior e maior. Por exemplo, aqui levou oito aqui em cima. Foram precisos oito números de Dittemore para termos outro nível aqui. Demorou 16 para obter um Nível 32 para chegar naquele nível 64 para entrar em um nível 128 para obter outro nível, e isso vai para o infinito. Então o que temos é que temos uma espécie de gráfico que se parece com isso. Um gráfico que se parece com isso ao longo do tempo. E já falamos sobre isso antes. Vamos falar sobre isso no tipo de fusão. Este gráfico é log-in, então a quantidade de níveis na quantidade de vezes que temos que aplicar é log-in. Então isso significa que nossa equação lembrar nossa equação foi aquele X, que é quantos níveis de em nós temos. Esse é o X Times. Quantas vezes temos que fazer dentro é realmente apenas vai sair para fazer login de n ou melhor maneira. É geralmente colocado é assim. É geralmente escrito a notação padrão para isso está em lei novamente ou log tempo linear. Então temos o tempo linear de log. E isso foi para o melhor caso. Nós pensamos, se ele foi dividido bem no meio, nós temos esse tempo linear log, e é exatamente assim que isso sai é que nós temos para o melhor tempo de execução que temos no login. E então agora vamos pensar sobre isso para o tempo médio de execução. Bem, o tempo de execução médio vai assumir, em média, que vamos escolher um ponto de pivô que em algum lugar perto do centro. Então, em média, se fizermos todas as contas fora, ele vai chegar exatamente à mesma coisa que vai chegar em log in. Mas e o pior cenário? Qual seria o pior cenário? Bem, o pior cenário seria nós criando este gráfico aqui, exceto que ele não se divide uniformemente cada vez que é 15 por aqui, que significa que este é, por exemplo, Ah um e está por aqui. Temos que dividir de novo. Então vamos tentar olhar para isso. Olhe para o pior caso um pouco aqui. Vejamos o pior caso aqui. Então temos um 16 e dividimos errado. Escolhemos um ponto de pivô onde tudo era maior do que o ponto de pivô ou tudo era menor que o ponto de pivô. Então escolhemos isto. E em vez de termos este resumo aqui, não temos nada aqui. Então nós apenas temos e em menos um, nós temos exatamente o mesmo array aceito apenas um último. Eu não ajudei nada. Então, se continuarmos fazendo isso, se continuarmos escolhendo a menor ou a maior quantidade das sub-matrizes não iriam obter essa relação onde nós dividimos esse problema em esses pequenos sub-componentes e obtê-lo para baixo ao mínimo número de níveis finais. E vamos falar sobre o que exatamente isso significa. Então escolhemos um ponto pivô onde 15 deles eram menos e apenas um era maior do que bem, este não pode mais dividir. Então temos que adicionar um nível aqui. E então nós escolhemos um ponto de pivô onde 14 no lado esquerdo ou menos. E um aqui foi ele. E 13 e um e 12 e um. E podemos continuar com isso. Poderíamos ir 11 e 11 e um, 10 e um. 11 e um, E estou a fazer isto exaustivamente aqui para vos mostrar uma coisa. Oito e 17654321 E quantos níveis isso acabou sendo quando dividimos essa maneira horrível? O que temos foi entrar, entrar, dentro, dentro, dentro, dentro, dentro, e apenas continuar. Temos todos esses fins todas as vezes porque não é como ele. Foi mais rápido por causa disso. Ele ainda tem que tocar todos esses elementos. Então o que acabamos por chegar aqui foi 123456789 10 11 12 13 14 15 ou aproximadamente por causa das primeiras 16 extremidades. Então, nesta situação, nós realmente chegar à direita em torno entre em menos um e em níveis, porque nós podemos tipo de apenas esquecer sobre o N menos uma parte. Então isso significa que nesta situação, se formos no pior cenário, vamos no pior cenário. Então aqui em cima é o melhor e o caso médio, o pior cenário vai ser muito diferente. Na pior das hipóteses, são x a quantidade de níveis é igual em. E agora você começa a ver o que estamos acontecendo aqui. Se X e in são a relação aqui e nossas ex-águias em, isso significa que temos em tempos em que temos em tempos em nosso pior cenário. E isso significa que estamos entrando ao quadrado. No nosso pior caso, escolhemos um ponto de pivô onde cada vez que ele não se separava uniformemente ou mesmo perto de uniformemente, porque em nosso caso médio, isso poderia ser um seis, e isso poderia ser um 10 . Sabe, isso pode ser em vez de quatro, poderia ser dois e seis ou algo assim. Você poderia terminar bem perto, e nós poderíamos apenas adicionar uma ou duas extremidades a isso. Ele ainda é basicamente como um log in, mas no pior cenário e coisas ao lado do pior cenário que é basicamente em . É basicamente esse fim dos tempos e relacionamento, e isso significa que no nosso pior caso, nós nos acertamos. E assim, no final aqui, vocês notarão que nosso pior caso não melhorou. Nosso pior caso ainda está no quadrado. Temos um caso muito melhor, e isso é muito importante. Este parece, hum, parece mais lento, o que eu acho que tecnicamente é. Se a matriz já está classificada, no entanto, não lidamos com um aumento que já está classificado. Há uma razão para ter entrado no algoritmo de classificação. Normalmente, este é Onley, pois se já estivesse resolvido, ainda funcionaria assim. Ou se você escolheu o ponto de pivô perfeito, eu acho, é nesta situação. E este é o escolhido um tipo de perto do ponto de pivô, então isso pode parecer pior, mas ainda está perfeitamente bem na lei novamente. Este ainda é perfeitamente bom, e estes dois não fazem sentido onde ambos estão perfeitamente ordenados. Mas nosso tempo médio é muito mais rápido aqui. Esta é uma enorme diferença aqui no quadrado um fim Então, se você a longo prazo , se você empregasse isso, você economizaria como eu disse uma tonelada de tempo porque o caso médio seria o que sairia na maioria das vezes. Às vezes você pula para aqui, às vezes você pula para aqui, mas tudo em média para o meio aqui para que você possa ver que este é um tempo de execução mais rápido . Mas nós não queremos que este dedo aconteça, porque mesmo uma vez em que poderia acontecer no quadrado, pode ser o suficiente para quebrar nosso programa. Pode ser muito grande para o nosso programa. Um identificador talvez seja executado em uma memória nessa situação. Talvez o poder de processamento atingisse 100 não seria capaz de executar. Então o que queremos fazer é garantir que isso vai estar no login, e é aí que vamos entrar em fusão, tipo, que nos permitirá ter essa garantia. E eu vou explicar que quando entrarmos na próxima palestra 36. 5-7 de mescla: Então agora vamos rever um algoritmo que é ainda mais rápido do que os outros algoritmos que cobrimos. E isso é mesclar, classificar e Merge Sort faz uma espécie de algoritmo Ryker Zhen intuitivo para torná-lo mais rápido. Vamos repassar exatamente como ele faz isso. Na verdade, vamos dividir este em dois vídeos, um sobre a intuição por trás, porque é um pouco mais complexo e um sobre os tempos de execução, porque isso também é um pouco mais complexo e precisa de sua próprio tipo de explicação. Então vamos começar. Vamos apenas para a intuição, e então vamos olhar para um modelo visual dele em execução também. Então, a maneira que se fundiu ou funciona é que ele pega os dados de modo que ele pega a matriz, e então ele divide em pequenas sub-matrizes. Então, por exemplo, o que fazemos é pegar esse Ray aqui e vamos dizer que há apenas quatro elementos de 7 10 9 e 8, e o que fazemos é separá-los para uma coluna esquerda e uma direita. Então o que temos aqui é que temos um sete e dez exceto o que mantém a cor consistente aqui. E vamos assim. Então nós temos 1/7 um 10 e, em seguida, à direita aqui temos outro sub-array. Você notará que não fazemos nada sem fazer nenhuma classificação nesta etapa. Estamos dividindo-o em suas pequenas matrizes de submarinos assim. E então o que fazemos é dividi-lo novamente até que eles estejam apenas em caixas que são completamente e totalmente independentes um do outro. Então, sete, 10 98 E então o que fazemos com isso é que nós re combiná-lo. Nós re combinar estes dois em uma nova matriz de dois, e nós re combinados estes dois de volta em uma matriz de dois. E você pode estar pensando, o quê? Nós apenas os dividimos. O que vamos fazer quando os juntarmos? Este é o lugar onde a triagem realmente ocorre. Então fique comigo. Aqui, vamos fazer é criar um cursor à esquerda e um cursor à direita. E neste passo, não faz muito sentido. Mas quando entrarmos em maiores, vai começar a fazer sentido. Então temos uma maldição à esquerda. Temos um cursor à direita, e o que vamos fazer é pegar esses números e comparar esses números. Então agora, o cursor à esquerda aponta para um sete, e o cursor à direita aponta para um 10. Então qual desses é menor? Bem, o sete é menor, então ele vai primeiro, e então o 10 é maior que isso. Então ele vai em seguida. Estamos na mesma coisa à direita. Aqui, o oito vai primeiro ou então o ou nesta situação, o oito estava à direita. Então, na verdade é azul. O oito vai primeiro, e depois o nove vai logo depois. Oito vai primeiro 9 vai logo depois. E sei que isso não fazia muito sentido. Então, vamos fazer com que faça sentido. Faz mais sentido quando nós realmente temos elementos mawr para tipo de rastrear bem aqui. Então agora o que nós temos é que nós temos que combiná-lo de volta para baixo em sua matriz final. Então vamos em frente e criar esses cursores mais uma vez. Temos um apontando para a esquerda e outro apontando para a direita, assim. E o que fazemos é pegar esses números e comparar os dois cursores. Assim, o primeiro cursor aponta para sete no momento atual. Então ele está apontando para um sete, e o próximo cursor está apontando para um oito. Pegamos esses dois e os comparamos bem. Estes sete são os mais pequenos, então colocamos isso no primeiro ponto da matriz. Agora o que fazemos é riscar esse número. Já não o usamos. Pegamos o cursor e movemos para o próximo elemento de qualquer array que acabou de ser usado. Então, desde que ele saiu, Array foi usado, pegamos o cursor vermelho, e estamos movendo para a direita. E quando movemos para a direita, colocamos o novo número. Então, nesta situação, é um 10. Então, colocamos no novo número. Pegamos os dois números e verificamos de novo. Qual deles? Menor? Bem, agora é o lado certo. Então vamos em frente e estamos bem no lado direito. Cruzamos este número, movemos o cursor e refazemos as comparações. Agora o lado direito é um nove. Então nós colocamos um nove e então nós colocamos o último elemento do 10 à esquerda aqui e você vai notar durante este passo que corremos. Quantas vezes e durante isso que corremos em Lee no tempo, não corremos ao quadrado ou algo assim, porque tudo o que fizemos foi mover o cursor. Nós tocamos o sete uma vez, o oito uma vez, o nove uma vez e o 10 uma vez. E depois voltamos a tocá-los. Então, foram apenas duas dessas extremidades, e isso vai se conectar ao tempo de execução mais tarde. Mas mantenha isso em sua mente, porque será como eu disse mais tarde, quando fizermos, o tempo de execução de tudo isso vai começar a fazer um pouco mais de sentido. Mas vamos fazer um exemplo maior. Digamos que chegamos à etapa final de 24 por quatro arrays, então temos que quatro por quatro levantar aqui e entramos na etapa final, o que significa que estes estão todos classificados neste ponto, assim como aqui. Estes são classificados do menor para o maior, mas eles não são particularmente classificados inteiramente. Então o que vamos fazer é preencher esses números. Digamos que este é um 13 15 16 em digamos que este é 10 11 14 17 assim E então o que vamos fazer é realmente fazer exatamente a mesma coisa que fizemos antes. Então isso chegou. Tivemos que sub-arrays combinados para baixo neste, e agora temos que classificar um aumento. E então nós vamos fazer é nós vamos combiná-los aqui mesmo, e nós vamos fazer uma matriz final. Isso é todo o caminho grande. Então é o tamanho original aqui, que era o total 19, ou a noite no 19 o total de oito 123456 que precisávamos comprar isso novamente. E agora o que vamos fazer é que estamos no mesmo método de antes. Vamos pegar um cursor esquerdo, vamos pegar um cursor direito, e estes estão apenas analisando as matrizes, e estamos comparando para qualquer que seja o menor. Então nós temos aqui nós temos o um e o 10 sendo comparados com o momento atual. E então vamos mover isso para cima. Então, temos algum espaço sempre que estes desaparecem. Mas isso, tipo, bem aqui. Então estamos comparando o de 10. Bem, obviamente um é menor. Então, o que entra aqui no primeiro lugar. Vamos em frente e riscamos o um e então movemos o cursor por um. E então agora nós comparamos os três nós comparamos os três e os 10. Bem, três ainda é menor, então eu coloquei os três lá dentro. Nós riscamos e movemos o cursor para o 15. Assim e agora poderíamos fazer uma comparação mais uma vez. Bem, agora o lado direito é menor. O 10 é o menor, então vamos em frente. Colocamos o 10 aqui, riscamos e nos movemos. O 11 agora é o menor porque o próximo número aqui é 11. 11 é agora o menor. Então eu coloquei o 11 lá dentro. Vamos continuar a fazer este processo várias vezes até chegarmos ao fim. Mas eu quero passar por todo o exemplo. Então você entende o que exatamente estamos fazendo aqui? Ele realmente vai ajudá-lo a obter a intuição que irá ajudá-lo a entender o tempo de execução um pouco mais tarde. Então agora temos 14. 14 e novamente o menor. Então vamos em frente e fazemos exatamente os mesmos processos de antes, cruzando para fora, movendo o cursor sobre. E agora temos um 17 aqui. E então fazemos uma comparação no lado esquerdo. Bem, o 15 é agora o menor dos 15 entra aqui. Risque, mexam-se. Agora temos 16 versículo 17. O 16 é o menor, então o 16 é colocado aqui. Ele é riscado, ele é riscado, e então o cursor se move. Mas há um caso especial aqui é que quando o cursor passa e ele entende que está no fim do raio, não há nada no ano passado, você sabe, você sabe, há nada que ele possa agarrar aqui uma vez que ele fica a este ponto. O que faz é que copia o resto do que quer que esteja aqui. Portanto, nesta situação, só temos um elemento. Ele apenas copia o 17 sobre. No entanto, em algumas situações não será tão fácil terá. Talvez um 17 18 1920 aqui. E por isso não continuamos a compará-lo. Uma vez que ficamos fora de um dos lados porque não há mais nada para comparar. A taxa está terminada, então o que vamos fazer é realmente ir para baixo e vamos apenas copiar o resto da outra taxa porque já classificada. Sabemos que o resto deste lado será maior do que qualquer um dos números aqui . E tal é algo a ter em mente é que em algum momento você vai correr para fora em um array, mas ainda tem três ou quatro elementos na outra maneira. E isso significa apenas copiar os elementos para a direita final. E agora o que temos é a nossa matriz ordenada. Então, essa é a intuição por trás de trabalhos de divisão de casas. Você pega um número e divide-o para baixo e fica cursivo. O Lee. Dividi-lo até chegar a um ponto onde você está apenas em alguns aqui e o algoritmo si não costuma dividi-lo como então ele apenas entende que 012 e três serão todas entidades separadas, mas a maneira humana de fazê-lo é tem que fazer essas divisões. O computador tem uma maneira um pouco mais rápida de adivinhar todas essas coisas, mas isso realmente não importa. Isso é algo que é muito fácil de implementar código sempre que você procurar o código para emerge sort. Mas é assim que funciona e os que chegamos ao nosso passo final de fusão. Nós criamos nossos cursores, e então eles apenas comparam para frente e para trás e você vai notar que mesmo neste onde eles são comidos, só levou oito tentativas diferentes, porque tudo o que fizemos foi ir um do que nós mudamos três. Então ele não vai 13 10 11 15 16 17 Ele só tocou em tudo em um número de vezes. Então, mesmo neste passo, ele estava dentro. E como eu disse, isso vai ser importante um pouco mais tarde, quando olharmos para o tempo de execução . Mas vejamos agora uma visualização de como isso pode funcionar por um computador. Então vamos em frente e criar uma matriz desordenada aqui e vamos iniciá-la. E isso está usando merge sort, e nós vamos ir em frente e clicar no botão de classificação e, em seguida, ir e então você vai ver que o que ele faz. É que primeiro separa a imagem. Estes lados e o que ele está fazendo é que na verdade está se separando. Vamos abrandar isto um segundo. O que está a fazer é separar-se em dois, separando-os, separando-os para o próximo a classificá-los e, em seguida, quatro. E então faremos exatamente a mesma coisa na próxima. Então, dois transformam em quatro bem aqui. E então ele vai classificar o oito bem aqui. Então isso é recursivo Lee entrando. Então o que ele faz, ele realmente começou dividindo isso ao meio, e então ele foi todo o caminho para baixo até chegar a esses dois bem aqui, tipo de como sobre este exemplo. Tem todo o caminho até aqui. Então começou a classificar para cima, e é isso que está fazendo agora. Agora ele está classificando a metade esquerda disso, e está fazendo tudo resolvido. E então começa a metade certa. Então leva os primeiros 2 números. Ele os classifica. Em seguida, ele pega os próximos dois números e os classifica. E agora tem dois conjuntos de dois. Então agora eles podem definir isso porque agora eles são exatamente os mesmos. Então ele os compara e os armazena novamente, apenas agarrando o mínimo de cada lado o coloca de volta, e agora ele tem quatro que são classificados para que ele se mova para o próximo ponto. E mesmo que existam três , nem sempre tem que ser perfeitamente simétrico. Você pode ter um número ímpar e ainda ter esse trabalho. Ele vai em frente e separa isso ele tipo de volta para baixo, e então ele escolhe a menor quantidade e cria site sortido à direita. E depois faz. Uma final depois disso é feito, coloca tudo de volta e então agora temos dois conjuntos de oito com este 17, mas isso é o mais próximo de oito que podemos obter. E então ele começa a classificar isso para o tipo final, e agora você vai notar que ele pega a menor quantidade de cada lado. Vá e acelere isso. Se eu puder realmente clicar sobre isso, você vai logo ali e então ele só vai uma cabeça e coloca tudo de volta junto. Então essa é a intuição. É assim que funciona a classificação de mesclagem. Vamos pular para a próxima palestra. Estamos falando do tempo de execução e por quê, exatamente? Isto é mais rápido que os outros. 37. 5-8 de mescla: Então, na última palestra, falamos sobre a intuição por trás de Merge Sort. Nesta eleição, vamos rever o tempo de execução. Qual é o tempo de execução desse tipo e por que ele é mais rápido do que outros tipos? Bem, para fazer isso, precisamos entender o que eu estava falando na última palestra, que foi em cada um desses passos. Quantas vezes ou quantas operações não precisam ser feitas? Quantas comparações estamos fazendo? E isso sempre acaba porque esses cursores trabalhando em dois lugares diferentes aqui só vão 1234 E então vamos exatamente da mesma maneira que pegou o sete do que o oito que o nove. O 10 vai estar em cada um destes tempos, por isso sabemos que a base do nosso tempo de execução aqui vai estar dentro. Mas quantas vezes fazemos no que vai ser multiplicado por? E essa é a chave para este tempo de corrida. Então vamos dar uma olhada no que tivemos aqui e podemos ver isso em quatro com quatro com quatro. Demorou duas extremidades separadas para chegar a esse ponto. Então, quantas pontas havia? Será que vai? Quatro. Eram dois, e então quantos seriam às oito? Vamos fazer isso. Digamos que temos. Chegamos à parte em que está combinando, que é oito pequenos diferentes. Vamos ver. É o 812345678 e então vamos combiná-los em um monte de dois e, em seguida, combiná-los em vigor e, em seguida, combiná-los de volta em um oito. Então cada um desses passos é este passo aqui apenas com oito em vez de quatro. Então se resume a algo que se parece com isso, e então podemos ver que haverá aqui dentro vai haver um fim aqui, aqui e depois aqui para a combinação final. Então, com oito, temos três pontas que temos que usar. Bem, quantos seriam para 16? Bem, se você pensar sobre isso 16 tudo o que vai fazer isso vai adicionar uma camada separada para isso . Então, em vez de tantos que vamos ter. Então, em vez de tantos, vamos ter uma duplicata disto. Então vamos ver se conseguimos duplicar isso. Vamos assim e vamos tirar isso do caminho e vamos pegar. Na verdade, podemos pegar essa coisa toda. Vamos pegar a coisa toda e duplicar e depois movê-lo para a direita aqui. Então agora há 16. Agora temos dois conjuntos de oito, e depois descemos e tudo o que temos que fazer é mais um cálculo aqui para obter os 16 originais. Então, o que a duplicação do tamanho nos trouxe? Bem, só nos deu mais um e só nos deu mais um. E essa intuição vai ao longo de todo o processo. Se você dobrar isso de novo, o 32 que só vai levar 5 64 só vai levar um extra dentro, que significa que 128 vai levar apenas sete. 2 56 só vai levar oito, 5 12 só vai tomar 9024 só vai levar 10 e assim por diante e assim por diante e assim por diante e assim por diante. E então o que você vê é que há essa diferença aqui. Esta diferença fundamental é que quanto maior o número, menor a quantidade de passos vai tomar de uma forma real e previsível. Vai ser lembrado daquele exponencial reverso que falamos antes? Esse log de em bem, isso é exatamente o que o tempo de execução acaba por ser é que ao longo do tempo, como em fica cada vez maior e maior a quantidade de vezes que temos que fazer isso em operação quantidade de vezes. Temos que fazer isso porque estamos dividindo ao meio em Lee sobe por uma pequena margem para que possamos chegar a um ponto em que estamos dobrando isso e você pode ver que tem que haver 512 números adicionais que adicionam outro. Então isso significa que a quantidade de extremidades que estamos usando será multiplicada por não interrogação, mas por login. modo que tudo soma-se a isso tudo soma-se ao fato de que nós vamos ter um resultado final de in times log-in. E isso significa que não importa o quão grande ou pequeno este array seja, seja ele classificado ou não classificado, nós sempre faremos exatamente a mesma operação. Isso pode estar chegando. Venha até nós completamente ordenados ou o mais desordenados possível, e não importaria. Ainda faríamos as mesmas operações em cada uma dessas etapas. E isso significa que não só o melhor caso de login é o caso médio no login. O pior caso vai estar em log in porque, como eu disse, pode ser completamente e totalmente, hum, hum, desordenado. E isso não importa porque estamos indo para os mesmos passos todas as vezes. Isso poderia vir para nós em 789 10 e nós ainda iria separá-lo e fazer as pequenas comparações. Isso poderia vir até nós como 10 987 e nós ainda dividi-lo no número exato de comparações. Não haverá nenhuma mudança dependendo dos números, o que significa que todos os três serão idênticos um ao outro, e portanto isso o torna o algoritmo mais rápido porque agora não é apenas o nosso mais rápido e login é o nosso média em log in, Mas pela primeira vez, nosso pior caso está em log in. Agora somos capazes de verificar isso e entender que mesmo no pior dos casos, ele sempre estará em log in, que é substancialmente mais rápido do que estes aqui. Lembras-te daquele gráfico que mostrámos no início disto? O curso desta coisa é que no quadrado vai até uma linha reta, vai em log in será o ângulo entre estes dois vai ficar cada vez menos. E então nós colocamos um 1.000.000 neste em um 1.000.000 neste aqui, os resultados serão noite e dia. Este vai levar semanas, enquanto este pode levar alguns minutos a talvez uma hora. E esse é o poder de pensar nisso. Porque agora podemos usar esses outros algoritmos de classificação. Por que nós implementaríamos estes quando podemos implementar um algoritmo de classificação? Essa taxa é ainda mais rápida aqui, uma que é garantido para entrar no login. E assim, com essa fonte de comparações, podemos realmente chegar a um tipo final de, hum, pedaço de informação de tudo isso e aquilo. É que o mais rápido que você nunca será capaz de fazer uma comparação classificar um tipo de comparação, que significa que você está realmente comparando os dois números para o outro tipo de comparação que o mais rápido que você nunca será capaz de fazê-lo é realmente na lei novamente. Não há comparação mais rápida classificar lá fora e por comparação, classificar quero dizer, você sabe, você tem 2468 E para classificar isso você está comparando Thies este número com este número ou este número com esse número ou este com esta madeira, você está comparando-os dentro de si mesmo. E assim, o mais rápido que você poderá fazer isso é no login. Então isso se torna o mais rápido desses algoritmos. Há outro ritmo de classificação mais rápido, mas eles têm muito mais intuição e eles entram em uma espécie de análise do número em si para descobrir onde ele vai sem realmente compará-lo com outros números. É um pouco complexo, e podemos falar nisso um pouco mais tarde. No entanto, como eu disse, ainda é bastante complexo. Então tudo o que temos que realmente entender para a base da ciência da computação é o tipo de comparação e temos que entender que o mais rápido que podemos obter é entrar e fundir. SORT nos dá isso usando essa intuição de quebrar tudo em metades para que nosso programa só escale por fim, tempos log Evans e isso nos dá esse rápido tipo de algoritmo de in log in que é merge sort realmente, realmente divertido, tipo de passar e algo que é realmente poderoso na rodada de ciência da computação. 38. 5-9 estável de e e não estável: Então vamos discutir uma coisa final com algoritmos de classificação, e é se um algoritmo é estável ou não estável. Então, o que exatamente isso significa? Bem, o que significa é que, se iniciarmos um algoritmo parecido com este, digamos que temos um array que se parece com este. Digamos que tivemos um muito cinco para isso. Sempre aconteceria que isso fosse aquilo. Estes dois à esquerda viriam antes disto, também. Para que pudéssemos pensar nisso assim. Poderíamos dizer que isso é para um e isso é para ser E então ele precisa ser sempre acontecer que quando o array final é construído, quando o array final é construído, que acontece que ele é um para um ser cinco como esse em nenhuma outra maneira, se ele vem a ser e, em seguida, a um que é um tipo instável, isso significa que os dois valores idênticos não são mantidos no mesmo lugar, modo que perderíamos o tipo original de importância da posição, mas em relação a um Outra. E isso pode ser importante. Por exemplo, poderia ser talvez pessoas que estão esperando em uma fila ou algo assim e ter uma pessoa pulando na frente, a outra pessoa, só porque eles têm o mesmo primeiro nome não faz muito sentido . E, você sabe, poderia entrar em coisas mais importantes também. Mas esse é um tipo de exemplo que me veio à mente. Então, muitas vezes, ou pelo menos às vezes, a estabilidade importa. Então olhamos para os nossos algoritmos quais são estáveis? Bem, isso realmente se resume a isso. A classificação da bolha é estável porque sempre que trocamos, os valores foram apenas trocando valores em relação um ao outro reunião que um dois nunca vai trocar com outros dois, e ele não pode saltar ou cair atrás dos outros dois ou os outros valor idêntico de qualquer forma. Então o tipo bolha sai para ser estável. Loja de inserção sai para ser estável e mesclar. Sort sai para ser estável. E eu não vou explicar exatamente por que isso são. Estes três são estáveis, mas apenas entenda que em seu tipo de implementação, resulta que eles são estáveis. O que vamos passar é que os que não estão estáveis. Estes dois aqui não estão estáveis. E a razão para isso, para o tipo de explicação disso significa que estes dois você vai saber, eles podem remover a ordem. Eles podem destruir isto. Onde estar virá antes de um agora, neste tipo de unidade gráfica disse 1225 Não importa qual ar seja. Ainda está entre aspas classificadas. No entanto, se é um para ser um para um cinco, então é não-estabilizar classificada. Então vamos repassar nosso primeiro exemplo aqui. Vamos rever o tipo de seleção. Lembre-se de como a classificação de seleção captura o número mais baixo e, em seguida, troca-o com o primeiro espaço disponível. Então vamos passar por cima de um contador Exemplo um exemplo que mostra a falta de estabilidade. E tudo o que precisamos para isso, na verdade, são apenas três colunas de matriz aqui. E então o que temos aqui é vamos com dois e vamos colocar o pequeno A aqui para B e depois um aqui. E então o que fazemos é procurá-lo. Aquele com pelo menos número, o mínimo. Então vamos cair. Vamos descer. 01 Nós trocamos com o 1º 1 Então, recriamos esse array assim, e o que obtemos é um array que se parece com isso onde o primeiro vem no início. E então ele ainda está aqui. Mas o que está no para um trocado. Então agora está resolvido. Mas se você vai notar por causa de tipos de seleção, a maneira como ele lida com dados, nós temos um problema aqui que o ser vem antes do para A. E isso pode acontecer com quaisquer números que são idênticos se eles são dados em um determinado padrão. O que significa que, no geral, não podemos garantir a estabilidade do tipo de seleção. Portanto, a classificação de seleção não é estável. Então vamos dar uma olhada em outro muito rápido também, o outro que não é estável. E isso é um tipo rápido. Então vamos ver por que a loja rápida não é estável, e isso se resume exatamente à mesma coisa. Então lembre-se com a classificação rápida estavam escolhendo um pivô. Então, com o pivô em mente, o que vamos fazer é colocar tudo à esquerda do pivô que é menos e tudo à direita do pivô. Isso é mais o que se tivéssemos este mesmo exemplo aqui. E digamos que nosso pivô é escolhido para ser, também. Então vamos usar o mesmo exemplo. Então nós temos um a um A a B e um do lado direito aqui. E se escolhermos isto? Pit ou vamos com este pivô aqui. Digamos que escolhemos ser o nosso ponto de pivô. Então o que fazemos é derrubar isso é ser, e isto é, estão presos no pivô. E então nos gabamos de tudo o que está à esquerda para estar aqui. Então é tudo o que é menos do que então nós colocamos aqui um e então tudo que é maior do que ou igual a do lado direito. E você vai notar um problema aqui. Sempre que fazemos isso, sempre que pegamos e vamos para a direita aqui, o que chegamos é a um é maior do que igual a ser assim a um vai para a direita, e agora estamos abaixo de todos os valores mais baixos possíveis. Nosso primeiro passo. É um passo final, e então o que fazemos é ir em frente e agarrá-lo e escrevemos a nossa matriz final aqui em baixo . E como esperávamos porque não é estável. O que obtemos é o para A e o para ser troca de lugares por causa do pivô que foi escolhido. Assim, neste caso, não podemos garantir também a estabilidade. Portanto, isso é apenas um toque rápido sobre a estabilidade. Se um algoritmo é estável ou não, é importante se a localização dos números é importante. Então, o que significa que o A deve vir antes que o B venha antes do vê. Que a associação da esquerda para a direita importa e apenas uma espécie de outra coisa que poderíamos agarrar nesses algoritmos é que podemos estudar que se usarmos mesclagem ou inserção ou bolha tipo que manteremos nossa estabilidade. No entanto, se usarmos a seleção ou se usarmos a classificação rápida, perderemos nossa estabilidade. Poderíamos ter nomes potenciais que o ar trocou valores potenciais que são trocados que não deveriam ter sido trocados, e portanto isso é estabilidade 39. Como Sorting de 5-10 exemplos de de de mundo de real: Então, agora que temos um bom entendimento de algoritmos de classificação e vimos muitos algoritmos iniciais diferentes, vamos em frente e olhar para alguns exemplos reais de algoritmos de classificação. Portanto, há muitos usos diferentes para a classificação. Algoritmos são provavelmente a coisa mais usada que vamos falar neste curso. E isso é só porque tudo o que fazemos hoje em dia precisa ser ordenado de alguma forma, forma ou forma apenas por causa da quantidade de dados envolvidos. O exemplo mais fácil é realmente olhar para um documento do Excel. Então você vê que nós temos. Agora está resolvido à esquerda aqui. 123456789 O que queremos classificar pelos números à direita? Digamos que todos eles são, por exemplo, dinheiro, e queremos classificá-lo pelo dinheiro. Veja qual transação teve mais dinheiro. Bem, podemos destacar tudo isso e, você sabe, basta subir para classificar e filtrar, fazer uma classificação personalizada e dizer, vamos classificar pela coluna D, que é esta coluna aqui, e nós vamos ir do menor para o maior, e você vai ver que ele classifica assim. Agora, algum algoritmo de partida teve que ser envolvido para descobrir onde esses números devem ir, e então ele teve que dar uma lista. E, em seguida, essa lista é representada de volta para o documento do Excel. Agora você pode ver que ele vai menor o mais alto. E você também pode ver se voltarmos apenas um segundo que há um três com $7 um sete com $7. E quando avançarmos, vocês notarão que este é um tipo estável, pois mantém os três e os sete ali em local relativo que não os remove ou desorganiza nesse sentido. Então esse é um pequeno efeito colateral do Nate deste algoritmo de classificação aqui. Mas o Excel documenta algoritmos de história o tempo todo. Outro exemplo é, sempre que você faz uma pesquisa no Google, um, você vai notar que há, você sabe, aqueles botões de classificação na última hora, classificar por relevância. Ele até diz que classificar por relevância de classificar por data, todos os resultados. Você pode basicamente ajustar seu filtro, e ele vai classificar por isso e ele não avança nosso do que chegando com algum tipo de pontuação como para cada link, então ele apenas classificar pela pontuação mais alta para a pontuação mais baixa. E a pontuação é calculada com base no que você colocar aqui, você sabe, ele classifica. É uma coisa extremamente avançada, e acredito que até usa e acredito que até usa gráficos e outras coisas para criar isso. Mas o básico está aqui, a começar a nossa sala. Assim, por exemplo, poderíamos colocar a qualquer momento e ele o recurso em uma lista diferente. Se voltarmos para as configurações ou para as configurações de pesquisa, há diferentes configurações que você pode colocar aqui que ele vai passar se você for para as ferramentas. Se voltarmos para as configurações ou para as configurações de pesquisa, há diferentes configurações que você pode colocar aqui que ele vai passar se você for para São diferentes cenários aqui, os principais sendo como o tempo. E eu acredito que você vai a uma busca avançada e tipo de procurar coisas diferentes dentro disso . Mas qualquer vez que você mudar isso, basta entender que se usando um algoritmo de classificação de alguma forma, forma ou forma para classificar isso para que ele saiba como colocá-lo aqui para você também, Outro bom exemplo é com qualquer site como compra Amazon especialmente como esses sites de vôo ou basicamente qualquer site que você transacionar dinheiro em seus sites de comércio e. Eles sempre terão essa triagem por aqui. Por exemplo, nesta viagem simulada de Baltimore a Minneapolis, onde, sabe, às vezes você quer olhar pelo preço mais baixo. Às vezes você quer olhar pela data de partida ou a data de chegada ou a duração, por exemplo, quem foi mais curto. Ele vai re calcular e criar uma nova lista. Digamos que queremos o preço mais alto. Qual é o custo mais alto? Enfraquece o Dio e podes ver que é este voo da United. Muda completamente ao redor. Então, o algoritmo de classificação aqui, vai levar cada uma dessas entradas. E como eu disse, o outro. Ele provavelmente calcula uma pontuação ou usa um determinado parâmetro neste caso usando o preço, e ele classifica sobre isso, em seguida, retorna esse tipo de lista e, em seguida, exibe esse tipo de lista para você. Assim, o início é realmente importante neste site, bem como ele dá. Ele permite que o usuário encontre as informações que deseja, e com tanta informação por aí classificando, nossos quartos estão se tornando cada vez mais importantes para obter as informações que queremos como usuários rápido e rápido sem ter que cavar através de coisas que nunca usariam ou que nós que não são relevantes para nós. Então, classificando algoritmos, eles estão em todos os lugares, e eles são amplamente utilizados na ciência da computação e no mundo real. 40. Noções básicas de as árvores: Então vamos falar sobre um conceito. Uma estrutura de dados que ainda não tocamos. E essa é a árvore. Então, o que é exatamente uma árvore? Como é que a usamos? E por que é útil para nós? Essas são algumas das perguntas que estarão respondendo ao longo desta palestra enquanto fazemos dieta em uma introdução ao que as árvores são e como elas funcionam. Então, o que exatamente são árvores? O que? Nós realmente lidamos com um par de árvores, por exemplo, por exemplo, com classificação de mesclagem e classificação rápida. Lembra quando estávamos olhando para o tempo de execução deles e nós terminamos? Assim, onde nós quebramos cada nível do tempo de corrida e nós fizemos esta pequena árvore bem aqui. Bem, isto aqui é na verdade uma árvore. Ele tem um nó raiz, que é o início dele bem aqui. E então tem níveis. Então nós temos, por exemplo, nível 12 e depois três aqui, e cada nível vai ter uma certa quantidade de passos e, em seguida, para chegar ao próximo nível, vamos avançar e criar Crianças de nossos nós aqui para descer para o próximo nível, assim e daí? Isto é, isto é uma árvore. E isso também pode ser uma estrutura de dados, que significa que enfraquecer armazenar algo assim. E podemos usá-lo para nos ajudar apenas a armazenar os dados para que possamos encontrá-los mais rapidamente ou podemos usá-los para pesquisar. Ou podemos usá-lo apenas para armazenamento geral em geral. Então o que isso faz e como isso funciona é na verdade através do que aprendemos antes, que é um nó. Então você vai ter um não para o topo. Digamos que este é oito e tem que sub-nós de quatro e quatro, e isso aponta para este caminho e então nós temos nós aqui em baixo e ele continua indo assim. E então o que temos é que temos esta árvore organizada construída a partir de nossos dados. Então lembre-se quando estamos falando de nós e dissemos que em uma lista vinculada, por exemplo, tínhamos o anterior e depois o seguinte e um desses apontou para este caminho, um daqueles apontou para este caminho, e então tivemos nós mesmos basicamente esta lista ligada que foi construído a partir deste material. Bem, eu disse que você pode preencher isso aqui com qualquer coisa, então quando você olha para árvores, é exatamente o que você está fazendo. Você vai estar preenchendo esses ponteiros com outras informações além do anterior e o próximo. Então, o que podemos fazer aqui? O que vamos fazer é ir em frente e mostrar, tipo, tipo, um exemplo aqui de como você pode construir essa coisa. Então, por exemplo, digamos que temos um nó gigante aqui no topo, e ele não precisa ser gigante, mas precisa de espaço suficiente para que eu possa escrever aqui. Então, em vez de um anterior e, em seguida, o próximo, nós vamos ter nós mesmos do lado esquerdo. Ah, esquerda e depois no pai do meio e na parte inferior, direita, assim e agora o que a esquerda vai apontar? Vai apontar para aqui. A direita vai apontar para aqui e depois para cima. Aqui estão os nossos dados. O que quer que estejamos comparando ou classificando ou algo assim. E vamos colorir isso. Vamos colorir o pai de uma cor diferente aqui. Vamos em frente e colorir vermelho isso vai fazer sentido em pouco tempo. E então o que vamos fazer é ir em frente e duplicar essa taxa exata de estrutura aqui, e então vamos enfiar aqui. Vamos fazer exatamente a mesma coisa de novo e movê-la para cá. E então o que temos aqui é esta lista. E em vez de ser uma lista que é como esta a lista vinculada, é uma lista de nós que na verdade aponta em direções diferentes. Não há começo, e não há fim aqui em baixo. Os ponteiros pai que estão em vermelho, vão apontar de volta para onde quer que ele veio, então ele tipo de cria uma lista duplamente ligada. De certa forma, entanto, não faz muito sentido porque é diferente de apenas isso. Então vamos adicionar outro nível. Vamos adicionar outra esquerda e direita aqui. Então nós vamos ter um nó aqui, uma nota aqui, uma bem ali, outra ali e depois apontar para trás e você vai notar algo que isso não pode mais ser um live duplamente ligado, assim como nós criamos em O passado, porque você não pode ir daqui até aqui de qualquer maneira que faça sentido. Por exemplo, eu teria que ir aqui do que tocar nisso uma vez. Vá para baixo do que tocar isso duas vezes, subir , descer, tocar isso duas vezes e descer. Não é mais uma linha reta. Agora está entrando em uma forma diferente, e essa é a forma de uma árvore. O que isso nos permite fazer é criar decisões dentro de nossos programas e classificar dados com base nessas decisões. E há realmente algo chamado árvore Decisão, que é onde se você chegar a este ponto, ele vai dizer Ok, se você tem, você sabe, x maior que três, vá para o agora se por que é menos do que ir para a esquerda e você pode realmente chegar decisões baseadas em uma árvore e configurá-lo assim? Então o que isso nos permite fazer e vamos mostrar um exemplo disso é que nos permite classificar dados e chegar aos dados muito mais rapidamente. Então, por exemplo, em uma lista vinculada, se você quisesse chegar ao oitavo elemento, digamos que o elemento está aqui você teria que dar oito passos ao longo do menos. Então isso vai para aqui, aqui, aqui. E então você não precisa continuar indo para a lista vinculada para encontrá-lo. Isso leva muito tempo com uma árvore. No entanto, se você conhece as idéias certas, então você sabe disso. Digamos que seu elemento está em dois direitos, certo? Certo. Estamos aqui em dois movimentos. Já falamos muito sobre isso antes. Estamos aqui em log de n movimentos em vez de aqui em cima, o que leva em busca. Então, digamos que, por exemplo, classificamos animais. Digamos que aqui temos animal, e então vamos classificá-lo em três grupos diferentes. Estamos em um classificar esses animais em três grupos diferentes. Então, quais seriam esses três grupos? Bem, quero dizer, podemos realmente inventar qualquer coisa que quisermos. Digamos que aqui temos, tipo, tipo, mamífero, e no meio aqui temos algo como carnívoro. E aqui à direita, temos algo como primata. E agora o que podemos fazer é criar essa lista que vai encontrar esses diferentes animais. Então, por exemplo, aqui embaixo, gato talvez um cachorro. Eu não sei. Talvez. Tubarão. É um animal que não é. E então, mamífero, aqui poderíamos ter, tipo, esquilo e então talvez como um rato. E você pode ver que pode haver algumas semelhanças aqui, então nós teríamos que duplicar. Mas estamos pensando nesse gorila primata e talvez como um humano. Mas você pode ver que isso não é mais uma lista de dados. Esta é, na verdade, uma classificação de dados, que possamos começar pelo animal e dizer que eu quero pegar todos os carnívoros e então nós só temos que tocar . Só temos que tocar se quisermos todos os carnívoros, esta árvore aqui. Significa que não precisamos. Mesmo que isso aqui tenha 3000 elementos e aqui tenha 2000 elementos. Nós ainda podemos encontrar todos os mamíferos em apenas log in tempo. Só nos levará um passo e dois passos para encontrar todos os animais aqui em baixo. Então o que isso faz é como eu disse, ele nos permite classificar dados, nos permite dividir dados e nos permite capturar dados muito mais rapidamente. Isto é como o básico do que as árvores são. É assim que eles operam. É assim que eles vão na próxima eleição, realmente falando sobre uma árvore muito padrão, algo que é bastante usado. E isso é chamado de árvore de busca binária. Então esses são muito divertidos de se fazer. Vejo vocês na próxima palestra. 41. 6-2 de pesquisa: Então vamos falar sobre o que, nas árvores mais importantes da ciência da computação, e essa é a árvore de busca binária e as iniciais para esse RBSt, que você pode ver aqui e tudo o que eles representam é apenas isso. Que é a árvore de busca binária. Então, o que é uma árvore de busca binária? Bem, vamos quebrar isso. Vamos dividi-lo através das palavras. Sabemos que vai ser binário, que significa que você vai ter duas opções. Lembra-se de números binários? Zero em um. Então o que? A árvore. Você vai ter duas opções. Ele não vai ser uma árvore com várias opções, como então ele só vai ter um simples duas opções tão esquerda e direita define as partes binárias . Essa é a parte binária. E depois vai ser uma árvore de busca. Então o método de pesquisa é apenas uma espécie de enunciar como esta árvore vai ser usada. Então nós vamos ser capazes de ter um monte de tipos de nós aqui e usando esta árvore, enfraquecer a pesquisa e chegar a certos nós muito, muito rápido, e eu vou mostrar um pouco mais disso mais tarde. E então, claro, é claro,vai ser uma árvore. Então vai ser o que conversamos na última palestra. Vai sair das propriedades da árvore, por isso é uma árvore de pesquisa binária. Então, como exatamente funciona? Bem, o que ele faz é que cada nó aqui tem duas opções. Vá para a esquerda ou para a direita. E então cada um desses nós tem duas opções também. Até duas opções que você só pode ter. Você pode ter uma opção ou zero opções, mas até duas opções e tudo à direita. Então vamos dizer que esta nota é X. Tudo à direita de X vai ser maior do que e tudo à esquerda de X vai ser menor do que isso. O que isso significa é que esta sub-árvore, este lado esquerdo aqui, vai ser menor que números que são menores que X e isto à direita vai ser números que são maiores que X então o que podemos fazer é realmente construir uma árvore apenas a partir disso. Então vamos em frente e digamos que temos um monte de números aqui. Vamos quem teve 15 27 10 11 e oito aqui. E podemos construir uma árvore a partir disso. Então o que fazemos é criar nossa primeira nota, nosso nó raiz bem aqui no início, e colocamos em nosso primeiro número dos 15. Então pegamos o segundo número, que é um dois. Bem, dois é menos de 15. Então vamos para a esquerda e colocamos os dois aqui. E depois temos um sete. E assim o sete é menor que 15, mas maior que dois. Então, vai ser bem aqui. Hum, bem, coloque o sete bem ali. Vamos colocar em vermelho sete. E depois temos um 10. Então isso é menos do que maior do que e então 11. Vamos mudar esses números na parte de trás. Só para termos, ah, ah, uma árvore mais equilibrada aqui. Digamos 18 18 e 25. Então nós temos o 10 dentro, e agora nós temos um 18 que é maior do que então nós colocamos para a direita aqui, e então nós temos um 25 que também é maior do que isso. Agora temos a nossa árvore de busca binária criada e, como podem ver, ela não parece tão cheia como uma árvore normal. Temos esses nós que têm notas vazias. A esquerda. Aqui, tem estes. Nenhum deles saiu sabe que este não tem filhos. Este não nos deixou. Ele só tem direitos, mas nós criamos aqui é uma árvore que podemos facilmente pesquisar. Então vamos dar uma olhada nisso. Vamos olhar para os níveis aqui. Então este é o nível principal no topo. E então temos o nível um, nível dois e, em seguida, no nível inferior três. Então este é o nível técnico 012 e três, e assim podemos ver que o mais longo que levará para chegar a qualquer nó será três níveis, mesmo que tenhamos 123456 informações diferentes aqui. E é aqui que as árvores de busca binária realmente entram em jogo. Porque, como já falamos em muitos aspectos diferentes deste curso, sempre que você colocar coisas em uma árvore ou você pode quebrar coisas ao meio, podemos obter um log em relação dele. Então vamos dizer que queríamos procurar um número ou não tem que ser números, eles poderiam ser propriedades que poderíamos de alguma forma procurar que são maiores do que o último centavo. Mas digamos que queremos procurar a propriedade de sete. Bem, como vamos encontrá-lo? Tudo o que temos que fazer é rastrear a árvore. Começamos a nota e olhamos para sete e vamos é sete maior ou menor que 15 Will sete é menor que 15. Então vamos para esta nota. Sete é maior ou menor que um? Bem, sete é maior que o nosso 27 é maior que dois. Então vamos para aqui. Encontramos sete. Demoramos 12 movimentos para chegar lá. Então, mesmo que haja todo esse tipo de seqüência numérica inteira, havia seis números aqui. Nós só tivemos que tocar em dois dos números para realmente chegar e encontrar o nosso número. E podemos procurar facilmente. Digamos, existe uma indústria de seis? Bem, vamos, mudamo-nos para cá. Então nos mudamos para ouvir que seis é menos que seis é maior que seis é menor do que não há nada aqui, o que significa que seis não estão nesta árvore. Levamos no máximo três movimentos para chegar lá. Então o que isso nos dá é a capacidade de começar a quebrar nossas informações durante a pesquisa , porque cada vez que tomamos essa decisão cada vez que tomamos a decisão de menos ou de maior do que estamos cortando o árvore ao meio. Teoricamente, estamos cortando a árvore ao meio, que significa que não temos que tocar em tudo para a direita ou em tudo para a esquerda . E se nossa árvore é normal o suficiente, então temos um caso onde vamos continuar cortando tudo ao meio e você vai ter aquele gráfico exponencial inverso. E isso, claro, é claro,vai ser log. Então, muitas de suas operações sairão como aparência, especialmente sua operação de busca. Mas vamos falar mais sobre tempo de execução na próxima palestra. E assim é assim que uma árvore de pesquisa binária basicamente opera. Você é capaz de inserir essas coisas, e então você é capaz de pesquisá-las muito, muito rapidamente para descobrir se você tem um em seu gráfico ou não o você também pode excluir dele em praticamente tempo constante. Delicioso é um tópico um pouco mais complexo, então não vamos tocar nisso. Mas se você está apenas excluindo, por exemplo, os sete você poderia apenas trazer este 10 para cima e ele vai manter as propriedades de pesquisa binária. Mas que horas? Se você está deletando esse 15 aqui em cima, então você precisa girar isso sobre o topo do lugar para que possa ser assim as propriedades de busca binária ainda são, hum, mantidos. Você também pode girar este para cima, mas você tem que fazer mais rotações. Então, como eu disse, é um pouco mais complexo. Nós vamos apenas para inserir, e nós vamos apenas olhar para o tempo de execução da exclusão. Então vamos olhar para outro exemplo aqui. Digamos que temos Vejamos um exemplo de pior caso. Então é aqui que as árvores de busca binária falharam um pouco. E este é o pior caso. Este não é o caso médio, então este é o pior caso, mas eu quero mostrar isso, e então a próxima palestra vai falar sobre o tempo de execução por trás disso, mas você pode ver que uma árvore nem sempre sai Completamente cheio. Isso realmente sai para uma lista vinculada. Então, se perfurarmos os níveis aqui, deixe-me ver se eu posso fazer isso direito. Então nós temos 012345 e depois seis aqui em baixo e você vai notar que isso é basicamente dentro. Se começarmos isso, aquele do topo aqui, que é apenas um pouco fora de você, deixe-me arrastar isso por cima do toque. Então, se começássemos este top um em um, teríamos um problema aqui em cima porque isso aqui em cima Oh, é, sempre vai ser um problema. É só que sempre vai sair para sete e você vai notar que isso significa que isso está dentro . Então, se temos uma lista ordenada que estamos tentando inserir em uma árvore de busca binária e não aplicamos nada adicional a ela, nós vamos realmente entrar em operação de Sargento porque agora temos Teoh. Agora é apenas uma lista vinculada agora é apenas uma lista de números que foram ligados entre si e não há propriedades especiais. Não há nenhum ponto em que ele vai ramificar fora, e nós vamos ser capazes de cortar as coisas ao meio estavam realmente apenas procurando a lista da esquerda para a direita, e então isso se torna um problema e vamos falar sobre isso na próxima palestra onde vai se tornar um grande problema para o nosso tempo de corrida também. 42. 6-3 de 6-3: Então vamos falar sobre os tempos de execução de uma árvore de pesquisa binária agora, e há alguns tempos de execução que são importantes para algoritmos de pesquisa. Eu acho que você poderia chamá-los de nossas estruturas de dados de pesquisa, e isso vai ser pesquisa, inserção e exclusão. E nós realmente nos preocupamos com a média e o pior caso porque a média e o melhor caso geralmente são combinados aqui. Então vamos dar uma olhada nisso. Vamos começar com o algoritmo de busca. Então, quando tivemos nossa árvore binária bem aqui e no caso médio, ela vai parecer uma árvore normal. Poderia, você sabe, ter um pouco como este. Mas, em geral, vai parecer uma árvore normal. E por causa disso, em cada decisão, vamos cortar a árvore ao meio. São como pequenos submarinos aqui, à direita. O Aziz. Bem, e a cada decisão, vamos cortar uma das sub-árvores. Então estamos cortando todos os dados e metade. Então, se começarmos com oito depois, um seria reduzido para quatro que Donna para isso, temos nossa resposta no dedo do pé um, e nós passamos por este exemplo algumas vezes e isso sempre sai log do dedo do apenas porque de toda essa natureza de cortar tudo ao meio. E assim, com a busca, você vai ter essa hora exata. O tempo médio vai acabar sendo para o tempo médio aqui, o tempo médio vai acabar sendo, oh, log de fim. E isso é só mais uma vez por causa de como estamos procurando essa coisa. E vamos descer a lista. Estamos a tomar decisões. É menor do que é menor do que é maior do que em cada vez que estamos cortando ao meio. Então, em média , deve parecer algo. Aquela árvore deve parecer algo assim. E nós temos esse log de em uma espécie de relacionamento onde poderíamos ter 16 itens aqui, mas apenas quatro níveis na árvore. Então o máximo que teríamos que ir é quatro níveis. Agora, vamos olhar para o pior caso e nós passamos por cima. O pior caso é um pouco na última palestra, e isso é se você tem uma linha reta. Então, se você inserir algo que já está ordenado e você tiver essa linha reta, você pode até ter um aqui. Lutar. A maioria continua. E é como uma lista ligada. É como se você estivesse apenas indo direto para a lista vinculada e cada decisão você só remover uma que você não remover metade do possível sabe que você pode tocar. Você só remove um. E assim cada vez, se você está apenas movendo um, isso significa que você só está indo para baixo meu em menos um em menos um em menos um. Você sabe, constantemente, que significa que vai levar tempo para atravessar esta coisa porque nós temos em vez desses quatro níveis, nós temos 1234567 níveis. Então é muito perto de dentro. E isso significa que este vai ser o nosso pior caso. Lembre-se que isso é se nossos dados já foram classificados como 1 a 5 para seis 789 Então nós temos algo que foi principalmente classificado. Qualquer cabelo que vá de Vamos à direita, nós temos uma linha reta, e isso nos dá o nosso mau ou o nosso pior caso momento de oh até o fim. Agora isso pode ser melhorado. Há algo lá fora chamado “A V l” e uma árvore vermelha preta. E o que eles fazem é que eles realmente colorem os nós, e cada vez que você chegar a um certo ponto onde você tem algo que é muito pesado , ele vai levá-lo. E ele vai realmente girar isso até o topo e, em seguida, tomar essas notas e colocá-lo para a esquerda para ter certeza que você tem aquela árvore. Mas estes são, na verdade, um tipo de procedimentos muito complexos porque é preciso um monte de variáveis diferentes e pintura e coisas assim para manter o controle dele. Então saiba que eles estão lá fora, e talvez em um curso mais avançado vamos rever algo assim. Então o próximo é inserir, e você tem que pensar em inserir exatamente o mesmo que este aqui. E vamos limpar algumas dessas linhas. É limpar algumas dessas linhas aqui, e então o que inserir está fazendo é inserir. Tudo o que faz é encontrar o lugar onde um nó deve ir. Então, por exemplo, se tivéssemos um nó que quisesse ser como, digamos que seu destino final era bem aqui, ele estava bem aqui. Bem, isso vai ser tudo o que vai tomar dele vai ser você vai inserir o número é maior que maior do que menos então. Então só foram necessárias três operações para chegar aqui, apesar de termos algo como nove números aqui. E assim como a pesquisa, vai ser exatamente o mesmo algoritmo para encontrar onde deve ir. Você vai estar cortando tudo pela metade cada vez que nós vamos conseguir um melhor caso ou um caso médio de O até o fim, ou entrar em minhas costas Oh, para o log in. E assim como no pior caso, se temos uma linha reta e precisamos inserir são inserções vai estar vindo em um log de N ou em um apenas um regular em um tempo linear? Porque nossos piores casos que estavam se inserindo no final desta lista constantemente e estamos fazendo uma linha reta mais longa e mais longa. Então nosso pior caso também vai ser até o fim, e se você pode adivinhar, a exclusão vai ser exatamente a mesma porque a única operação não constante é encontrar o saber que queremos excluir e encontrar a nota que nós quer excluir se temos uma árvore média aqui é exatamente como as outras duas operações menos do que bem, encontramos a nota para excluir. A operação de exclusão real é um pouco complexa, mas é um tempo constante porque é exatamente a mesma a cada vez e basicamente o que ela se divide. O bilhete tem zero Crianças? Será que ele tem um filho ou para cortar crianças? Então você tem apenas três decisões, e ele apenas executa cada algoritmo baseado em quantas crianças têm para que ele possa tomar. Você sabe, talvez este dê oito passos para este, dê quatro passos, e este leva zero passos ou o que seja. Mas isso não importa, porque estes são tempos constantes. Vai ser sempre preciso 84 e zero ou seja lá o que for que esses números venham a ser. O que importa é quanto tempo leva. Na verdade, chegar à nota que queremos excluir, e isso sempre vai ser log of em um caso médio médio caso. E então você pode pensar no exemplo de linha reta novamente. Se quiséssemos excluir um nó. Pode estar no final desta lista aqui. E assim o caso sai para ser um log de fim ou linear. Continuo a dizer “log “, mas quero dizer linear. Vai se tornar só porque você tem que atravessar toda esta árvore para chegar aqui. Você não está cortando nada e 1/2 você está literalmente apenas indo como se fosse uma lista vinculada. E então nosso tempo de execução final aqui não está dentro, e isso é o que uma árvore de busca binária nos dá. Você pode ver que ele tem algumas fraquezas no pior cenário, mas é, mas é caso médio é realmente muito bom. Nós confinado inserir excluir na lei dado tempo, que é um dos melhores momentos que podemos tocar. Log é basicamente constante porque constante estaria em algum lugar bem aqui, e então seu log vai aparecer, então ele vai subir e, em seguida, ele vai nivelar fora. Quase vai se tornar constante com o tempo, então você vai ter essa pequena lacuna. Mas para o resto para o infinito, esses dois serão basicamente paralelos, então é tempo quase constante, o que é ótimo, especialmente você está tentando colocar em números e então, você sabe, revistá-lo constantemente. Você iria querer um algoritmo como este para que você pudesse pesquisar constantemente e ter aqueles tempos de login . E então você poderia, é claro, implementar algumas dessas árvores de busca binária mais avançadas, como o aviall e a árvore preta vermelha , e obter essas árvores também. Mas isso é o tempo de execução da árvore de pesquisa binária. 43. 6 a 4 de de árvores: Então, agora vamos falar sobre a ALS travessia de árvore. Então, sempre que você tem uma árvore, há um monte de maneiras diferentes que você pode atravessar a rua para imprimi-la em um quatro. Então, por exemplo, se tivéssemos esta árvore aqui em baixo, se tivéssemos esta árvore, como poderíamos imprimir isto como uma corda? Bem, podemos imprimi-lo. Talvez por nível. Isso é chamado de ordens de nível. Onde você vai. 2010 15 5 13 23 7 24 seis e oito. Estamos indo em todos os níveis desta árvore. Poderíamos imprimi-lo indo olhar para a sub-árvore esquerda primeiro e depois o meio subterrâneo a sub-árvore direita. Poderíamos ir lá em cima. Há um monte de maneiras diferentes de imprimir isso, e na verdade há um monte de terminologia diferente para fazer isso, e essa é a terminologia de reversão de tratamento. Então, o que temos é que temos um, a fim de oversell ah pré-order atravessar distância, e, em seguida, um post order atravessar ALS e o que são são diferentes maneiras de atravessar uma árvore para que se possa imprimi-lo em um riacho. E como é esse trabalho. A ordem em é algo chamado esquerda, em seguida, rota e, em seguida, direita enquanto a ordem pré é é rota. Depois à esquerda, depois à direita? E, em seguida, a ordem postal é a rota direita esquerda. Então eu sei que isso não faz nenhum sentido logo de cara. Mas basicamente o que isso está dizendo é que se tivéssemos um nó aqui embaixo, se tivéssemos uma pequena árvore indo bem aqui, o que fazemos em ordem é pegar a esquerda alguma árvore primeiro, depois a rota e depois a direita. Então tomamos este seria o nosso primeiro número e então entraríamos na raiz. Então voltamos para cima, pegamos esse número e pegamos esse número e depois voltamos para cima. Pegamos este número e entramos nesta sub-árvore. Vá para a esquerda para ouvir de volta para baixo, certo? E então a pré ordem pegamos esse número e então nós vamos aqui, pegamos esse número e então vamos aqui, pegamos esse número, e então pegamos a sub-árvore direita então subimos para a direita e então vamos realmente fazer um exemplo, porque eu sinto que isso vai fazer isso fazer um pouco mais desde então vamos começar com um, a fim de reverter em ordem. Travessia ELA. Então, o que? Isto é o que um, a fim de oversell é é rota esquerda, certo? Assim é. Podemos colocar algo aqui, vamos para a esquerda e para a direita. Então o que queremos fazer é ir para a sub-árvore esquerda primeiro, e depois vamos até que ele não consiga encontrar o mais à esquerda, algumas árvores. Então vamos para a raiz, e então vamos para a direita, então vamos para a esquerda. Então começamos com uma raiz aqui e vamos para a esquerda. Alguma árvore. Bem, isto tem um país de esquerda? Ele faz. Então vamos para aquela sub-árvore esquerda. Isto tem um século passado? Não faz. Então não há nenhuma árvore aqui, então isso significa que podemos cruzar a esquerda aqui. Nós vamos aqui, e agora vamos pegar a raiz disso. Então nós vamos escrever um cinco para baixo, e então nós vamos para a sub-árvore direita e nós vamos aplicar o algoritmo novamente. Vamos para a esquerda, e não há nada à esquerda, direita ou rota. Então o que fazemos é pegar a rota, que é o seis anos, e escrevemos isso. Podíamos colocar uma vírgula entre os joelhos. Então, agora temos este feito. Bem, vamos voltar para cima no algoritmo. E já que já olhamos para a sub-árvore esquerda, podemos agora olhar para a raiz, que vai ser este sete. Então escrevemos esse sete, e então podemos ir para a árvore do filho certo. Agora, qual é aquele oito ali? Então o que estamos fazendo é aplicar este algoritmo a cada passo até que não possamos aplicá-lo . E então nós estamos apenas coletando os dados naquele ponto para que nós exploramos a sub-árvore certa que você durar um do tipo de lista. Lá vamos nós de volta, e já exploramos a rota. Então voltamos para cima, e agora o lado direito deste cinco está pronto. Então voltamos para cima porque agora isso significa que 10 a sub-árvore esquerda de 10 está agora concluída. Então agora podemos olhar para a raiz para este para que possamos colocar um 10 para baixo e então você vai notar que o próximo número que temos que fazer então temos a sub-árvore esquerda feito. Temos a rota feita. Então agora precisamos fazer o assunto certo, que é um 13. E se você está vendo um padrão aqui, você está vendo um padrão aqui. Isso é o que isto é. E é por isso que é chamado em ordem. Falaremos sobre isso em um segundo. Então vamos voltar para cima. Todo este está feito. A direita esquerda e a rota estão prontos. Então agora nós movemos para cima 20 agora tem toda a sub-árvore esquerda feito para que agora ele pode colocar seu próprio número em seu número de rota e, em seguida, temos a sub-árvore direita. Então agora estamos pulando aqui para baixo na sub-árvore direita e a árvore filho direito tem um elemento esquerdo que é 23. Então nós vamos pegar a taxa 23 aqui, e nós estamos realmente indo para Yeah, pegue o 23 bem aqui. E assim foi Nós exploramos a subárvore esquerda invisível. Não havia nada lá. Então fomos para a rota. Pegamos o 23 e depois fomos para a direita para o 24. Nada na esquerda. Então nós pegamos a raiz do 24 Aqui, explorá-lo. Vá para a direita. Nada lá. Então, agora isso é realizado Nós subimos, esta sub-árvore direita está agora realizada. Então subimos. Esta sub-árvore esquerda está agora concluída. Agora podemos pegar a rota e temos 25. E se você notar algo se você notar algo aqui o que temos é que temos a ordem atravessar um amor esta árvore E também o em ordem atravessar um monte deste dos números. Então, o que isto foi foi aqui. Esta é uma árvore de busca binária. Se você notar que tudo à esquerda deixou menos. Tudo à direita é mais Mas por causa disso, sempre que aplicamos a fim de reverter para ele, nós realmente obter a representação em ordem da árvore para fora que sai para o 56789 10 . Ele sai em ordem ascendente. E isso é só por causa de como funciona. Estávamos explorando o menos do que o primeiro. E então pegamos os do meio, e então vamos para o maior que o próximo. Então estão explorando menos do que meio maior do que e isso faz com que ele saia para este geral. Agora, esta não é a única travessia que falamos. Também temos uma reversão pré-encomendada. Então vamos fazer isso agora. Então nós tivemos uma pré-ordem e a pré ordem vai ser rota esquerda, certo? Então vai ser ótimo para a esquerda, certo? Então isso significa que o que vamos fazer é fazer exatamente a mesma coisa, exceto fazer um pouco diferente. Então pegamos a rota para direto do bastão. Vamos pegar a rota, anotar 20. Agora exploramos a sub-árvore esquerda. Então estamos agora no país esquerdo e depois aplicamos este algoritmo a isto. Então exploramos a rota para a direita da raiz para baixo, e então vamos para a sub-árvore esquerda. Exploramos a rota, escrevemos e exploramos a sub-árvore esquerda. Não há nada lá. Então, em seguida, exploramos o século certo. Nós escrevemos a rota e depois exploramos a esquerda e depois a direita. Então, a esquerda vai ser a nossa seis. A direita vai ser um oito, e então terminamos com facilidade. Então, avançamos, o que significa que terminamos com a direita. Então terminamos com isso. Se avançarmos, acabamos com, menos algumas árvores. E eu iria para a sub-árvore direita, que é a 13 aqui. E agora terminamos com isso. Tem a rota, a esquerda e a direita exploradas. Então vamos voltar para cima. Isto agora tem a raiz e a esquerda explorada. Então vamos para a direita, escrevemos esse número, e então vamos para a esquerda, que é este 23. Mas também é uma rota, então vamos anotar isso. E agora estamos aqui. Nós exploramos a rota. Não sobrou nada. Estamos explorando a direita ao lado, que é o 24. E então exploramos o 25. Finalmente, nós somos Não, não, nós exploramos permite que você. Então exploramos a direita. Aqui vamos nós. Para trás. Já exploramos a rota. Nós voltamos para cima. Já exploramos isso. Nós voltamos para cima. Já exploramos isso. Então esta é a nossa pré-ordem final para que você possa notar que a travessia saiu de forma diferente e que com uma cirurgia binária, não há padrão real nisso. Mas esta é uma maneira diferente de atravessá-la. E você pode realmente combinar als transversais. Então, em ordem e uma pré-ordem, você poderia combiná-los para recriar uma árvore geralmente precisa de pelo menos dois. Mas esta é apenas uma maneira diferente de atravessar a árvore, e você pode ver que os números não podem ser completamente diferentes. de atravessar a árvore, Este veio em ordem, e este saiu. , Basicamente, completamente fora quase idêntica, tipo, completamente diferente. E esta é a vacina que podemos explorar é a ordem postal. Então, a ordem postar é esquerda, direita, e então rota. Então é à esquerda, depois à direita? E depois rota. Então, o que? Fazemos o post order como vamos para a esquerda, esquerda, explorado, explorado, direita e depois para a esquerda. Então, seis vai ser o nosso primeiro número, e depois vamos fazê-lo. Então exploramos a esquerda. Nós exploramos a esquerda. E agora vamos explorar a direita. Então o oito, e então vamos explorar a rota, que é o sete. Então fomos para a esquerda, certo? E então a raiz e uma hora de volta aqui e nós exploramos a esquerda. Nós exploramos o direito. E agora nós podemos escrever os cinco aqui nós voltamos para o 10 e agora nós exploramos a esquerda. Então vamos explorar a direita, que é a 13 aqui. E isso é tudo o que tem por aqui. E então vamos explorar a rota, que é o Ted. E então nós exploramos o 10. Então, voltamos a subir os 20 que exploramos a sub-árvore esquerda. Agora exploramos a sub-árvore certa. Vá para este nó. Vamos explorar a esquerda, chegar a esta nota. Exploramos o direito primeiro e exploramos tudo. Aqui vamos nós para cima. Nós exploramos a esquerda. Nós exploramos o direito. Então agora podemos pegar o 23. Volte para o 25 ou o 23. Então temos explorado esquerda. Nós exploramos, certo, nós exploramos a rota. Então, agora está feito. Voltamos para cima, os 25 que exploramos à esquerda nós exploramos, certo. Não há nada aqui. Então agora pegamos a rota, que é o 25 que vamos para o topo, que é 20. Nós exploramos a esquerda. Nós exploramos o agora mesmo nós pegamos a rota e nós temos um 20 aqui também . E então você pode ver que esta é outra vez diferente deste também. Não há nenhum tipo real de padrão para estes dois que irá pelo menos um padrão que é tão perceptível como o padrão em ordem com uma árvore de pesquisa binária. No entanto, eles são diferentes reversões há diferentes maneiras de olhar para este gráfico em suas diferentes maneiras de escrevê-los como uma string. Então isso é reversão de tratamento. Estes são apenas alguns dos ALS transversais. Outra travessia. Tudo o que você poderia rapidamente didio, é o que fizemos como um exemplo do início, e isso é chamado de ordem de nível. É chamado de ordem de nível, e toda a ordem de nível é apenas literalmente tirar os níveis do quero dizer, vamos realmente fazer isso. Vamos lá. Se quiséssemos apenas uma ordem nivelada para este aqui. Nós poderíamos. Então, digamos que separamos este fim de seus níveis assim e isso fica um pouco complicado. Você tem que ter certeza de que eles estão todos no nível certo aqui, assim. Ok, então estes são então você vai de cima para baixo ou de baixo para cima, dependendo de como você quer fazer isso. Mas geralmente é de cima para baixo. Então temos nosso primeiro nível em 20. Então temos 10 25 depois 5 13 23 e depois sete, 24 seis e oito. E assim você pode ver que mesmo estando em lados diferentes da árvore aqui, eles ainda estão no mesmo nível. E assim isso dá a você essa ordem de nível, atravessar uma grande parte da árvore. Mas se você notar que é meio difícil descobrir o que era essa árvore uma vez que você a colocou aqui porque não sabemos quantas. Se fosse uma árvore cheia, que significa que havia sempre a depois que havia sempre duas Crianças, isso seria fácil de reconstruir em uma árvore. Mas se você não sabe que níveis são quais, e torna-se um pouco difícil. É por isso que, normalmente para combinar estes para reconstruir uma árvore. Mas esses são os traços transversais de uma árvore, apenas maneiras diferentes de olhar para uma árvore e escrevê-la como uma corda. Diferentes maneiras de diversidade têm diferentes tipos de propriedades. 44. 6-5 exemplos do mundo de de de árvore: Então, agora que temos uma boa compreensão das árvores, vamos fazer o que fizemos em todas as outras seções e analisar alguns exemplos do mundo real de onde podemos ter visto árvores e ação. O primeiro exemplo é comum, e esse é um diretório. Então, qualquer sistema operacional que você vê tem algum tipo de sistema de arquivos para analisar os arquivos no próprio computador ou no disco rígido. Então, basicamente, como isso funciona é que você tem um diretório raiz, então ele tem subdiretórios mais subdiretórios, e em algum momento você chega aos arquivos e vinculando todos eles juntos. Você pode criar programas e você pode abrir imagens e coisas assim. Mas está tudo ligado como uma árvore. Você tem o 1º 1 Sempre que você clicar no próximo, ele vai cada vez mais longe. Então, por exemplo, você pode ver nesta instância do Android Studio que eu tenho no meu computador. Eu posso ir para este arquivo indo para outro arquivo. Continue na lista até eu encontrar um arquivo real que possa ser executado em algum lugar aqui embaixo, e você notará que a árvore é mantida aqui em cima e então eu poderia voltar para trás, voltando a árvore. Então, quando eu clico no botão Voltar, eu pulei de volta para cima de um diretório. Ele lista todos eles e eu volto para o diretório abaixo aqui. Assim, uma árvore nos permite construir acesso a esses dados realmente, muito rapidamente, e ser capaz de tê-los em um formato onde possamos compreendê-los facilmente, o próximo uso deles é com indexação de banco de dados. Isto é um pouco mais avançado das coisas. Esta é realmente a Árvore B bem aqui. E basicamente, como isso funciona é que cria uma árvore muito plana, então não tem mais camadas em três ou quatro. Mas separa todo o banco de dados neste tipo de árvore condensada, e só permite um tempo de acesso decentemente rápido em qualquer uma das entradas. O caso contrário teria que passar por uma lista inteira para tentar encontrá-los. E você não pode fazer uma matriz que tem milhões e milhões de linhas de comprimento. Só não funciona porque você provavelmente precisa de vários discos rígidos, que significa que você vai se reunir para ir a vários lugares para manter todos esses dados. Então, por causa disso, porque não podemos usar um array devido ao tamanho gigantesco dado, ele geralmente acaba sendo alguma forma de uma lista vinculada, que então entra em alguma forma de uma árvore para que possamos manter tudo junto e que podemos acessar as informações muito rapidamente ao longo de todo o banco de dados e você vai notar que uma árvore como eu tenho falado nesta seção é um elemento muito rápido porque no máximo terá que passar por talvez quatro. E então, no entanto, muitos destes são assim, por exemplo, seriam 12 e, em seguida, no máximo, mais dois movimentos por aqui. Então, mesmo com 55 entradas ou isso provavelmente está mais perto de 20 entradas, nós só temos que ir talvez três ou quatro para chegar a qualquer ponto dentro do banco de dados. Só acelera no momento. É o que podemos acessar em tempo real. Outra é, ah, uma espécie de interessante, e isso é com árvores de decisão. Então árvores de decisão são coisas que basicamente orientam o programa, dependendo de qual entrada foi dada, então um monte de aprendizado de máquina vai realmente usar árvores de decisão e o fato de que ele vai aprender algo sobre tentativa e erro repetidos e, em seguida, classificar de construir uma árvore do que deve fazer a seguir. E você pode ver algumas dessas coisas aqui como este são apenas números aleatórios e, como se e o seu e indo e para trás e outras coisas tentando encontrá-lo. Mas, por exemplo, um jogo de vídeo pode fazer algo semelhante. Digamos que você, ah, há jogos de vídeo como múltiplos finais no final. Dependendo do que você fez ao longo do jogo, ele pode ter uma árvore de decisão que tipo de adicionar algumas coisas juntos e descobrir qual final ele deve dar a você. Isso é algo que pode ser usado lá. Este é um exemplo de tack toe aqui, apenas uma árvore de decisão de como um ah, computador pode jogar tick tack, toe it, decidindo para baixo, hum, hum, jogos de xadrez muitas vezes têm se você tem um peito como computador que está tentando bater outras pessoas como ele. Um computador que joga xadrez. Geralmente tem uma decisão. Árvore dele ou calcula um de onde ele está atualmente. Então vamos dizer que está em movimento 12. Ele vai calcular movimentos 13 14 e 15 e, em seguida, tomar a melhor decisão para si mesmo para tentar chegar a uma posição realmente boa em movimento 15 coisas. Coisas como você percebe vão, tipo de exponencial. Então, se quiséssemos descer outra camada, ele iria cada vez maior e maior, especialmente com um programa como o xadrez. Então ele meio que cria uma árvore condensada e, em seguida, reajusta a árvore toda vez. Mas as árvores de decisão são usadas com bastante frequência em um monte de coisas ganhando e um monte de aplicações do mundo real onde o programa tem que pensar em si mesmo. Então isso é uma espécie de alguns dos usos das árvores. Eles são usados em todo o lugar, e eles são ótimos para acessar dados rapidamente e organizar dados para dar aos programas para tomar decisões. Eles são uma grande estrutura de dados, e eles são amplamente utilizados 45. Temporização - preparação do projeto: Aqui está um pequeno problema divertido que eu encontrei durante o revestimento que vai realmente mostrar-lhe trechos de código que são perfeitamente bons trechos de código que você pode encontrar um código real e as ramificações se você usar o errado uma vez sábio que ISS. Então aqui está o problema. O que estamos tentando fazer é encontrar o valor máximo de uma matriz. Então nós temos um array, você sabe, talvez ele tenha milhares de itens nele, e o que estamos tentando fazer é que estamos tentando encontrar os valores máximos para Talvez cinco são nossos valores Max que queriam ver em toda essa matriz? Qual é o maior número aqui? E também é a mesma questão. Se estamos a tentar encontrar os homens aqui, temos esta ideia à esquerda, o que parece muito bom. É muito, você sabe, você sabe, curto para o snippet de código de ponto. É Far Max é igual a matriz, então pegamos nosso tipo de ponto de raio para classificar ponto pop. Então, tiramos o primeiro elemento da frente da matriz. Bem, se é classificado e assumimos que a classificação está indo do maior para o menor, então nós temos o Se nós apenas pulamos fora do elemento da frente como, digamos que esta pequena coisa bem aqui nós fomos cabeça e classificamos e foi assim , ponto, ponto, ponto, ponto zero. E então agora tudo o que fazemos é apenas estourar o primeiro elemento aqui, e isso vai ser o nosso máximo, muito curto, doce até o ponto. Então temos uma abordagem um pouco mais pesada aqui, onde criamos uma variável chamada Max. Em seguida, percorremos a matriz, e sempre que um valor for maior que Max, definimos Max para esse valor maior. E assim, no final da matriz, sempre que chegarmos ao fim do raio, que está indo para o todo eu quero tocar cada elemento, nós vamos então ter o valor máximo, porque sempre algo era maior, fomos em frente e tocá-lo, e, portanto, o isso iria retornar Max é igual a cinco também, então ambos realizam o mesmo problema. Agora, porém, quais são as ramificações de tempo dos dois? Quais trechos de código mais rápido e por quê? Se você não sabe se parece com um problema positivo interessante. Pense nisso por um segundo. Qual destes vai acabar sendo mais rápido? Pense em todo o conhecimento que aprendemos com todos os algoritmos diferentes e tente encontrar uma resposta para isso. Então eu espero que você pause o vídeo e você tenha descoberto isso por conta própria. Mas se não, estou aqui para ajudar. Aqui está a coisa que realmente recebe esse problema. É o tipo aqui. Esse problema. Lembra quando falamos sobre a classificação de algoritmos? Algoritmos de classificação têm o mínimo sobre eles que não têm em log in mínimo para classificação de comparação . Isto significa que esta será a assinatura de tempo mínimo para fazer esta operação. Por aqui. Primeiro temos que classificar a matriz e, em seguida, saltar fora do elemento. O pop acabou com um porque é uma constante, ele apenas acessando o primeiro elemento da direita. Por isso, nem precisamos de investigar isso. O que estamos olhando é isso em log in, nós emprestamos. Olhe para aqui. E qual é a assinatura do tempo deste testamento? Tudo o que temos que fazer é tocar cada elemento. Uma vez só precisamos olhar para tudo. E se for maior, nós apenas executamos uma operação constante para definir nossa variável máxima para essa matriz maior. Portanto, este lado da equação é apenas dentro, e agora podemos ver a diferença aqui. Isto vai ser substancialmente mais rápido em cenários maiores. E eu digo substancialmente mais rápido. Você verá em um segundo quando passarmos o tempo de colocar isso em um exemplo do mundo real, isso não é, você sabe, é ruim é como no quadrado ou ou no terceiro ou em fatorial ou qualquer coisa assim. Não vai ser uma daquelas situações em que se sabe que o sol queima ou algo assim. Mas será uma ineficiência que pode se acumular ao longo do tempo e garantir que programa, Ah, muito menos escalável. Vamos dar uma olhada nisso. Então, no lado esquerdo aqui, temos nosso direito novamente rodando, e estamos dizendo nesta situação que em vai ser igual a algo completamente razoável 100.000 novamente, se estamos usando Facebook ou para usar as páginas em, por exemplo, CNN como os diferentes artigos existem 100.000 não é tão ruim 100.000 é bastante típico para o mundo de hoje, e assim estão aqui é igual a 100.000. E se cada operação demorasse 0,1 milissegundos, o que é muito, muito rápido e parece certo para muito tempo? Ah, um monte de operações que seria sobre o certo por quanto tempo deve demorar. Bem, neste aqui, o que temos é que temos um ataque para fora tipo ponto pop, então vai ser um login, que significa que vai ser 100.000 vezes baseado em log. E lembre-se quando eles estão neste curso, se o registro não tem uma base, é também, porque é assim que os computadores funcionam. Então isso é baseado em lei dois de 100.000 que nos dá 100.000 log baseado em dois de 100.000 em 16,6. Se você quiser ver isso, basta Google log base para calculadora e você pode colocar este número e você verá que 16.6 é o resultado disso. E o que obtemos quando multiplicamos esses dois juntos é que obtemos 1.66 milhões de operações. Agora nós nos candidatamos. Nosso tempo é uma arma de 2,1 milissegundos. Cada uma dessas operações, temos 16.600 milissegundos, que equivale a 16.6 segundos. Imagine que você está em um dispositivo móvel e essa operação, o que estamos tentando fazer é que temos, tipo, uma consulta de pesquisa e queremos encontrar o melhor em uma consulta de pesquisa. Por que entraria nisso? Que tenhamos um algoritmo que atribua um pontuado o quão relevante é para a nossa busca. Então, agora temos uma matriz de 100.000 artigos, e só precisamos escolher o melhor para mostrar nosso usuário em nosso aplicativo. Bem, para fazer isso, precisamos de um máximo. Precisamos descobrir qual valor Qual artigo voltou com a pontuação máxima para a consulta. Então só fazemos um Max para chegar lá. Bem, nesta situação, sempre que você clicar no botão, vai levar 16,6 segundos para ter a consulta de volta. Imagine esperar em um aplicativo por 16,6 segundos. Imagine ir ao Google e procurar algo e esperar 16 segundos para fazê-lo. Quero dizer, um Mississippi, dois Mississippi, três, Mississippi, todo o caminho até 16 só para obter sua pesquisa agora no lado direito aqui porque nós usamos esta versão de Max que agora temos apenas em igual a 100.000 que não há operação, então é igual a 100.000. Então é igual a 100.000. Fácil, fácil, fácil. Então pegamos os 100.000 e multiplicamos por 0,1 milissegundos novamente e obtemos 1000 milissegundos, que é apenas um segundo. Isso é completamente razoável. Isso é muito rápido para muitos dos termos de hoje. Vá ao Google agora mesmo e procure algo. Provavelmente levará cerca de um segundo ou dois para isso, toda essa informação aparecer, e agora você pode ver a escalabilidade. Esta escala muito mais do que esta. Este parece um bom pedaço de código. Se condensado, posso lê-lo e descobrir exatamente o que está acontecendo. Mas nesta situação, esta é realmente uma ineficiência que nos custará muito tempo a longo prazo. Então, apenas um pequeno exemplo divertido aqui que mostra trechos de código e como uma simples mudança pode realmente acelerar muito o seu programa. Sabendo o quê? A assinatura de tempo de algo como tipo ponto é acelerar o seu programa, torná-lo muito mais eficiente e tornar o usuário final Ah, muito mais feliz.