Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

Like dokumenter
Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.3

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Kapittel 4 Delkapittel 4.2

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.2

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.1

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Eksamen 22. februar 2011

Algoritmer og datastrukturer Eksamen

Algoritmer og datastrukturer Løsningsforslag

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Fagnr: A. Ant. vedlegg: 1 (2 sider)

Algoritmer og datastrukturer E Løkker i Java

Emnekode: I-Dato: I ~ Antall oppgaver: I I Aiie -sk:i=rftlige - bme trykte og håndskrevne, samt alle typer

G høgskolen i oslo. Emne: Algoritmer og datastrukturer. Emnekode: 80131A. Faglig veileder: UlfUttersrud. Gruppe(r) : Dato:

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Algoritmer og datastrukturer Løsningsforslag

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Algoritmer og datastrukturer A.1 BitInputStream

Fagnr: A. Ant. vedlegg: 1 (2 sider)

Algoritmer og Datastrukturer

Dagens tema INF1010 INF1010 INF1010 INF1010

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Algoritmer og datastrukturer Kapittel 11 Delkapittel 11.2

Algoritmer og datastrukturer Kapittel 9 Delkapittel 9.2

Løsnings forslag i java In115, Våren 1996

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Liste som abstrakt konsept/datatype

Algoritmer og datastrukturer Kapittel 2 - Delkapittel 2.1

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Algoritmer og datastrukturer A.1 Filbehandling på bit-nivå

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

EKSAMEN med løsningsforslag

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

UNIVERSITETET I OSLO

Løsnings forslag i java In115, Våren 1998

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

INF1010 Binære søketrær ++

UNIVERSITETET I OSLO

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

INF1010. Stein Michael Storleer (michael) Lenkelister

Inf 1020 Algoritmer og datastrukturer

~ta11 oppgaver: 4. Nle skriftlige hjelpemidler-både trykte og håndskrevne, er tillatt

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Oppgave 1. Løsningsforslag til eksamensoppgave. ITF20006 Algoritmer og datastrukturer Postorden traversering:

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

Algoritmer og datastrukturer Kapittel 2 - Delkapittel 2.2

Algoritmer og datastrukturer Kapittel 5 - Delkapittel 5.1

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 10 sider inklusiv vedlegg og denne forsiden.

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

UNIVERSITETET I OSLO

klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

EKSAMEN. Algoritmer og datastrukturer

INF1010 våren Grensesnitt

Stack. En enkel, lineær datastruktur

TOD063 Datastrukturer og algoritmer

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

UNIVERSITETET I OSLO

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Løsningsforslag til INF110 h2001

2 Om statiske variable/konstanter og statiske metoder.

Kapittel 9: Sortering og søking Kort versjon

PG4200 Algoritmer og datastrukturer Forelesning 7

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

Algoritmer og Datastrukturer IAI 21899

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.2

Transkript:

Delkapittel 4.3 En toveiskø (deque) Side 1 av 5 Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3 4.3 En toveiskø (deque) 4.3.1 Grensesnittet Toveiskø En stakk kan godt ses på som en kø der vi kun legger inn i og tar ut fra den ene enden av køen. I en vanlig kø derimot legger vi inn i den ene enden (bakerst) og tar ut fra den andre enden (forrest). Begge disse ideene kan forenes i én type kø, dvs. en kø der vi både kan legge inn i begge ender og ta ut fra begge ender. En slik kø skal vi her kalle en toveiskø. Det engelsk navnet for dette er deque og ordet er en forkortelse for double ended queue. En toveiskø må ha metoder med navn som klart indikerer i hvilken ende av køen vi opererer. Vi skal her bruke ordene først og sist til dette formålet. Figur 4.3.1: I en toveiskø kan innlegging og uttak skje i begge ender Flg. grensesnitt inneholder to versjoner av hver av metodene for innlegging, kikking og uttak. Dvs. en versjon for hver ende av køen: public interface Toveiskø<T> // eng: Deque public void legginnførst(t verdi); // legger inn først i køen public void legginnsist(t verdi); // legger inn sist i køen public T kikkførst(); // ser på den første public T kikksist(); // ser på den siste public T tautførst(); // tar ut den første public T tautsist(); // tar ut den siste public boolean tom(); // er køen tom? public int antall(); // antall i køen public void nullstill(); // nullstiller køen // interface Toveiskø Programkode 4.3.1 Stakk: En toveiskø kan fungere som en stakk ved at metodene legginnførst, kikkførst og tautførst brukes som push, peek og pop. Eller en kan bruke legginnsist, kikksist og tautsist. Begge ender av toveiskøen skal fungere på samme måte. Kø: En toveiskø kan fungere som en vanlig kø ved at legginnsist, kikkførst og tautførst brukes som push, peek og pop. Eller eventuelt legginnførst, kikksist og tautsist. Oppgaver til Avsnitt 4.3.1 1. Sjekk hvilke metoder grensesnittet Deque i java.util har.

Delkapittel 4.3 En toveiskø (deque) Side 2 av 5 4.3.2 Lenket toveiskø En enkel måte å konstruere en toveiskø på er å bruke en toveis pekerkjede (dobbeltlenket liste) som intern datastruktur. Der brukes vanligvis hode og hale som navn på starten og slutten av listen. Her velger vi imidletid start og slutt siden det passer bedre i en toveiskø. Figur 4.3.2 a): En toveis pekerkjede mes start og slutt Dette gir oss flg. datastruktur for klassen LenketToveiskø: import java.util.*; public class LenketToveiskø<T> implements Toveiskø<T> private static final class Node<T> // en indre nodeklasse T verdi; // nodens verdi Node<T> forrige; // peker til forrige node Node<T> neste; // peker til neste node Node(T verdi, Node<T> forrige, Node<T> neste) // konstruktør this.verdi = verdi; this.forrige = forrige; this.neste = neste; // class Node private Node<T> start; private Node<T> slutt; private int antall; public LenketToveiskø() start = slutt = null; antall = 0; // køens start // køens slutt // antall i køen // standardkonstruktør // her skal resten av metodene inn // class LenketToveiskø Programkode 4.3.2 a) Innlegging i en tom kø gir en kø med kun én node og både start og slutt må dermed peke på denne noden. Nodens forrige- og nestepeker settes til null: Figur 4.3.2 b): Til venstre en tom kø - til høyre en ny node

Delkapittel 4.3 En toveiskø (deque) Side 3 av 5 En ny node først i en ikke-tom kø får vi til ved å la forrigepeker i den første noden peke til den nye. Nestepeker i den nye må så peke til det som var den første og forrigepeker i den nye må peke til null. Det hele blir korrekt når pekeren start settes til å peke på den nye: Figur 4.3.2 c): Innlegging først i en toveiskø som ikke er tom Koden for innlegging først i en lenket toveiskø blir dermed slik: public void legginnførst(t verdi) if (antall == 0) // køen er tom start = slutt = new Node<T>(verdi,null,null); else start = start.forrige = new Node<T>(verdi,null,start); antall++; Programkode 4.3.2 b) Metoden kikkførst er rett frem. I en ikke-tom kø skal verdien i første node returneres. Se Oppgave 3. Metoden tautførst er også mer eller mindre rett frem. Hvis køen ikke er tom, skal første node fjernes. Men først må verdien tas vare på. Dernest flyttes start til neste node. Hvis køen har nøyaktig én node fra før, vil den etterpå bli tom. Dermed må slutt settes til null. Hvis ikke, må forrigepeker i noden som nå blir første node, settes til null: public T tautførst() if (antall == 0) // køen er tom throw new NoSuchElementException("Køen er tom!"); T temp = start.verdi; start.verdi = null; start = start.neste; if (antall == 1) slutt = null; else start.forrige = null; antall ; return temp; Programkode 4.3.2 c) Oppgaver til Avsnitt 4.3.2 1. Legg grensesnittet Toveiskø på filen Toveiskø.java f.eks. under hjelpeklasser. 2. Legg klassen LenketToveiskø på filen LenketToveiskø.java og kopier inn metodene legginnførst og tautførst. 3. Kod resten av metodene i grensesnittet Toveiskø. Hvis «først»-metodene «speilvendes», får vi «sist»-metodene. Lag også en tostring-metode.

Delkapittel 4.3 En toveiskø (deque) Side 4 av 5 4.3.3 Sirkulær toveiskø En sirkulær toveiskø bruker samme idé som i den sirkulære køen i Avsnitt 4.2.2. Vi kan derfor starte med klassen TabellKø og så bytte ut navnet TabellKø med navnet TabellToveiskø alle aktuelle steder. Videre bytter vi ut navnene på metodene legginn(), kikk() og taut() til henholdsvis legginnsist(), kikkførst() og tautførst(). Metodene utvidtabell(), antall(), tom(), nullstill() og tostring() kan brukes som de er. Det som må kodes er metodene legginnførst(), kikksist() og tautsist(). Figur 4.3.3 a) : To piler markerer starten og slutten på køen Det å legge inn en ny verdi først betyr at den skal legges på plassen til venstre for fra eller hvis vi ser på sirkelen, på plassen vi får ved å gå én enhet mot klokken. På begge figurene blir det posisjon 4. Her må vi imidlertid passe på tilfellet at fra er 0. Én enhet mot klokken blir da posisjon 15, eller generelt lik a.length 1 hvis tabellen heter a. Figur 4.3.3 b) : En sirkulær tabell Vi må tenke på samme måte når vi skal se på eller ta ut den siste verdien. Den siste verdien ligger i posisjon til 1 eller posisjon a.length 1 hvis til er 0. Det er tomt hvis fra og til er like. public void legginnførst(t verdi) if (fra == 0) fra = a.length 1; else fra ; a[fra] = verdi; if (fra == til) a = utvidtabell(2*a.length); // dobler tabellen public T kikksist() if (fra == til) throw new NoSuchElementException("Køen er tom!"); if (til == 0) return a[a.length 1]; else return a[til 1]; public T tautsist() if (fra == til) throw new NoSuchElementException("Køen er tom!"); if (til == 0) til = a.length 1; else til ; T temp = a[til]; a[til] = null; return temp; Programkode 4.3.3 a)

Delkapittel 4.3 En toveiskø (deque) Side 5 av 5 Oppgaver til Avsnitt 4.3.3 1. Lag klassen TabellToveiskø. 4.3.4 Deque i java.util Java har flg. grensesnitt for en toveiskø: public interface Deque<T> extends Queue<T> public void addfirst(e e); // legger inn forrest i køen public void addlast(e e); // legger inn bakerst i køen public boolean offerfirst(t t); // legger inn forrest i køen public boolean offerlast(t t); // legger inn bakerst i køen public T peekfirst(); // ser på den første (null hvis tomt) public T peeklast(); // ser på den siste (null hvis tomt) public T getfirst(); // ser på den første (unntak hvis tomt) public T getlast(); // ser på den siste (unntak hvis tomt) public T pollfirst(); // tar ut den første (null hvis tomt) public T polllast(); // tar ut den siste (null hvis tomt) public T removefirst(); // tar ut den første (unntak hvis tomt) public T removelast(); // tar ut den siste (unntak hvis tomt) // + metoder som arves fra Queue<T> (og Collection<T>) // interface Deque Programkode 4.3.4 a) Både ArrayDeque og LinkedList kan brukes som en toveiskø. Her er et eksempel der ArrayDeque brukes: Deque<Integer> toveiskø = new ArrayDeque<>(); toveiskø.offerfirst(3); toveiskø.offerlast(4); toveiskø.offerfirst(2); toveiskø.offerlast(5); toveiskø.offerfirst(1); toveiskø.offerlast(6); while (!toveiskø.isempty()) System.out.print(toveiskø.pollFirst() + " "); // Utskrift 1 2 3 4 5 6 Programkode 4.3.4 b) Copyright Ulf Uttersrud, 2015. All rights reserved.