1 00:00:07,720 --> 00:00:10,950 [Powered by Google Translate] Vostede probablemente xa escoitou persoas falaren sobre un algoritmo rápido e eficiente 2 00:00:10,950 --> 00:00:13,090 para a execución da súa tarefa particular, 3 00:00:13,090 --> 00:00:16,110 pero o que exactamente significa isto para un algoritmo para ser rápido ou eficaz? 4 00:00:16,110 --> 00:00:18,580 Ben, non está falando dunha medición en tempo real, 5 00:00:18,580 --> 00:00:20,500 como segundos ou minutos. 6 00:00:20,500 --> 00:00:22,220 Isto é porque o hardware do ordenador 7 00:00:22,220 --> 00:00:24,260 e programa pode variar drasticamente. 8 00:00:24,260 --> 00:00:26,020 O meu programa pode ser máis lento que o seu, 9 00:00:26,020 --> 00:00:28,000 porque eu estou correndo nun ordenador antigo, 10 00:00:28,000 --> 00:00:30,110 ou porque eu ocorrer de estar xogando un xogo online 11 00:00:30,110 --> 00:00:32,670 ao mesmo tempo, que toda a memoria hogging meu, 12 00:00:32,670 --> 00:00:35,400 ou eu podería estar rodando o meu programa a través dun programa diferente 13 00:00:35,400 --> 00:00:37,550 que comunica co aparello de forma diferente a un nivel baixo. 14 00:00:37,550 --> 00:00:39,650 É como comparar mazás e laranxas. 15 00:00:39,650 --> 00:00:41,940 Só porque o meu ordenador máis lento leva máis 16 00:00:41,940 --> 00:00:43,410 que a súa para dar de volta unha resposta 17 00:00:43,410 --> 00:00:45,510 non significa que ten o máis eficiente. 18 00:00:45,510 --> 00:00:48,830 >> Entón, xa que non podemos comparar directamente os tempos de execución de programas 19 00:00:48,830 --> 00:00:50,140 en segundos ou minutos, 20 00:00:50,140 --> 00:00:52,310 como podemos comparar dous algoritmos diferentes 21 00:00:52,310 --> 00:00:55,030 independentemente do seu hardware ou ambiente de software? 22 00:00:55,030 --> 00:00:58,000 Para crear unha forma máis uniforme de medición da eficiencia algorítmica, 23 00:00:58,000 --> 00:01:00,360 científicos da computación e matemáticas desenvolveron 24 00:01:00,360 --> 00:01:03,830 conceptos para a medición da complexidade asintótica dun programa 25 00:01:03,830 --> 00:01:06,110 e unha notación chamada 'Ohnotation Big' 26 00:01:06,110 --> 00:01:08,320 para describir este. 27 00:01:08,320 --> 00:01:10,820 A definición formal é que unha función f (x) 28 00:01:10,820 --> 00:01:13,390 roda na fin de g (x) 29 00:01:13,390 --> 00:01:15,140 se existe un certo valor (x), x e ₀ 30 00:01:15,140 --> 00:01:17,630 unha constante, C, para o cal 31 00:01:17,630 --> 00:01:19,340 f (x) é menor que ou igual a 32 00:01:19,340 --> 00:01:21,230 que constante veces g (x) 33 00:01:21,230 --> 00:01:23,190 para todo x maior que x ₀. 34 00:01:23,190 --> 00:01:25,290 >> Pero non se asombran coa definición formal. 35 00:01:25,290 --> 00:01:28,020 O que isto realmente significa en termos menos teóricas? 36 00:01:28,020 --> 00:01:30,580 Ben, é basicamente unha forma de analizar 37 00:01:30,580 --> 00:01:33,580 quão rápido tempo de execución dun programa crece assintoticamente. 38 00:01:33,580 --> 00:01:37,170 Ou sexa, como o tamaño dos seus insumos aumenta cara ao infinito, 39 00:01:37,170 --> 00:01:41,390 digamos, está unha matriz de clasificación de tamaño 1000 en comparación con unha matriz de tamaño 10. 40 00:01:41,390 --> 00:01:44,950 Como o tempo de execución do seu programa de crecer? 41 00:01:44,950 --> 00:01:47,390 Por exemplo, imaxine conta do número de caracteres 42 00:01:47,390 --> 00:01:49,350 nunha corda a maneira máis sinxela 43 00:01:49,350 --> 00:01:51,620  camiñando por toda a cadea 44 00:01:51,620 --> 00:01:54,790 letra por letra e engadindo un a un contador para cada personaxe. 45 00:01:55,700 --> 00:01:58,420 Este algoritmo está dito para ser executado en tempo lineal 46 00:01:58,420 --> 00:02:00,460 no que se refire ao número de caracteres, 47 00:02:00,460 --> 00:02:02,670 'N' na cadea. 48 00:02:02,670 --> 00:02:04,910 En suma, é executado en O (n). 49 00:02:05,570 --> 00:02:07,290 Por que isto? 50 00:02:07,290 --> 00:02:09,539 Así, utilizar esta visión, o tempo necesario 51 00:02:09,539 --> 00:02:11,300 para atravesar toda a cadea 52 00:02:11,300 --> 00:02:13,920 é proporcional ao número de caracteres. 53 00:02:13,920 --> 00:02:16,480 Contando o número de caracteres nunha secuencia de 20 caracteres 54 00:02:16,480 --> 00:02:18,580 vai ter o dobre do tempo que sexa preciso 55 00:02:18,580 --> 00:02:20,330 para contar os caracteres nunha secuencia de 10 caracteres 56 00:02:20,330 --> 00:02:23,000 porque ten que mirar para todos os personaxes 57 00:02:23,000 --> 00:02:25,740 e cada personaxe ten a mesma cantidade de tempo para ollar. 58 00:02:25,740 --> 00:02:28,050 A medida que aumenta o número de caracteres, 59 00:02:28,050 --> 00:02:30,950 o tempo de execución pode aumentar linearmente co tempo de entrada. 60 00:02:30,950 --> 00:02:33,500 >> Agora, imagine se decide que o tempo lineal, 61 00:02:33,500 --> 00:02:36,390 O (n), pero non foi rápido abondo para ti? 62 00:02:36,390 --> 00:02:38,750 Quizais está almacenando grandes secuencias, 63 00:02:38,750 --> 00:02:40,450 e non pode pagar o tempo extra que sería necesario 64 00:02:40,450 --> 00:02:44,000 para percorrer todos os seus carácteres de conta un-por-un. 65 00:02:44,000 --> 00:02:46,650 Entón, decide probar algo diferente. 66 00:02:46,650 --> 00:02:49,270 E se ocorrer para xa almacenar o número de caracteres 67 00:02:49,270 --> 00:02:52,690 na secuencia, digamos, nunha variable chamada 'len' 68 00:02:52,690 --> 00:02:54,210 no inicio do programa, 69 00:02:54,210 --> 00:02:57,800 antes almacenado o primeiro personaxe na súa corda? 70 00:02:57,800 --> 00:02:59,980 Entón, todo o que tes que facer agora para descubrir a lonxitude da corda, 71 00:02:59,980 --> 00:03:02,570 é comprobar que o valor da variable. 72 00:03:02,570 --> 00:03:05,530 Non ten que ollar para a propia cadea, en todo, 73 00:03:05,530 --> 00:03:08,160 e acceder ao valor dunha variable como len é considerado 74 00:03:08,160 --> 00:03:11,100 unha operación de tempo constante assintoticamente, 75 00:03:11,100 --> 00:03:13,070 ou O (1). 76 00:03:13,070 --> 00:03:17,110 Por que isto? Ben, lembre que a complexidade asintótica significa. 77 00:03:17,110 --> 00:03:19,100 O que cambia o tempo de execución como o tamaño 78 00:03:19,100 --> 00:03:21,400 dos seus insumos medra? 79 00:03:21,400 --> 00:03:24,630 >> Diga que estaba tentando obter o número de caracteres nunha secuencia grande. 80 00:03:24,630 --> 00:03:26,960 Ben, non importa o quão grande facer a secuencia, 81 00:03:26,960 --> 00:03:28,690 ata un millón de caracteres, 82 00:03:28,690 --> 00:03:31,150 todo o que tes que facer para atopar a lonxitude da corda con esta visión, 83 00:03:31,150 --> 00:03:33,790 é a lectura do valor da variable de len, 84 00:03:33,790 --> 00:03:35,440 que xa fixo. 85 00:03:35,440 --> 00:03:38,200 A lonxitude de entrada, é dicir, a lonxitude da corda que está intentando atopar, 86 00:03:38,200 --> 00:03:41,510 non afecta a todos o quão rápido o programa é executado. 87 00:03:41,510 --> 00:03:44,550 Esta parte do seu programa sería executado igualmente rápido en unha cadea de caracteres 88 00:03:44,550 --> 00:03:46,170 e unha secuencia de mil caracteres, 89 00:03:46,170 --> 00:03:49,140 e é por iso que este programa sería referido como sendo executado en tempo constante 90 00:03:49,140 --> 00:03:51,520 con respecto ao tamaño de entrada. 91 00:03:51,520 --> 00:03:53,920 >> Por suposto, hai unha desvantaxe. 92 00:03:53,920 --> 00:03:55,710 Gasta espazo de memoria adicional no seu ordenador 93 00:03:55,710 --> 00:03:57,380 almacenar a variable 94 00:03:57,380 --> 00:03:59,270 e todo o tempo extra que leva 95 00:03:59,270 --> 00:04:01,490 para facer o almacenamento real da variable, 96 00:04:01,490 --> 00:04:03,390 pero o punto aínda está de pé, 97 00:04:03,390 --> 00:04:05,060 descubrir canto tempo a súa secuencia foi 98 00:04:05,060 --> 00:04:07,600 non depende da lonxitude da corda en todo. 99 00:04:07,600 --> 00:04:10,720 Entón, é executado en O (1) ou de tempo constante. 100 00:04:10,720 --> 00:04:13,070 Isto certamente non ha de significar 101 00:04:13,070 --> 00:04:15,610 que o código é executado en unha etapa, 102 00:04:15,610 --> 00:04:17,470 pero non importa cantos pasos se, 103 00:04:17,470 --> 00:04:20,019 se non se modifica o tamaño das entradas, 104 00:04:20,019 --> 00:04:23,420 aínda é assintoticamente constante que representamos con O (1). 105 00:04:23,420 --> 00:04:25,120 >> Como probablemente pode adiviñar, 106 00:04:25,120 --> 00:04:27,940 Existen varios grandes runtimes O para medir con algoritmos. 107 00:04:27,940 --> 00:04:32,980 O (n) ² algoritmos son assintoticamente máis lento que o (n) algoritmos. 108 00:04:32,980 --> 00:04:35,910 Isto é, como o número de elementos (n) aumenta, 109 00:04:35,910 --> 00:04:39,280 Finalmente, o (n) ² algoritmos vai levar máis tempo 110 00:04:39,280 --> 00:04:41,000 que o (n) para realizar algoritmos. 111 00:04:41,000 --> 00:04:43,960 Iso non significa que o (n) algoritmos sempre executar máis rápido 112 00:04:43,960 --> 00:04:46,410 que o (n) ² algoritmos, mesmo no mesmo ambiente, 113 00:04:46,410 --> 00:04:48,080 o mesmo hardware. 114 00:04:48,080 --> 00:04:50,180 Quizais para pequenos tamaños de entrada, 115 00:04:50,180 --> 00:04:52,900  O (n) ² algoritmo pode realmente traballar máis rápido, 116 00:04:52,900 --> 00:04:55,450 pero, finalmente, como o tamaño de entrada aumenta 117 00:04:55,450 --> 00:04:58,760 para o infinito, a O (n) tempo de execución ² algoritmo 118 00:04:58,760 --> 00:05:02,000 acabará por eclipsar o tempo de execución do algoritmo O (n). 119 00:05:02,000 --> 00:05:04,230 Así como calquera función cuadrática matemáticas 120 00:05:04,230 --> 00:05:06,510  eventualmente superar calquera función lineal, 121 00:05:06,510 --> 00:05:09,200 non importa o que unha cabeza de iniciar a función lineal comeza con. 122 00:05:10,010 --> 00:05:12,000 Se está a traballar con grandes cantidades de datos, 123 00:05:12,000 --> 00:05:15,510 algoritmos que son executados en O (n) ² realmente pode acabar retardando o seu programa, 124 00:05:15,510 --> 00:05:17,770 pero para tamaños de entrada pequenas, 125 00:05:17,770 --> 00:05:19,420 probablemente non vai nin entender. 126 00:05:19,420 --> 00:05:21,280 >> Outra complexidade asintótica é, 127 00:05:21,280 --> 00:05:24,420 tempo logarítmica, O (log n). 128 00:05:24,420 --> 00:05:26,340 Un exemplo dun algoritmo que executa este rápido 129 00:05:26,340 --> 00:05:29,060 é o algoritmo de procura clásico binario, 130 00:05:29,060 --> 00:05:31,850 para atopar un elemento nunha lista xa ordenada de elementos. 131 00:05:31,850 --> 00:05:33,400 >> Se non sabe o que busca binaria fai, 132 00:05:33,400 --> 00:05:35,170 Vou explicar isto para vostede moi rapidamente. 133 00:05:35,170 --> 00:05:37,020 Imos dicir que está mirando para o número 3 134 00:05:37,020 --> 00:05:40,200 neste array de enteiros. 135 00:05:40,200 --> 00:05:42,140 Menciónase o elemento do medio da matriz 136 00:05:42,140 --> 00:05:46,830 e pregunta: "É o elemento que quero superior, igual ou menos que iso?" 137 00:05:46,830 --> 00:05:49,150 Se é igual, entón gran. Vostede atopou o elemento, e está feito. 138 00:05:49,150 --> 00:05:51,300 Se é maior, entón vostede sabe o elemento 139 00:05:51,300 --> 00:05:53,440 ten que estar no lado dereito da matriz, 140 00:05:53,440 --> 00:05:55,200 e só se pode ver que, no futuro, 141 00:05:55,200 --> 00:05:57,690 e se é menor, entón vostede sabe que ten que estar no lado esquerdo. 142 00:05:57,690 --> 00:06:00,980 Este proceso é entón repetida coa matriz de menor tamaño 143 00:06:00,980 --> 00:06:02,870 ata que o elemento correcto sexa atopado. 144 00:06:08,080 --> 00:06:11,670 >> Este poderoso algoritmo corta o tamaño da matriz no medio con cada operación. 145 00:06:11,670 --> 00:06:14,080 Así, para atopar un elemento nunha matriz clasificada de tamaño 8, 146 00:06:14,080 --> 00:06:16,170 como máximo (log ₂ 8), 147 00:06:16,170 --> 00:06:18,450 ou 3 destas operacións, 148 00:06:18,450 --> 00:06:22,260 comprobar o elemento central, a continuación, a matriz de corte en media será esixido, 149 00:06:22,260 --> 00:06:25,670 Considerando unha matriz de tamaño 16 leva (log ₂ 16), 150 00:06:25,670 --> 00:06:27,480 ou catro operacións. 151 00:06:27,480 --> 00:06:30,570 Isto é só unha operación máis para unha matriz dobrou de tamaño. 152 00:06:30,570 --> 00:06:32,220 A duplicación do tamaño da matriz 153 00:06:32,220 --> 00:06:35,160 aumenta o tempo de execución de só un anaco deste código. 154 00:06:35,160 --> 00:06:37,770 Unha vez máis, o elemento de control do medio da lista, entón a división. 155 00:06:37,770 --> 00:06:40,440 Así, di-se para operar en tempo logarítmica, 156 00:06:40,440 --> 00:06:42,440 O (log n). 157 00:06:42,440 --> 00:06:44,270 Pero espera, di, 158 00:06:44,270 --> 00:06:47,510 isto non depende de onde na lista o elemento que está a procurar é? 159 00:06:47,510 --> 00:06:50,090 E o primeiro elemento ollar pasa a ser a persoa ben? 160 00:06:50,090 --> 00:06:52,040 Entón, el só ten unha operación, 161 00:06:52,040 --> 00:06:54,310 non importa o grande a lista. 162 00:06:54,310 --> 00:06:56,310 >> Ben, é por iso que os científicos da computación teñen prazos máis 163 00:06:56,310 --> 00:06:58,770 a complexidade asintótica que reflicten o mellor caso 164 00:06:58,770 --> 00:07:01,050 e peor desempeño dun algoritmo. 165 00:07:01,050 --> 00:07:03,320 Máis propiamente, os límites superior e inferior 166 00:07:03,320 --> 00:07:05,090 en tempo de execución. 167 00:07:05,090 --> 00:07:07,660 No mellor dos casos por busca binaria, é a nosa elemento 168 00:07:07,660 --> 00:07:09,330 alí no medio, 169 00:07:09,330 --> 00:07:11,770 e obtelo en tempo constante, 170 00:07:11,770 --> 00:07:14,240 non importa quão grande o resto da matriz é. 171 00:07:15,360 --> 00:07:17,650 O símbolo utilizado para iso é Ω. 172 00:07:17,650 --> 00:07:19,930 Así, este algoritmo está dito a correr en Ω (1). 173 00:07:19,930 --> 00:07:21,990 No mellor dos casos, ela atopa o elemento de xeito rápido, 174 00:07:21,990 --> 00:07:24,200 non importa quão grande é a matriz, 175 00:07:24,200 --> 00:07:26,050 mais, no peor caso, 176 00:07:26,050 --> 00:07:28,690 que ten que desempeñar (log n) verifícase división 177 00:07:28,690 --> 00:07:31,030 da matriz para atopar o elemento certo. 178 00:07:31,030 --> 00:07:34,270 Límites peor superiores son referidos co gran "O", que xa sabes. 179 00:07:34,270 --> 00:07:38,080 Entón, é o (log n), pero Ω (1). 180 00:07:38,080 --> 00:07:40,680 >> Unha busca lineal, pola contra, 181 00:07:40,680 --> 00:07:43,220 en que anda a través de cada elemento da matriz 182 00:07:43,220 --> 00:07:45,170 para atopar o que quere, 183 00:07:45,170 --> 00:07:47,420 é a mellor Ω (1). 184 00:07:47,420 --> 00:07:49,430 Unha vez máis, o primeiro elemento que quere. 185 00:07:49,430 --> 00:07:51,930 Entón, non importa o quão grande é a matriz. 186 00:07:51,930 --> 00:07:54,840 No peor dos casos, é o último elemento na matriz. 187 00:07:54,840 --> 00:07:58,560 Entón, ten que pasar por todos os n elementos na matriz para atopalo, 188 00:07:58,560 --> 00:08:02,170 como se está mirando para un 3. 189 00:08:04,320 --> 00:08:06,030 Entón, é executado en tempo O (n) 190 00:08:06,030 --> 00:08:09,330 porque é proporcional ao número de elementos na matriz. 191 00:08:10,800 --> 00:08:12,830 >> Un símbolo usado é Θ. 192 00:08:12,830 --> 00:08:15,820 Isto pode ser usado para describir algoritmos onde os casos mellores e peores 193 00:08:15,820 --> 00:08:17,440 son os mesmos. 194 00:08:17,440 --> 00:08:20,390 Este é o caso dos algoritmos secuencia de lonxitude que falamos anteriormente. 195 00:08:20,390 --> 00:08:22,780 É dicir, se almacena-lo nunha variable antes 196 00:08:22,780 --> 00:08:25,160 nós gardados a corda e acceder a ela máis tarde en tempo constante. 197 00:08:25,160 --> 00:08:27,920 Non importa que número 198 00:08:27,920 --> 00:08:30,130 estamos almacenando nesa variable, nós imos ter que mirar para el. 199 00:08:33,110 --> 00:08:35,110 O mellor caso é, miramos para el 200 00:08:35,110 --> 00:08:37,120 e atopar a lonxitude da corda. 201 00:08:37,120 --> 00:08:39,799 Así Ω (1), ou mellor, se o tempo constante. 202 00:08:39,799 --> 00:08:41,059 O peor caso é, 203 00:08:41,059 --> 00:08:43,400 miramos para el e atopar a lonxitude da corda. 204 00:08:43,400 --> 00:08:47,300 Así, o (1) ou constante de tempo no peor caso. 205 00:08:47,300 --> 00:08:49,180 Entón, unha vez que o mellor caso e peor dos casos son os mesmos, 206 00:08:49,180 --> 00:08:52,520 iso pode ser dito para ser executado en tempo Θ (1). 207 00:08:54,550 --> 00:08:57,010 >> En resumo, temos boas maneiras de razoar sobre a eficiencia códigos 208 00:08:57,010 --> 00:09:00,110 sen saber nada sobre o tempo do mundo real que toman para correr, 209 00:09:00,110 --> 00:09:02,270 que é afectado por moitos factores externos, 210 00:09:02,270 --> 00:09:04,190 incluíndo hardware diferentes, software, 211 00:09:04,190 --> 00:09:06,040 ou as particularidades do seu código. 212 00:09:06,040 --> 00:09:08,380 Ademais, ela nos permite razoar ben sobre o que vai ocorrer 213 00:09:08,380 --> 00:09:10,180 cando o tamaño dos incrementos de entradas. 214 00:09:10,180 --> 00:09:12,490 >> Se está executando en O (n) algoritmo ², 215 00:09:12,490 --> 00:09:15,240 ou peor, un O (2 ⁿ) algoritmo, 216 00:09:15,240 --> 00:09:17,170 un dos máis rápidos tipo de cultivo, 217 00:09:17,170 --> 00:09:19,140 vai realmente comezar a notar a desaceleración 218 00:09:19,140 --> 00:09:21,220 cando comezar a traballar con grandes cantidades de datos. 219 00:09:21,220 --> 00:09:23,590 >> Esa é a complexidade asintótica. Grazas.