Collections och datastrukturer. Kursbokens kapitel 13 och

Relevanta dokument
Föreläsning 9 Innehåll

Föreläsning 3 Datastrukturer (DAT037)

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 14 Innehåll

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning Datastrukturer (DAT036)

Länkade strukturer. (del 2)

Tentamen i Algoritmer & Datastrukturer i Java

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsning 3 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 1 Datastrukturer (DAT037)

Föreläsning 10 Innehåll

13 Prioritetsköer, heapar

Lösningsförslag till tentamen Datastrukturer, DAT037,

Datastrukturer. föreläsning 3. Stacks 1

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal)

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Diskutera. Hashfunktion

Föreläsning 9 Innehåll

Föreläsning 8. Mängd, Avbildning, Hashtabell

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning Datastrukturer (DAT036)

Inlämningsuppgift och handledning

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 10 Datastrukturer (DAT037)

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Länkade strukturer, parametriserade typer och undantag

Föreläsning 2. Länkad lista och iterator

Föreläsning 2. Länkad lista och iterator

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Datastrukturer. föreläsning 6. Maps 1

Föreläsning 4 Innehåll

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Föreläsning 7. Träd och binära sökträd

Föreläsning Datastrukturer (DAT036)

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning Datastrukturer (DAT037)

Inlämningsuppgift och handledning. Föreläsning 11 Innehåll. Diskutera. Hashtabeller

Polymorfi. Objektorienterad och komponentbaserad programmering

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Föreläsning 11 Innehåll

Algoritmer och datastrukturer 2012, fo rela sning 8

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Lösningsförslag till exempeltenta 1

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 3. Stack

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Interfacen Set och Map, hashtabeller

Föreläsning 8. Mängd, Avbildning, Hashtabell

Föreläsning 3. Stack

Föreläsning 11. ADT:er och datastrukturer

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Föreläsning 5 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen Datastrukturer (DAT036)

Samlingar Collection classes

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Dugga Datastrukturer (DAT036)

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Tentamen kl Uppgift 4. Uppgift 5

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Tentamen, Algoritmer och datastrukturer

Föreläsning 10 Innehåll

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon.

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Föreläsning 10. ADT:er och datastrukturer

Magnus Nielsen, IDA, Linköpings universitet

Algoritmer och datastrukturer

Föreläsning 7. Träd och binära sökträd

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Facit Tentamen TDDC (7)

Innehåll. F7: Tabell, hashtabell, relation & lexikon. Gränsyta till Tabell. Tabell. Tabell Hashtabell Relation Lexikon.

Transkript:

Collections och datastrukturer Kursbokens kapitel 13 och https://msdn.microsoft.com/enus/library/7y3x785f.aspx

Exempel på några collections Finns i assembly mscorlib, System.Core och System Ingår i namnrymden System.Collections.Generic Listor En lista är en datasamling som innehåller ett godtyckligt antal element. Utmärkande för listor är att elementen är ordnade i en viss följd. List, utnyttjar internt en array för att hålla ordning på sina värden LinkedList, använder en kedja av noder Stack, endast den ena änden av sekvensen av värden är åtkomlig, den änden är stackens topp. Queue, endast i ena änden kommer man åt ett värde, endast i andra änden kan man lägga till värden Mängder Elementen i en mängd ligger inte någon speciell ordning. Ett visst element kan endast förekomma en gång. HashSet, utnyttjar hashvärden för snabbt hitta rätt värde Avbildningstabeller (maps på engelska) Tabeller i vilka man använder söknycklar för att komma åt värdena Dictionary, implementerad med hjälp av en hashtabell SortedDictionary, använder ett binärt sökträd SortedList, uppbyggd med hjälp av en vanlig array

Listor 5 2-4 Lista; består av en följd med element. Det går att sätta in och ta bort element var som helst i listan. Push Pop 5 2-4 Stack; består av en följd med element. Det går endast att sätta in och ta bort element i ena änden. Dequeue 5 2-4 Queue; består av en följd med element. Det går endast att sätta in värden i ena änden och komma åt värden i andra änden Enqueue

LinkedList, en dubbellänkad lista first last null null 5 2-4

Mängder Add 5 Remove 2-4 HashSet; Värdena har ingen speciell ordning Två värden som är lika kan inte förekomma i ett HashSet För värdetyper jämförs elementens värden direkt, men om elementen är av referenstyp så jämförs referenserna

Mängder, HashSet class Person : IEquatable<Person> public string Namn get; set; public int Ålder get; set; public override string ToString()return Namn + " är " + Ålder + " år."; public bool Equals(Person enperson)return Namn == enperson.namn && Ålder == enperson.ålder; public override int GetHashCode()return Namn.GetHashCode() ^ Ålder.GetHashCode(); public static void Main() HashSet<Person> laget = new HashSet<Person>(); Person lisa = new Person Namn = "Lisa", Ålder = 43 ; Person nisse1 = new Person Namn = "Nisse", Ålder = 23 ; Person nisse2 = nisse1; Person lasse = new Person Namn = "Lasse", Ålder = 47 ; Person karin1 = new Person Namn = "Karin", Ålder = 39 ; Person karin2 = new Person Namn = "Karin", Ålder = 39 ; exclusive OR laget.add(lisa); laget.add(nisse1); laget.add(nisse2); laget.add(lasse); laget.add(karin1); laget.add(karin2); foreach (Person medlem in laget) Console.WriteLine(medlem); Lisa är 43 år. Nisse är 23 år. Lasse är 47 år. Karin är 39 år.

Avbildningstabeller, SortedDictionary root bad 2 ask 12 null far 3 null and null null bar null zoo null 3 7 1 SortedDictionary; består av ett binärt sökträd Lägg märke till att söknycklarnas storlek ökar från vänster mot höger i trädet! I det här exempel utgörs söknycklarna av trestaviga ord, och värdena av heltal null dyr 5 null

SortedDictionery, ett exempel using System; using System.Collections.Generic; namespace Telefonlistan class Program static void Main(string[] args) SortedDictionary<string, int> telefonlistan = new SortedDictionary<string, int>(stringcomparer.currentcultureignorecase); telefonlistan.add("öbo Nisse", 34512); telefonlistan.add("strand Eva", 234567); telefonlistan.add("klen Sven", 56855); telefonlistan.add("bong Oskar", 334512); telefonlistan.add("hurtig Karin", 88860); foreach (KeyValuePair<string, int> abonnent in telefonlistan) Console.WriteLine(abonnent.Key + " har telefonnummer: " + abonnent.value); Bong Oskar har telefonnummer: 334512 Hurtig Karin har telefonnummer: 88860 Klen Sven har telefonnummer: 56855 Strand Eva har telefonnummer: 234567 Öbo Nisse har telefonnummer: 34512

Datatyp Data bär information genom att representera någonting Datatyp representerar en bestämd typ av data Datatyp = objekt + operationer Enkel datatyp är en datatyp som inte sammansatt av andra datatyper, t ex integer Sammansatt datatyp är en datatyp som är uppbyggd av delar, element, som i sin tur kan bestå av en eller flera datatyper. Elementen är organiserade på ett bestämt sätt Ett element kan beskrivas av dess position eller dess värde Det är inte säkert att ett element alltid har ett värde eller en position, varken distinkt, eller relativt andra elements positioner eller värden 9

Abstrakt DataTyp, ADT En ADT är en datatyp som vi inte behöver ta hänsyn till vare sig hur, den är realiserad i ett programspråk eller hårdvara Vi tar inte ställning till hur datastrukturen är uppbyggd, eller hur dess olika operationerna utförs! Fokuset ligger på vad operationerna gör och vilka resultat de ger. 10

Abstrakt DataTyp, ADT En ADT är en datatyp som vi inte behöver ta hänsyn till vare sig hur, den är realiserad i ett programspråk eller hårdvara Vi tar inte ställning till hur datastrukturen är uppbyggd, eller hur dess olika operationerna utförs! Fokuset ligger på vad operationerna gör och vilka resultat de ger. 11

Abstrakta datatyper, ADT ADT = Abstrakt DataTyp Består av utvalda datastrukturer och operationer implementerade så att de bildar en logisk enhet Jämför med enkla datatyper och deras operationer, plus minus, gånger... Datastrukturerna får ENDAST vara åtkomliga via de operationer som ingår i den abstrakta datatypen! En ADT har en gränsyta utåt bestående av operationer Gränsytan måste vara komplett, någon operation får inte saknas! Endast primitiva operationer ska förekomma. Gränsytan MÅSTE beskrivas av en informell specifikation! Enklast att implementera i ett objektorienterat språk, t ex C++, Java och C# 12

En ADT realiseras av datastrukturer Några abstrakta datatyper Stack Kö Prioritetskö Lista en linjärt ordnad mängd med element Mängd, set en oordnad mängd med unika element, kan kombineras med andra mängder Multiset, bag en oordnad mängd som kan innehålla lika element Lexikon, dictionary mängd som har operationer för att söka, lägga till och radera element, men går ej att kombinera med andra mängder Några datastrukturer Linjära strukturer array, enkellänkad lista, dubbellänkad lista, cirkulär lista Grafer Oriktade, enkelriktade, kompletta, täta, glesa, viktade Träd Fri form, rotad, skog, ordnade, binära, binära sökträd, balanserade, flervägssökträd Strukturer med oordnade data Hashtabell 13

Gränsytan kan beskrivas med en informell specifikation Gränsytan är synligt Detta döljs av gränsytan För att en ADT ska vara användbar så måste dess gränsyta, 1. Beskrivas så att användaren får tydlig en mental modell 2. Gränsytan måste bestå av alla nödvändiga operationer 3. Gränsytan ska vara minimal, endast primitiva operationer! 4. Varje operation måste beskrivas med hjälp av operationens kontrakt a) Beskrivning av vad operationen utför, OBS! inte hur den utför... b) Villkor som måste vara uppfyllda innan operationen anropas c) Villkor som är uppnådda efter att operationen har exekverat 5. Varje operations prototyp måste anges 14

Den abstrakta datatypens namn Beskrivning av ADT Queue Operationer som ingår i ADT Queue En operations prototyp En operations kontrakt ADT Stack Ett exempel på en informell specifikation av gränsytan för en ADT Beskrivning Stack är en abstrakt datatyp som består av värden vars positioner är ordnade i en sammanhållen linjär följd. Den ena änden av de linjärt ordnade positionerna utgör stackens topp. Endast det värde som finns i stackens topp går att komma åt och ta bort, alla andra värden i stacken är oåtkomliga. Det är endast möjligt att sätta in nya värden i stackens topp. Operationer och deras kontrakt void Push(double anumber); Lägger in ett värde på stackens topp. Precondition: Alltid uppfyllt Postkondition: Värdet anumber är inlagt vid stackens topp double Pop(); Tar bort värdet vid stackens topp och returnerar det. Precondition: Stacken får inte vara tom. Postcondition: Värdet vid toppen är borttaget och är returnerat. Här saknas ett antal operationer för att ADT Stack ska bli praktiskt användbar, vilka? 15

Ett exempel, gränsytan för en stack /// <summary> /// ADT Stack /// Stack är en abstrakt datatyp som består av värden vars positioner är ordnade i en /// sammanhållen linjär följd. Den ena änden av de linjärt ordnade positionerna utgör /// stackens topp. Endast det värde som finns i stackens topp går att komma åt och ta /// bort, alla andra värden i stacken är oåtkomliga. Det är endast möjligt att sätta /// in nya värden i stackens topp. /// /// Programmerare: Hans-Edy Mårtensson /// Datum: 2014-09-24 /// </summary> interface IStack /// <summary> /// Lägger in ett värde på stackens topp. /// Precondition: Alltid uppfyllt. /// Postkondition: Värdet anumber är inlagt vid stackens topp. /// </summary> /// <param name="anumber">värdet anumber är inlagt vid stackens topp</param> void Push(double anumber); /// <summary> /// Tar bort värdet vid stackens topp och returnerar det. /// Precondition: Stacken får inte vara tom. /// Postcondition: Värdet vid toppen är borttaget och är returnerat. /// </summary> /// <returns></returns> double Pop(); // och så vidare... 16

En datastruktur för ADT Stack public class ArrayStack : IStack private double[] array = null; int size = 0; Detta garanterar att ArrayStack implementerar alla metoder som är deklarerade i interface IStack public ArrayStack() array = new double[2]; public void Push(double anumber) if (size == array.length) grow(); array[size++] = anumber; Den här datastrukturen använder en array. När arrayen blir för liten byts den ut mot en dubbelt så stor. private void grow() double[] newarray = new double[2 * array.length]; int index = 0; foreach(double item in array) newarray[index++] = item; array = newarray; public double Pop() 17

Exempel på användning av ADT STack using System; class Program public static void Main() IStack minstack = new ArrayStack(); for (int tal = 1; tal < 10; tal++) minstack.push(tal); Det operationer som är tillgängliga för ADT Stack bestäms av stackens gränsyta, IStack. IStack fungerar som en fasad som avskärmar den datastruktur som implementerar stacken Vilken datastruktur som ska användas kan den som är i behov av stacken själv välja beroende på vilka prestanda som är intressanta för lösningen. //Console.WriteLine("Antal värden i stacken: " + minstack.count()); while (!minstack.isempty()) Console.WriteLine(minStack.Pop()); Console.ReadKey(); Count går inte att anropa via minstack, på grund av att den metoden saknas i gränsytan, IStack. 18

Några interfaces för Collections i.net En samling, collection, kan implementera flera olika interfaces, beroende på vilka egenskaper som är intressanta att använda Några vanliga interfaces är, ICollection<T>, har metoder för lägga till och ta bort värden, tömma samlingen, undersöka om samlingen innehåller ett värde, med mera... IEnumerable<T>, har en metod som returnerar en referens av typen IEnumerator. En sådan referens gör det möjligt att iterera över en samling med värden. IList<T>, Gör det möjligt att använda index för att nå objekt i en samling IDictionary<T>, implementeras av samlingar bestående av nyckelvärde par Se https://msdn.microsoft.com/enus/library/bb762928(v=vs.110).aspx

Ett exempel med gränsytor mot en samling av objekt using System; using System.Collections.Generic; public class Program public static void Main() Person kalle = new Person("Kalle Anka", 42); Person musse = new Person("Musse Pigg", 35); Person janne = new Person("Jan Långben", 28); Person zeke = new Person("Zeke Varg", 52); ICollection<Person> gränsytan = new List<Person>(); gränsytan.add(kalle); gränsytan.add(janne); gränsytan.add(zeke); // Stöd för index finns inte i ICollection, använd IList //for (int i=0; i<gränsytan.count; i++) // // Console.WriteLine(gränsytan[i]); // // Följande är möjligt på grund av att ICollection ärver av IEnumerable IEnumerable<Person> uppräkningsbara = gränsytan; foreach(person enperson in uppräkningsbara) Console.WriteLine(enPerson); // Interface IEnumerable innehåller inte metoden Add // uppräkningsbara.add(zeke);

Tar det längre tid att exekvera en operation om fler värden läggs in? Tidskomplexitet För att beskriva hur tiden för att köra en operation växer med antal värden som ingår i en samling används Ordo-begreppet O(1) betyder att tiden för att köra operationen påverkas inte av antalet värden. O(n) betyder att tiden i värsta fall ökar i proportion med ökningen av antal värden. Om antalet värden, n, ökar till det dubbla, 2n, ökar även tiden för exekveringen av operationen till det dubbla. O(n 2 ) betyder att tiden i värsta fall ökar i kvadrat jämfört mot ökningen av antalet värden, n. Om antalet värden ökar från n till 2n så ökar tiden med kvadraten av 2n det vill säga 4n O(log(n)) betyder att tiden i värsta fall ökar med logaritmen av ökningen av antalet värden, n. Om antalet värden ökar från n till 2n så ökar tiden med logaritmen av 2n det vill säga log(2n) O(f(n)) betyder att tiden i värsta fall ökar med funktionen f(n) jämfört med ökningen av antalet värden, n. Om antalet värden ökar från n till 2n så ökar tiden med f(2n)

Hashtabell med öppen hashning Entries 0 1 2 3 4 Bucket list Buckets Länkad lista Länkad lista Länkad lista Länkad lista Länkad lista Bucket list är en array med referenser till länkade listor, buckets. Antal element i arrayen bör minst vara lika många som antal objekt som får förekomma i hashtabellen Antal element bör vara ett primtal för att man ska få bästa möjliga spridning Rätt entries beräknas med hjälp av objektens hash-kod. En bra hashkod ska ge en slumpmässig spridning och vara snabb att beräkna I C# har alla objekt en färdig metod för att beräkna hash-koden. En bra egenskap! Så länge som fyllnadsgraden är låg, (antal insatta objekt / antal element) < 1 får man extremt snabba sökningar, tiden är proportionell mot O(1), dvs är oberoende av antal insatta värden i hashtabellen! En dålig egenskap! Det går inte att hålla objekten i en hashtabell sorterade i någon önskad ordning. 22

Ett exempel på hashtabell, del 1 using System.Collections.Generic; class Hashtabell private LinkedList<Person>[] bucketlist; public Hashtabell(int nrofbuckets) bucketlist = new LinkedList<Person>[nrOfBuckets]; for (int i = 0; i < bucketlist.length; i++) bucketlist[i] = new LinkedList<Person>(); public void Add(Person enperson) int entry = getentry(enperson.gethashcode()); bucketlist[entry].addlast(enperson); private int getentry(int hashcode) int entry = hashcode % bucketlist.length; return (entry < 0)? -entry : entry; public Person Get(string personnumret) int entry = getentry(personnumret.gethashcode()); foreach (Person enperson in bucketlist[entry]) if (enperson.personnr == personnumret) return enperson; return null; public void Remove(string personnumret) Person enperson = Get(personnumret); if (enperson!= null) int entry = getentry(personnumret.gethashcode()); bucketlist[entry].remove(enperson); 23

Ett binärt sökträd och dess noder root 24

Traversering av ett binärt sökträd public double[] GetSortedArray() List<double> lista = new List<double>(); inorder(root, lista); return lista.toarray(); private void inorder(node subtreeroot, List<double> listan) if (subtreeroot == null) return; inorder(subtreeroot.left, listan); listan.add(subtreeroot.value); inorder(subtreeroot.right, listan); Tiden för att besöka varje värde blir proportionell mot antal noder i trädet. Varje nod innebär två vägval. Balanserat träd: tiden är proportionell mot n Degenerad lista: tiden är proportionell mot n 25

Insättning av ett värde i ett binärt using System.Collections.Generic; sökträd public class BinarySearchTree private class Node public double Value; public Node Left; public Node Right; private Node root = null; public void Add(double anitem) add(ref root, anitem); Tiden för insättning av ett nytt värde blir proportionell mot den tid det tar att söka rätt på platsen för det nya värdet. Balanserat träd: tiden är proportionell mot log(n) Degenerad lista: tiden är proportionell mot n Vad händer om antal noder ökat till det dubbla för ett balanserat binärt träd? log 2 (2n) = log 2 (2) + log 2 (n) = 1 + log 2 (n), det vill säga att tiden ökar med en konstant, i det här exemplet med 1. För en degenerad lista fördubblas tiden om antalet noder fördubblas. private void add(ref Node subtreeroot, double anitem) if (subtreeroot == null) subtreeroot = new Node() Value = anitem, Left = null, Right = null ; else if (anitem < subtreeroot.value) add(ref subtreeroot.left, anitem); else add(ref subtreeroot.right, anitem); 26

Några för och nackdelar med binära sökträd Fördelar Mycket snabbare sökningar än i linjära strukturer som till exempel arrayer eller länkade listor, tiden är proportionerligt mot O(log(n)) förutsatt att det binära sökträdet är balanserat Nackdelar I värsta fall kan alla noder enbart hamna till vänster eller enbart till höger. Trädet degenererar till en enkellänkad lista. Tider för insättning och sökning blir motsvarande en enkellänkad lista, proportionella mot O(n) En mer komplicerad datastruktur att implementera än en enkel-länkad lista eller självväxande array. 27