Grundläggande datalogi - Övning 3

Relevanta dokument
Föreläsning 13 och 14: Binära träd

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Grundläggande datalogi - Övning 2

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Sätt att skriva ut binärträd

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Övning 1. Abstrakta datatyper. 1. Stacken. class Stack: """A representation of a last-in-first-out (LIFO) stack of objects."""

Giriga algoritmer och dynamisk programmering

Föreläsning 13. Rekursion

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Länkade listor, stackar och köer

Grundläggande datalogi - Övning 1

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Grundläggande datalogi - Övning 4

Lektion 2: Sökagenter. Robin Keskisärkkä

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program.

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

Mer grafik. Jan Erik Moström

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

Övning 2. (Länkade) Listor, noder

Rekursion och induktion för algoritmkonstruktion

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

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

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Rekursion. Rekursiv lösningsstrategi. Algoritmkonstruktion. Exempelproblem Hitta största elementet i en sekvens v i där i 1... n.

Föreläsning Datastrukturer (DAT036)

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

Problemlösning och funktioner Grundkurs i programmering med Python

Föreläsning 5: Dynamisk programmering

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

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

GOTO och lägen. Några saker till och lite om snabbare sortering. GOTO och lägen (3) GOTO och lägen (2)

Några saker till och lite om snabbare sortering

Övning 1 - Abstrakta datatyper

Föreläsning 11 Datastrukturer (DAT037)

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Datastrukturer och algoritmer

Lösning av några vanliga rekurrensekvationer

Rekursion. Koffman & Wolfgang kapitel 5

Dekomposition och dynamisk programmering

Magnus Nielsen, IDA, Linköpings universitet

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Imperativ och Funktionell Programmering i Python #TDDD73. Fredrik Heintz,

Hur man programmerar. TDDC66 Datorsystem och programmering Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Föreläsning Datastrukturer (DAT036)

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Programmering grundkurs

Tentamen: Programutveckling ht 2015

Grafer, traversering. Koffman & Wolfgang kapitel 10, avsnitt 4

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

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

Optimering Kruskal s algoritm Prim-Jarník s algoritm

Föreläsning 8 Innehåll

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

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

Dugga Datastrukturer (DAT036)

Hur man programmerar. Exempel på problemlösning i Python

Algoritmer och datastrukturer TDA Fredrik Johansson

Rekursion: varför? Problem delas upp i mindre bitar algoritm för att lösa problemet erhålls från problemformuleringen

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Föreläsning 9 Datastrukturer (DAT037)

Övning 6. Ali Tofigh 24 Oktober, 2006

Föreläsning 8 Datastrukturer (DAT037)

Fredag 10 juni 2016 kl 8 12

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Föreläsning Datastrukturer (DAT036)

Tentamen kl Uppgift 4. Uppgift 5

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Rekursion och induktion för algoritmkonstruktion

Algoritmer, datastrukturer och komplexitet

Tenta i Grundläggande programmering DD klockan

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Föreläsning Datastrukturer (DAT037)

Föreläsning 12: Exempel och problemlösning

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for

Tentamen i Introduktion till programmering

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Föreläsning 8 Datastrukturer (DAT037)

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Datastrukturer och algoritmer

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Procedurer och villkor

Grundkurs Programmering

Tommy Färnqvist, IDA, Linköpings universitet

Algoritmer, datastrukturer och komplexitet

Föreläsning 5 Mer om funktioner, villkor

F4: Mer om OU1, OU2, listor och träd. Carl Nettelblad

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Rekursion och induktion för algoritmkonstruktion

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Måndag 13 mars 2017 kl Rita en KMP-automat för CAMCORDERCAMERA samt ange next-vektorn.

Transkript:

Grundläggande datalogi - Övning 3 Björn Terelius November 14, 2008

Utskrift av stackar Tornen i Hanoi Principerna för rekursion: Hitta ett enkelt basfall (som har en känd lösning). Reducera varje annat problem till en mindre instans av samma problem. Observera att delproblemen måste närma sig basfallet för att undvika en oändlig rekursion.

Utskrift av stackar Tornen i Hanoi def print_stack_top_down(s): "Print a stack with the top element first" if not s.empty(): top = s.pop() print top print_stack_top_down(s) s.push(top) def print_stack_bottom_up(s): "Print a stack with the bottom element first" if not s.empty(): top = s.pop() print_stack_bottom_up(s) print top s.push(top)

Utskrift av stackar Tornen i Hanoi Problem: Flytta n skivor från den första pinnen till den tredje pinnen på ett sådant sätt att en större skiva aldrig ligger på en mindre. def movetower(n, fromp, top, withp): if n>0: moves = movetower(n-1, fromp, withp,top) moves += 1 print "Move disk from", fromp, "to", top moves += movetower(n-1, withp, top, fromp) return moves return 0

class Node... def preorder(self, l): l.append(self.item) if self.left!=none: self.left.preorder(l) if self.right!=none: self.right.preorder(l) def inorder(self, l): if self.left!=none: self.left.inorder(l) l.append(self.item) if self.right!=none: self.right.inorder(l)

class BinarySearchTree: def preorder(self): """Return a list of the nodes in preorder, i.e. if inserted they rebuild the tree""" l = [] if self.root!= None: self.root.preorder(l) return l def inorder(self): """Return a list of all nodes in inorder, i.e. the elements are sorted""" l = [] if self.root!= None: self.root.inorder(l) return l

Giriga algoritmer Divide and conquer Dynamisk programmering Tre specialfall: Giriga algoritmer - Välj det lokalt bästa i varje steg. Giriga algoritmer går ofta att skriva utan rekursion. Divide and conquer - Dela problemet i flera delproblem och lös varje delproblem för sig. Lös det ursprungliga problemet genom att kombinera lösningarna till delproblemen. Dynamisk programmering - Spara och återanvänd delresultat om samma delproblem uppstår flera gånger.

Giriga algoritmer Divide and conquer Dynamisk programmering class Sack: def init (self, name, value, weight): self.name = name self.value = float(value) self.weight = float(weight) def value_per_weight(sack1, sack2): if s1.value/s1.weight > s2.value/s2.weight: return -1 if s1.value/s1.weight < s2.value/s2.weight: return 1 return 0

Giriga algoritmer Divide and conquer Dynamisk programmering def fractional_knapsack(sacks, limit): """ Given a list of the total value and weight of each sack, find the maximal value we can get. """ sacks.sort(value_per_weight) total_value = 0 for s in sacks: if s.weight<=limit: print "Take", s.weight, "kg of", s.name total_value+=s.value limit=limit-s.weight else: print "Take", limit, "kg of", s.name total_value+=(s.value/s.weight)*limit limit = 0 break return total_value

Giriga algoritmer Divide and conquer Dynamisk programmering 1. Dela upp listan i två halvor 2. Sortera varje halva rekursivt 3. Sätt ihop de sorterade halvorna till en helt sorterad lista def merge_sort(l): """ Return a sorted copy of l """ if len(l)<=1: return l n=len(l) l1 = merge_sort(l[n//2:]) l2 = merge_sort(l[:n//2]) return merge(l1, l2)

Giriga algoritmer Divide and conquer Dynamisk programmering def merge(l1, l2): i=j=0 sorted = [] while i<len(l1) or j<len(l2): if i==len(l1): sorted.append(l2[j]) j = j+1 elif j==len(l2): sorted.append(l1[i]) i = i+1 elif l1[i]<l2[j]: sorted.append(l1[i]) i = i+1 else: sorted.append(l2[j]) j = j+1 return sorted

Giriga algoritmer Divide and conquer Dynamisk programmering def bin(n,k): "Computes the binomial coefficient n-choose-k" if k==0 or k==n: return 1 else: return bin(n-1, k) + bin(n-1, k-1) # Create a 2D square table with all elements 0 def bin(n,k): "Computes the binomial coefficient n-choose-k" if table[n][k]==0: if k==0 or k==n: table[n][k] = 1 else: table[n][k] = bin(n-1, k)+bin(n-1, k-1) return table[n][k]