ITF Algoritmer og datastrukturer Oppgavesett 7 Av Thomas Gabrielsen Eksamen Oppgave. ) Det tar konstant tid å hente et gitt element fra en tabell uavhengig av dens størrelse, noe som med O-notasjon kan skrives som O(). ) I en lenket liste må man traversere gjennom hvert enkelt element i lista til man finner det ønskede elementet, noe som dermed har en lineær orden og en tidskompleksitet på O(n). ) Da man i en enkelt lenket liste er nødt til å gå igjennom lista for hvert element som skal skrives ut, får vi her en O-notasjon på O(n ). ) Dette gjøres i lineær tid O(n), da hvert element i tabellen må gjennomsøkes. ) Som i deloppgaven over, må det letes gjennom hvert element i lista (hvilken ende vi begynner i spiller ingen rolle), noe som også gir O(n). 7) Den raskest mulige sorteringen av lenkede lister foregår i linearitmisk tid, dvs. O(n log n). 9) Tidskompleksiteten for den raskeste sorteringen av en slik tabell blir fremdeles O(n log n). Oppgave. Under vises brettets utgangstilstand, der ruter med verdien false er hvite og de med true er sorte:
Figur Figur Figur Vi begynner iterasjonen ved [i =, j = ] (gjeldende posisjon markert med rødt omriss). Metoden pokus vil kun bli kalt dersom ruta vi befinner oss i er sort, derfor skjer det ingenting i denne omgang (figur ). Iterasjonen fortsetter et trinn videre til [, ]. Her har vi derimot en sort rute, og pokus vil nå kalles for den gjeldende ruta (figur ). Denne settes først til verdien false (hvit rute), før metoden ok deretter kalles for rutene rett til venstre, høyre, over og under gjeldende rute, markert på figuren med grønn skravering. For hver av disse rutene sjekkes det nå om verdien deres er true (dvs. ikke ligger utenfor brettet eller har verdien false), noe som her er tilfelle for ruta i [, ] (figur ). Figur Figur Figur Metoden pokus vil nå bli kalt rekursivt for denne ruta (vist med gult omriss). Som for den andre ruta settes denne også til false og kaller ok for sine nærliggende ruter, nå markert med blå skravering (figur ). Da ingen av rutene som sjekkes av ok i dette tilfellet er sorte, vil det ikke bli noen ytterligere kall til pokus for gjeldende iterasjon. Det rekursive kallet av pokus avsluttes (figur ). Det opprinnelige kallet av pokus avsluttes og returnerer verdien, som legges til i en teller ved navn antall (figur ). Merk at ruter som fjernes rekursivt ikke telles opp i antall, da returverdien fra rekursive kall til pokus ikke brukes videre på noen måte. Verdien på telleren er derfor kun. Figur 7 Figur 8 Figur 9 Vi fortsetter nå til vi treffer på neste sorte rute, som ligger i [, ] (figur 7). Ruta slettes og metoden ok kalles på samme måte som forrige gang, men denne gangen er det ingen sorte ruter i nærheten, og vi får ingen rekursjon (figurene 8 og 9). Telleren antall har nå verdien.
Figur Figur Figur Det gjenstår nå kun én sort rute, og vi itererer oss kjapt fram til denne (figur ). Denne behandles på akkurat samme måte som tidligere, og vi ender til slutt opp med et tomt brett og med telleren antall på verdien (figurene og ). Oppgave. Algoritmen består av en metode hokus som itererer element for element igjennom en todimensjonal tabell av vilkårlig størrelse, der det for hvert element med verdien true kjøres en metode pokus; denne setter verdien til det gjeldende elementet til false og kaller seg selv rekursivt for alle elementer i dets umiddelbare nærliggenhet (horisontalt og vertikalt) som har verdien true. Det foretas også en opptelling av alle de ruter der pokus kalles direkte fra hokus, dvs. uten en foregående rekursjon. Med andre ord kan denne metoden brukes for å finne antallet grupperinger av elementer i en n- dimensjonal tabell, der alle elementene i en gruppe er i et von Neumann-nabolag (dvs. ortogonalt sidestilt) med minst ett annet element i samme gruppe. Ordenen til denne algoritmen er relatert til hvor store de nøstede for-løkkene i metoden hokus er, da hver sorte rute allikevel bare håndteres én gang. Følgelig får vi da en kompleksitet på O(X*Y), der X og Y er tabellstørrelsen langs henholdsvis x- og y-aksen. Eksamen Oppgave A) Labyrinten før algoritmen kjøres i gang: 7 8 Det grønne feltet er startposisjonen, mens det blå er målet vi skal forsøke å nå.
Dette vil bli skrevet ut til skjerm innen målet nås for første gang: :, :, :, :, :, :, 7:, 8:, 9:, :, :, :, :, :, :, :, 7: 7, 8: 8, Found! Labyrinten etter at målet er funnet for første gang: 7 8 Pilene indikerer hvilken vei algoritmen tar igjennom labyrinten, mens oransjefargen viser hvilke felt som besøkes (denne blir en nyanse mørkere etter hver forgrening). Hvilken vei algoritmen velger å ta ved hvert forgreningspunkt bestemmes av rekkefølgen på de rekursive move-kallene. Prioriteten er satt som følger: Ned, venstre, opp og høyre. Ettersom det å gå ned har høyere prioritet enn det å gå til høyre, ble det valgt førstnevnte vei i starten. Vi skal nå se på hvordan resten av labyrinten blir traversert. Dette vil skrives ut til skjerm innen målet nås for andre (og siste) gang: 9:, :, :, :, :, :, :, :, 7:, 8:,
9:, :, :, :, : 7, : 8, : 8, : 8, 7: 8, 8: 8, 9: 8, : 8, Found! Labyrinten etter at målet igjen er funnet: 7 8 På grunn av de tidligere nevnte prioriteringene angående veivalg ser vi at algoritmen tok en aldri så liten omvei før den fant fram til målet. Dette problemet kan løses f.eks. ved å gi hvert veivalg sin egen tråd eller ved å benytte en cellulær automat.