DIGI111-Algorithms and Programming

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 84

Hva er algoritmer?

Hva er programmering?
programmtekst
Språk
class HelloWorld
Java: {
public static void main(String args[])
{
System.out.println("Hello, World");
}
}

Piet:

brainf***: ++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Python: print("Hello, World")

https://en.wikipedia.org/wiki/Esoteric_programming_language
Programmering

• Verktøy: editor, filhandtering, kjøring

• Språk: regler, strukturer

• Design: omsetning av problemstilling; gode/dårlige løsninger

• Biblioteker man kan bruke


Hvorfor Python?

• enkel syntaks, lett å lære

• raskt fremskritt fra skisse til brukbart program

• enkelt å visualisere data

• mest brukt språket i forskning i mange ulike felt

• stort utvalg av nyttige biblioteker


Setning
(Statement)

a = 7 - 5

Variabel Uttrykk (Expression)



(navn kan velges fritt) beregnes først

Expression / Uttryk Value / Verdi

tilordning
 12 12

(assignment) 3.56 3.56

“Hei” “Hei”

13.2 + 17.2 - 2.4 28.0

5**3 - 5**2 100

11 % 3 2

“ABC” + “xyz” “ABCxyz”

Det finnes andre setninger enn


tilordninger: 

if-setninger, for-løkker, funksjoner, ...
print / input / len
Viktig: gode variabelnavn

length = 5.0
width = 2.0
height = 1.2
volume = length * width * height

a = 5.0
b = 2.0
c = 1.2
d = a * b * c

bird = 5.0
yellow = 2.0
water = 1.2
duck = yellow * water * bird
Betingelser / Conditionals
if elif else
n = input("A number: ")
n = int(n)

if n > 100:
print('Yay!')
print('You know big numbers')

print('Bye bye')

A number: 16435
A number: 7 Yay!
Bye bye You know big numbers
Bye bye
Betingelser / Conditionals
if elif else
alle uttryk som har
bool verdi (True/False)
kan stå her

if True / False
:
4 kun hvis True
4 kun hvis True
4 kun hvis True
resten av programmet
resten av programmet
if True / False
:
4 kun hvis True
4 kun hvis True
4 kun hvis True
else:
4 kun hvis False
4 kun hvis False
4 kun hvis False
resten av programmet
resten av programmet
if True / False
:
4 kun hvis True
n = input("A number: ")
n = int(n)
4
if
kun
n > 100:
hvis True
4 kun hvis
print('Yay!') True
print('You know big numbers')
else:else:
print("That’s quite small!")

4 kun hvis False


print('Bye bye')

4 kun hvis False


4 kun hvis False
A number: 7
That’s quite small!
restenBye
avbye
programmet
resten av programmet
if True / False
1 :
4 kun hvis True1
4 kun hvis True1
elif True / False
2
:
4 kun hvis False1 True2
elif True / False
3
:
4 kun hvis False1,2 True3
else:
4 kun hvis alle False
tekst = 'Det var en gang...'

tekst = 'Det var en gang...'


if 'a' in tekst:
print('Aaaah!')
if 'a' in tekst:
elif ' ' in tekst:
print('Aaaah!')
print('Space')
if ' ' in tekst:
elif 'z' in tekst:
print('Space')
print('Zzz Zzz')
if 'z' in tekst:
elif '.' in tekst:
print('Zzz Zzz')
print('Dots...')
if '.' in tekst:
print('Dots...')
Aaaah!
Aaaah!
Space
Dots...
Løkker / Loops — while
s = 2 i = 0
tekst = 'Hei'
while s < 1000:
print(s) while i < 3:
s = 2 * s print(tekst)
i = i+1
2
4 Hei
8 Hei
16 Hei
32
64
128
256
512
Løkker / Loops — while

alle uttryk som har


bool verdi (True/False)
kan stå her

while True / False


:
4 så lenge True
4 så lenge True
4 så lenge True
resten av programmet
resten av programmet
Løkker / Loops — for
for x in "hei":
print(x)
print(f'*{x}*')
print('---')

h
*h*
---
e
*e*
---
i
*i*
---
Løkker / Loops — for

range(4)


for variable
in "xyzq"
[ A, B, C, D ] :
4 for hvert element
4 4x for hvert element
4 for hvert element
resten av programmet
resten av programmet
Funksjoner / functions
def doublesum(x,y,z):
Funksjonsdefinisjon
return 2*(x+y+z)

abc = doublesum(5,7,1) Funksjonskall


print(abc)

xyz = doublesum(3,2,1) Funksjonskall


print(xyz)

26
12
def ( ):
input
navn
A, B, C, D

4 gjør noe
4 gjør noe
4
return resultat

resten av programmet
x = navn (3,4,5,6)
def ( ):
input
navn
A, B, C, D

4 gjør noe
4 gjør noe
4
return resultat

resten av programmet
x = navn (3,4,5,6)
resultat
Processor,
Program
Memory

Terminal,
 Storage, files


input/output

Physical connection Communication flow


Virtual terminal Program Program

Operating system

Processor,
Memory

Terminal,
 Storage, files


input/output
Source code
Python source
C
om
pi
le
r

Hello program Python interpreter

Operating system

Processor,
Memory

Terminal,
 Storage, files


input/output
x = "Hello"
score = 10

if 'e' in x:
score = score + 1
-33
if len(x) == 5:
score = -3 * score

print(score)
a = 5
b = 7
while a < b: 12
c = a + b
print(c)
8
b += 2 17
a += 3
print(a)
11
Funksjoner / functions
Expression / Uttryk Value / Verdi

len("Hei") 3

math.sqrt(2) 1.4142

abs(-3.2) 3.2

max(3,7) 7

float("55") 55.0

resultat /

navn argument /

verdi
parameter
Funksjoner / functions
def doublesum(x,y,z):
Funksjonsdefinisjon
return 2*(x+y+z)

abc = doublesum(5,7,1) Funksjonskall


print(abc)

xyz = doublesum(3,2,1) Funksjonskall


print(xyz)

26
12
programmflyt
def ( ):
input
navn
A, B, C, D

4 gjør noe
4 gjør noe
4
return resultat

resten av programmet
x = navn (3,4,5,6)
def
def ( ):
input
navn
A, B, C, D

4 gjør noe
4 gjør noe
4
return resultat

resten av programmet
x = navn (3,4,5,6)
resultat
Scope
def doublesum(x,y,z):
tmp = x+y+z lokale variabler, kun i funksjonen
return 2*tmp

x = 5
globale variabler
tmp = 7

ds = doublesum(1,1,1)
def doublesum(x,y,z):
print(x,tmp,ds) global tmp
tmp = x+y+z
return 2*tmp
5 7 6
x = 5
tmp = 7

ds = doublesum(1,1,1)

print(x,tmp,ds)

5 3 6
def doublesum(x,y,z):
sum = x+y+z
return 2*sum

abc = doublesum(5,7,1) foo = doublesum('ab','xz','d')


print(abc) print(foo)
26 abxzdabxzd

(VScode demo: program flow, nested calls)


Funksjoner / functions
Expression / Uttryk Value / Verdi

len("Hei") 3

math.sqrt(2) 1.4142

abs(-3.2) 3.2

max(3,7) 7

float("55") 55.0

print("hei") None (men skriver noe)

turtle.left(20) None (men snur turtle)


a = 5
b = 7
while a < b: 12
c = a + b
print(c)
8
b += 2 17
a += 3
print(a)
11
def add(a,b)
a += b
return a

def subtract(a,b):
a += b
return a 17
15
y = add(12,3)
x = subtract(10,7)
print(x)
print(y)
list / [… , … , … , …]
x = [ 5, 7, 3, 8 ]
y = [ 1, 3.141, 'hei', True ]
Expression / Uttryk Value / Verdi
[ ] []
[1] [1]
x [5,7,3,8]
x.append(99)
x [5,7,3,8,99]
[1,2] + [5,6] [1,2,5,6]
len(y) 4
y[2] 'hei'
y[1:3] [3.141,'hei']
list-funksjoner
• https://docs.python.org/3/tutorial/
datastructures.html#more-on-lists

list.append(x) list.index(x)
list.extend([3,4,5]) list.count(x)
list.insert(i,x) list.sort()
list.remove(x) list.reverse()
list.pop() list.copy()
list.clear()
nyttige string-funksjoner
• str.split(sep) -> liste av ord, kan angi sep, f.eks. '\n' ','

a = """Many
different
lines 'Many\ndifferent\nlines'
"""
b = a.split() ['Many', 'different', 'lines']

• 'tekst'.join(liste) -> bruker tekst som forbindelse

a = ['en', 'to', 'tre']


b = '=='.join(a) 'en==to==tre'
c = ''.join(a) 'entotre'
"""en
d = '\n'.join(a) 'en\nto\ntre' to
tre"""
dict: dictionary { a:x, b:y, c:z }
• https://docs.python.org/3.7/tutorial/
datastructures.html#dictionaries

• Key - Value pairs

tlf = {
'Armin' : 3542,
'Mikasa' : 1234,
'Eren' : 5125,
}

tlf['Eren'] 5125

tlf['Levi'] = 4545

'Eren' in tlf True

tlf.keys() dict_keys(['Armin', 'Mikasa', 'Eren', 'Levi'])


tlf.values() dict_values([3542, 1234, 5125, 4545])

tlf.items()
dict_items([('Armin', 3542), ('Mikasa', 1234), ('Eren',
5125), ('Levi', 4545)])
dict: dictionary { a:x, b:y, c:z }
• bruk i løkker: dict_items([('Armin', 3542), ('Mikasa', 1234),
('Eren', 5125), ('Levi', 4545)])

for navn, num in tlf.items():


print(navn,’—-',num)

Armin —- 3542
Mikasa —- 1234
Eren —- 5125
Levi —- 4545
File I/O
• open(filename, mode) mode: read, write, append

with open(“some.txt”,”r”) as f:
all_in_one = f.read()

with open(“another.txt”,”r”) as f:
list_of_lines = f.readlines()

with open(“third.txt”,”r”) as f:
for line in f:
one_line = line
File I/O
• open(filename, mode) mode: read, write, append

out = "Hello, how are you?"


with open(“hello.txt”,”w”) as f:
f.write(out)
f.write('\n')

in = ‘inputdata.txt’
out = ‘reverse.txt’

with open(in,’r’) as fi, open(out,’w’) as fo:


for line in fi:
outline = line[::-1] # reverse
fo.write(outline)
Løsningseksempel
ord i alice.txt
• Les inn alice.txt og 

tell hvor mange ganger hvert ord finnes i teksten

• Begynn med et tomt dict: antall={ }

with open('alice.txt') as f:
for line in f:
line = line.split()

Løsningseksempel
bokstaver i alice.txt
• Les inn alice.txt og 

tell hvor mange ganger hver bokstav finnes i teksten

• Bruk et dict: f.eks. antall={ 'a':0, 'b':0, …}

with open('alice.txt') as f:
for line in f:
for bokstav in line:

import og modules
# helpers.py

def spam(x):
s = 'spam'
return f'{s}, {s}, {s}, {x} and {s}.'

N_A = 6.02214e+23

# work1.py

import helpers # work2.py

a = helpers.N_A import helpers as h


b = helpers.spam('eggs’)
a = h.N_A
b = h.spam('eggs’)

# work3.py
# work4.py
from helpers import N_A, spam
from helpers import N_A as L, spam as foo
a = N_A
b = spam('eggs’) a = L
b = foo('eggs’)
import og modules
# helpers.py

def spam(x):
s = 'spam'
return f'{s}, {s}, {s}, {x} and {s}.'

N_A = 6.02214e+23

(lokalt) helpers math <- namespace


import helpers
import math a N_A sin()
b spam() pi
a = helpers.N_A c cos()
b = helpers.spam('eggs’) d sqrt()
c = 27 e …
d = math.sin(math.pi) …
e = a + c + d …

(lokalt)
from helpers import N_A N_A
from math import sin,pi sin
ikke
pi
a = N_A
a
tilgjengelig
c = 27
d = sin(pi) c
e = a + c + d d
e
Standard Library
Stor utvalg:
Regular expressions, difflib, textwrap

datetime, calendar

synchronized queue
copy

math, decimal, fractions, random

os.path, stat, tempfile, shutil

pickle, sqlite3, zlib, bz2, tarfile, csv

Markup, internet protocols, multimedia, debugging, ...


https://docs.python.org/3/library
math
import math

! 3oor, ceil

! exp, log, log2, log10

! pow, sqrt

! sin, cos, tan

! pi, e
fractions
from fractions import Fraction
Fraction(16, -10)
Fraction(123)
Fraction()
Fraction('3/7')
Fraction(' -3/7 ')
Fraction('1.414213 \t\n')
Fraction('-.125')
Fraction('7e-6')
x = Fraction(3,4) + Fraction(1,6)
Fraction(2.25)
x
Fraction(1.1)
x.numerator
x.denominator

from math import pi


Fraction(pi)
Fraction(pi).limit_denominator(100)
Fraction(pi).limit_denominator(50)
datetime
from datetime import date
today = date.today()
my_birthday = date(today.year, 6, 24)

if my_birthday < today:


my_birthday = my_birthday.replace(year=today.year + 1)

time_to_birthday = abs(my_birthday - today)


print(time_to_birthday)

from datetime import datetime


now = datetime.now()
exam = datetime(2020, 5, 28, 9, 0, 0)
print(exam - now)

calendar
import calendar
calendar.prmonth(2020,02)
random
import random
# random.seed(123456) # reproduserbare resultater

random.randint(1,6) # 1 <= N <= 6

random.choice('abcdef')
random.choice([11, 7.2, 'foo'])
random.choices('abcdefghi', k=100)

random.sample('abcdefghi', k=3)

random.random() # [0.0, 1.0)


random.uniform(12.0, 20.0) # 12.0 <= N <= 20.0

random.gauss(mu=40.0,sigma=12.0)
matplotlib
matplotlib
https://matplotlib.org/

! eksternt bibliotek, ikke en del av standard-Python

! installer med f.eks.


$ python -m pip install --user matplotlib

! eller kjør install.py fra mitt.uib i VSCode

import matplotlib.pyplot as plt


matplotlib bar chart
import matplotlib.pyplot as plt

plt.bar([3, 7, 9], [10, 20, 17])


plt.show()
matplotlib.pyplot
https://matplotlib.org/tutorials/introductory/pyplot.html

import matplotlib.pyplot as plt

! bar()
! plot()
! title(), xlabel(), ylabel()
! label=… plt.legend()
! axis(), xlim(), ylim()
! subplot()
! show(), saveMg()
matplotlib gallery
https://matplotlib.org/gallery/index.html
input / print
True / False

betingelser: if

løkker: for, while

datastrukturer: list, ...


For å løse et problem:

finne mindre steg, der vi kan bruke strukturene

finne enklere spørsmål som allerede har en løsning

Standard-algoritmer for bla.


sortering, grafer, søk, ...

Ulike datastrukturer:
list, set, numpy-array, ...
xs = [2, 7,5,1,4,3,6,8]

while not is_sorted(xs):


random.shuffle(xs)
O(N N!)

Scaling behaviour with size N of problem set:


O(1) - constant time independent of N
O(N) - linear with N
O(N2) - quadratic in N
Insertion sort
O(N2)

2 7 5 1 4 3 6 8

2 5 7 1 4 3 6 8

1 2 5 7 4 3 6 8

1 2 4 5 7 3 6 8

1 2 3 4 5 7 6 8

1 2 3 4 5 6 7 8
Merge Sort
2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8
Merge Sort
2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8

merge

2 7 5 1 4 3 6 8
Merge Sort
2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8

2 7 1 5 4 3 6 8

merge merge

2 7 5 1 4 3 6 8
Merge Sort
2 7 5 1 4 3 6 8

1 2 5 7 4 3 6 8

merge

2 7 1 5 4 3 6 8

merge merge

2 7 5 1 4 3 6 8
Merge Sort
2 7 5 1 4 3 6 8

1 2 5 7 3 4 6 8

merge merge

2 7 1 5 3 4 6 8

merge merge merge merge

2 7 5 1 4 3 6 8
Merge Sort O(N log N)
1 2 3 4 5 6 7 8

merge

1 2 5 7 3 4 6 8

merge merge

2 7 1 5 3 4 6 8

merge merge merge merge

2 7 5 1 4 3 6 8

15 Sorting Algorithms in 6 Minutes


http://youtu.be/kPRA0W1kECg
What are we optimizing?
Time
Memory
Disk
Electricity
Compile time
Ease of use
Ease of deployment
Ease of development
L1 cache reference ......................... 0.5 ns

Branch mispredict ............................ 5 ns

L2 cache reference ........................... 7 ns

Mutex lock/unlock ........................... 25 ns

Main memory reference ...................... 100 ns

SSD random read ........................ 150,000 ns = 150 µs

Read 1 MB sequentially from memory ..... 250,000 ns = 250 µs

Read 1 MB sequentially from SSD ..... 1,000,000 ns = 1 ms

Disk seek ........................... 10,000,000 ns = 10 ms

Read 1 MB sequentially from disk .... 20,000,000 ns = 20 ms

Send packet EU->US->EU .... 150,000,000 ns = 150 ms


L1 cache reference 0.5 s

Branch mispredict 5s

L2 cache reference 7s

Mutex lock/unlock 25 s

Main memory reference 100 s

SSD random read 1.7 days

Read 1 MB sequentially from memory 2.9 days

Read 1 MB sequentially from SSD 11.6 days

Disk seek 16.5 weeks

Read 1 MB sequentially from disk 7.8 months

Send packet EU->US->EU 4.8 years


Python profiling options
from time import time
time start = time()
somefunc(27)
end = time()

timeit python -m timeit -s ‘import myfile as m;


x=27’ ‘m.somefunc(x)’

import cProfile pyprof2calltree


cProfile cProfile.run(somefunc(27)) qcachegrind

All are in the standard library


bool: True / False
> < >= <= == in

Expression / Uttryk Value / Verdi


True True
False False
4 == 5 False
66 == 66 True
45 > 33 True
2.9 < 2.7 False
"Abcd" < "Abcz" True
"ask" in "oppvask" True
0.1 + 0.2 == 0.3 False !!!
https://www.exploringbinary.com/why-0-point-1-does-not-exist-in- oating-point/
fl
bool: True / False
and or not

Expression / Uttryk Value / Verdi


not True False
True or False True
True and False False
5 > 8 or 12 < 25 True
4 < 8 and 7 == 9 False
bool("abcdef") True
bool(35) True
bool("") False
bool(0) False
hva er et bedre navn til funksjonen?

def foobar(navn):
x = f"Hei, {navn}!"
return x

hva er et bedre navn til funksjonen?


def foo(n):
for i in range(1, n+1):
print('*' * i)
text = "Hello"
for n in text:
print(3 * n) hvor ofte kjører løkken?

x = 1
while x < 100: hvor ofte kjører løkken?
print(x)
x = 2 * x hva printes i terminalen?
from datetime import date
today = date.today()
my_birthday = date(today.year, 6, 24)

if my_birthday < today:


my_birthday = my_birthday.replace(year=today.year + 1)

time_to_birthday = abs(my_birthday - today)


print(time_to_birthday)

Tilpass programmet slik at brukeren blir spurt om


bursdagens dato med input. Så skal my_birthday bruke den

You might also like