1 00:00:07,050 --> 00:00:09,630 [Powered by Google Translate] Hvordan vil du representere alle dine familiemedlemmer i en datamaskin? 2 00:00:10,790 --> 00:00:12,390 Vi kan ganske enkelt bruke en liste, 3 00:00:12,390 --> 00:00:14,400 men det er et klart hierarki her. 4 00:00:14,400 --> 00:00:17,110 >> La oss si at vi begynner med oldemor, Alice. 5 00:00:17,110 --> 00:00:19,030 Hun har to sønner, Bob 6 00:00:19,030 --> 00:00:21,310 og bestefar, Charlie. 7 00:00:21,310 --> 00:00:23,190 Charlie har 3 barn, 8 00:00:23,190 --> 00:00:26,730 onkelen din, Dave, tante, Eve, og din far, Fred. 9 00:00:26,730 --> 00:00:28,750 Du er Fred eneste barn. 10 00:00:28,750 --> 00:00:30,950 >> Hvorfor skulle organisere dine familiemedlemmer på denne måten 11 00:00:30,950 --> 00:00:34,010 være bedre enn den enkel liste representasjon? 12 00:00:34,010 --> 00:00:36,630 En grunn er at dette hierarkisk struktur, 13 00:00:36,630 --> 00:00:39,660 kalt en "tre", inneholder mer informasjon enn en enkel liste. 14 00:00:40,540 --> 00:00:43,520 Vi vet den familiære relasjoner mellom alle 15 00:00:43,520 --> 00:00:45,440 bare ved å undersøke treet. 16 00:00:45,440 --> 00:00:47,250 Dessuten kan det fremskynde 17 00:00:47,250 --> 00:00:50,010 look-up tid enormt, hvis tre data er sortert. 18 00:00:50,010 --> 00:00:53,850 >> Vi kan ikke dra nytte av det her, men vi får se et eksempel på dette snart. 19 00:00:53,850 --> 00:00:56,150 Hver person er representert av en node på treet. 20 00:00:56,680 --> 00:00:58,370 Noder kan ha barnet noder 21 00:00:58,370 --> 00:01:00,350 samt en foreldrenoden. 22 00:01:00,350 --> 00:01:02,390 Dette er de tekniske begrepene, 23 00:01:02,390 --> 00:01:05,220 selv når du bruker trær for ting enn familier. 24 00:01:05,220 --> 00:01:07,940 Alice node har 2 barn og ingen foreldre, 25 00:01:07,940 --> 00:01:11,500 mens Charlie node har 3 barn og en forelder. 26 00:01:11,500 --> 00:01:14,330 >> Et blad node er en som ikke har noen barn 27 00:01:14,330 --> 00:01:16,410 på utsiden kanten av treet. 28 00:01:16,410 --> 00:01:18,520 Den øverste node i treet, rotnoden, 29 00:01:18,520 --> 00:01:20,240 har ingen foreldre. 30 00:01:20,240 --> 00:01:23,170 >> En binær treet er en bestemt type treet, 31 00:01:23,170 --> 00:01:26,720 hvori hver node har, på det meste, 2 barn. 32 00:01:26,720 --> 00:01:30,490 Her er struct av en node i et binært tre i C. 33 00:01:31,560 --> 00:01:34,530 Hver node har noen data knyttet til den 34 00:01:34,530 --> 00:01:36,520 og 2 pekere til andre noder. 35 00:01:36,520 --> 00:01:38,110 >> I vårt slektstre, 36 00:01:38,110 --> 00:01:40,900 tilhørende data var hver persons navn. 37 00:01:40,900 --> 00:01:43,850 Her er det en int, selv om det kan være noe. 38 00:01:44,510 --> 00:01:46,200 Som det viser seg, 39 00:01:46,200 --> 00:01:48,990 et binært tre ville ikke være en god representasjon for en familie, 40 00:01:48,990 --> 00:01:51,960 siden folk ofte har mer enn 2 barn. 41 00:01:51,960 --> 00:01:53,510 >> En binært søketre 42 00:01:53,510 --> 00:01:56,380 er en spesiell, ordnet type binærtreet 43 00:01:56,380 --> 00:01:58,090 som tillater oss å se på verdier raskt. 44 00:01:58,740 --> 00:02:00,050 Du har kanskje lagt merke til 45 00:02:00,050 --> 00:02:02,010 at hver node under roten av et tre 46 00:02:02,010 --> 00:02:04,620 er roten av et annet tre, kalt en "subtre. 47 00:02:04,960 --> 00:02:07,090 Her, er roten av treet 6, 48 00:02:07,090 --> 00:02:09,860 og barn, 2, er roten av et katalogtre. 49 00:02:09,860 --> 00:02:11,870 >> I et binært søketre 50 00:02:11,870 --> 00:02:15,790 alle verdiene i en node er rett subtre 51 00:02:15,790 --> 00:02:18,690 er større enn noden verdi. Her: 6. 52 00:02:18,690 --> 00:02:22,640 Vel, verdiene i en node venstre subtre 53 00:02:24,540 --> 00:02:26,890 er mindre enn noden verdi. 54 00:02:26,890 --> 00:02:28,620 Hvis vi trenger for å håndtere like verdier, 55 00:02:28,620 --> 00:02:31,760 vi kan endre noen av disse til en løs ulikhet, 56 00:02:31,760 --> 00:02:34,410 betyr identiske verdier kan falle enten på venstre eller høyre, 57 00:02:34,410 --> 00:02:37,400 så lenge vi er konsekvente på det hele. 58 00:02:37,400 --> 00:02:39,620 Dette treet er et binært søketre 59 00:02:39,620 --> 00:02:41,540 fordi den følger disse reglene. 60 00:02:42,320 --> 00:02:46,020 >> Dette er hvordan det ville sett ut hvis vi slått alle nodene i C structs. 61 00:02:46,880 --> 00:02:48,410 Legg merke til at hvis et barn mangler, 62 00:02:48,410 --> 00:02:50,340 pekeren er null. 63 00:02:50,340 --> 00:02:53,270 Hvordan sjekker vi for å se om 7 er i treet? 64 00:02:53,270 --> 00:02:55,020 Vi starter ved roten. 65 00:02:55,020 --> 00:02:58,690 Seven er større enn 6, så hvis det er i treet, må det være til høyre. 66 00:02:59,680 --> 00:03:03,650 Deretter er det mindre enn 8, så det må bli stående. 67 00:03:03,650 --> 00:03:06,210 Her har vi funnet syv. 68 00:03:06,210 --> 00:03:08,160 Nå vil vi se etter 5. 69 00:03:08,160 --> 00:03:11,500 Fem er mindre enn 6, så det må være til venstre. 70 00:03:11,500 --> 00:03:13,460 Fem er større enn 2, 71 00:03:13,460 --> 00:03:15,010 så det må være riktig, 72 00:03:15,010 --> 00:03:18,100 og det er også større enn 4, slik at det må være til høyre igjen. 73 00:03:18,100 --> 00:03:20,300 Det er imidlertid ingen barn her. 74 00:03:20,300 --> 00:03:22,000 Pekeren er null. 75 00:03:22,000 --> 00:03:24,270 Dette betyr at 5 ikke er i treet vårt. 76 00:03:24,270 --> 00:03:27,250 >> Vi kan søke den binære treet med følgende kode: 77 00:03:28,430 --> 00:03:31,140 På hver node, sjekker vi å se om vi har funnet 78 00:03:31,140 --> 00:03:33,020 verdien vi leter etter. 79 00:03:33,020 --> 00:03:35,740 Hvis vi ikke finner det, finner vi om det bør være 80 00:03:35,740 --> 00:03:38,990 på venstre eller høyre og sjekk at subtre. 81 00:03:38,990 --> 00:03:41,160 Denne sløyfen vil fortsette ned treet 82 00:03:41,160 --> 00:03:44,190 til det ikke er barnenode enten på venstre eller høyre. 83 00:03:45,190 --> 00:03:48,600 >> Husk at 5 var ikke i treet. 84 00:03:48,600 --> 00:03:50,460 Hvordan setter vi det? 85 00:03:50,460 --> 00:03:52,370 Prosessen ligner å søke. 86 00:03:52,370 --> 00:03:54,830 Vi iterate ned treet fra 6, 87 00:03:54,830 --> 00:03:57,040 venstre til 2, 88 00:03:57,040 --> 00:03:59,140 rett til 4, 89 00:03:59,140 --> 00:04:02,500 og høyre igjen, men 4 har ingen barn på denne siden. 90 00:04:02,500 --> 00:04:06,090 Dette vil være den nye posisjonen for 5, 91 00:04:06,090 --> 00:04:08,500 og det vil begynne med ingen barn. 92 00:04:09,020 --> 00:04:12,220 >> Hvor raske er operasjoner på et binært søketre? 93 00:04:12,220 --> 00:04:15,410 Husk at Bigohnotation søker å gi en øvre grense. 94 00:04:15,410 --> 00:04:17,390 I verste fall, 95 00:04:17,390 --> 00:04:19,480 vår treet kunne bare være en lenket liste 96 00:04:19,480 --> 00:04:22,220 noe som betyr at innsetting, sletting, og søk 97 00:04:22,220 --> 00:04:25,380 kan ta tid proporsjonal til antall noder i treet. 98 00:04:25,380 --> 00:04:27,380 Dette er O (n). 99 00:04:27,380 --> 00:04:30,690 >> For eksempel, er det følgende et gyldig binært søketre. 100 00:04:31,850 --> 00:04:34,020 Men hvis vi prøver å finne 9, 101 00:04:34,020 --> 00:04:36,760 vi må traversere hver node. 102 00:04:36,760 --> 00:04:39,120 Det er ikke bedre enn en lenket liste. 103 00:04:39,120 --> 00:04:41,410 Ideelt sett ville vi ønsker hver node 104 00:04:41,410 --> 00:04:44,120 av vår binært søketre å ha 2 barn. 105 00:04:44,120 --> 00:04:46,370 Denne måten, innsetting, sletting og søk 106 00:04:46,370 --> 00:04:50,190 ville ta i verste fall O (log n) tid. 107 00:04:50,190 --> 00:04:52,470 Treet fra før kan være mer balansert, 108 00:04:52,470 --> 00:04:54,140 som dette. 109 00:04:54,140 --> 00:04:57,980 Nå ser opp noen verdi tar, på det meste, 3 trinn. 110 00:04:57,980 --> 00:04:59,460 Dette treet er balansert, 111 00:04:59,460 --> 00:05:01,190 betydning at den har en minimal dybde 112 00:05:01,190 --> 00:05:03,680 i forhold til antall noder. 113 00:05:03,680 --> 00:05:06,300 >> Leter du etter en verdi i en balansert binært søketre 114 00:05:06,300 --> 00:05:09,540 er lik binært søk på en sortert array. 115 00:05:09,540 --> 00:05:12,290 Faktisk, hvis vi ikke trenger å sette inn eller slette elementer, 116 00:05:12,290 --> 00:05:15,150 de oppfører seg på akkurat samme måte. 117 00:05:15,150 --> 00:05:17,600 Imidlertid er en trestruktur bedre 118 00:05:17,600 --> 00:05:19,530 for håndtering innsettinger og slettinger 119 00:05:20,360 --> 00:05:22,670 >> Mitt navn er Bannus Van der Kloot. 120 00:05:22,670 --> 00:05:24,030 Dette er CS50.