CSC 430 Lecture1: Introduction and Python Primer

advertisement
CSC 430 Lecture1: Introduction
and Python Primer
Today’s Class
•
•
•
•
•
Syllabus
What is Algorithm Design?
A first algorithmic problem
Lessons Learned
Python Primer
What is Algorithm Design?
• Algorithm Design is the process of developing a
step-by-step process that solves a general class of
problems.
• Proper algorithm design includes:
– Careful statement of the problem, and what an
optimal (successful) solution looks like
– Thorough specification of the algorithm, including
data structures
– Accurate analysis of the algorithm’s speed (runtime)
– Proof of correctness that the algorithm always finds
the correct solution to a problem
Algorithm Design vs. Hacking
Hacking
1.
2.
3.
4.
5.
6.
7.
8.
Do your best to understand the
problem in a few minutes/hours.
Start writing code immediately.
Stop when it seems to work.
(Optional) Try to make it run
faster.
Fix it when it breaks, add a
special case routine.
Fix it when it breaks again.
Fix it when it breaks again.
…
Algorithm Design
1. Think critically about the
problem and how to solve it
optimally.
2. Spend as much time as
possible designing the
algorithm with pencil-andpaper.
3. If it can be solved, carefully
implement the algorithm,
avoiding programming bugs.
4. Never touch it again.
A First Problem: Stable Matching
• Problem: Given n men and n women, find a stable matching of
marriage partners, if it exists
– Participants rate members of opposite sex.
– Each man lists women in order of preference from best to worst.
– Each woman lists men in order of preference from best to worst.
– A matching is stable in the sense that:
• everyone has exactly one partner (a perfect matching)
• nobody is willing to change marriage partners
favorite
least favorite
favorite
least favorite
1st
2nd
3rd
1st
2nd
3rd
Xavier
Amy
Bertha
Clare
Amy
Yancey
Xavier
Zeus
Yancey
Bertha
Amy
Clare
Bertha
Xavier
Yancey
Zeus
Zeus
Amy
Bertha
Clare
Clare
Xavier
Yancey
Zeus
Men’s Preference Profile
5
Women’s Preference Profile
More on Matchings
Perfect Matching
• Finding these are easy for
this problem!
X
A
Y
B
Z
Stable Matching
• X Prefers B to A
• B Prefers X to Y
• Is the matching on the left
stable?
X
A
Y
B
Z
C
C
• Assume m == w then pick
pairs until everyone is
married
Brain Storm: How would you solve this
problem?
• Remove or add people from the list?
– Possible conflicts
• Think of it as a graph
– If there are unstable pairs, then fix them
favorite
least favorite
favorite
least favorite
1st
2nd
3rd
1st
2nd
3rd
Xavier
Amy
Bertha
Clare
Amy
Yancey
Xavier
Zeus
Yancey
Bertha
Amy
Clare
Bertha
Xavier
Yancey
Zeus
Zeus
Amy
Bertha
Clare
Clare
Xavier
Yancey
Zeus
Men’s Preference Profile
Women’s Preference Profile
Propose-And-Reject Algorithm
•Propose-and-reject algorithm. [Gale-Shapley 1962]
Intuitive method that guarantees to find a stable
matching.
Initialize each person to be free.
while some man is free and hasn't proposed to every woman:
Choose such a man m
w = 1st woman on m's list to whom m has not yet proposed
if w is free:
assign m and w to be engaged
else if w prefers m to her fiancé m‘:
assign m and w to be engaged, and m' to be free
else:
w rejects m
8
Proof of Correctness: Termination
•Observation 1. Men propose to women in decreasing order of preference.
•Observation 2. Once a woman is matched, she never becomes unmatched;
she only "trades up."
•Claim. Algorithm terminates after at most n2 iterations of while loop.
•Pf. Each time through the while loop a man proposes to a new woman.
There are only n2 possible proposals.
1st
2nd
3rd
4th
5th
1st
2nd
3rd
4th
5th
Victor
A
B
C
D
E
Amy
W
X
Y
Z
V
Wyatt
B
C
D
A
E
Bertha
X
Y
Z
V
W
Xavier
C
D
A
B
E
Clare
Y
Z
V
W
X
Yancey
D
A
B
C
E
Diane
Z
V
W
X
Y
Zeus
A
B
C
D
E
Erika
V
W
X
Y
Z
n(n-1) + 1 proposals required
9
Proof of Correctness: Perfection
•Claim. All men and women get matched.
•Pf. (by contradiction)
– Suppose, for sake of contradiction, that Zeus is not
matched upon termination of algorithm.
– Then some woman, say Amy, is not matched upon
termination.
– By Observation 2, Amy was never proposed to.
– But, Zeus proposes to everyone, since he ends up
unmatched. ▪
10
Proof of Correctness: Stability
•Claim. The GS algorithm will produce no unstable pairs.
•Pf. (by contradiction)
– Suppose Z-A is an unstable pair: each prefers each other to partner in
Gale-Shapley matching S*. There are two ways that this can occur:
– Case 1: Z never proposed to A.
 Z prefers his GS partner to A.
 Z-A is stable.
men propose in decreasing
order of preference
– Case 2: Z proposed to A.
 A rejected Z (right away or later)
 A prefers her GS partner to Z.
 Z-A is stable.
Yancey-Amy
Zeus-Bertha
...
women only trade up
– In either case A-Z is stable, a contradiction. ▪
11
S*
Summary
•Stable matching problem. Given n men and n
women, and their preferences, find a stable
matching if one exists.
•Gale-Shapley algorithm. Guarantees to find a
stable matching for any problem instance.
•We have only done specification and proof of
correctness; runtime analysis covered next class.
12
PYTHON PRIMER
Python is…
• Easy to learn
• Interpreted, not compiled
• Good for:
– Scripting
– Rapid application development
– Scientific computing
•
•
•
•
•
A bracket-and-semicolon-free language(!)
Includes several useful built-in types
Very high-level
Similar to writing pseudocode
Really fun to code in
The Basics
• There are three ways to run python:
– Interactively in the interpreter program
– As a command-line script
– As an executable script
• Mostly, you’ll stick with the interpreter, unless
you are writing a real-world application
• You can try out _any_ language feature in the
interpreter, without ever creating a file
Starting the Interpreter on Moe
• You all have accounts on moe.bw.edu
• Talk to me after class if you are not
comfortable with logging in
• Once logged in, type ‘python3’ at the prompt
• Installing python on your own computer is
easy, and recommended.
Running Code in Python
• Whether you use the interpreter, or a source file,
Python will execute the code one line at a time,
storing the result in memory and producing
output if required.
• Python programs end in the extension .py
• To import foo.py in the interpreter:
>>>import foo
• To reload a module in Python interpreter:
>>> from imp import reload
>>> reload(foo)
Steps to Learning a Programming
Language
1.
2.
3.
4.
5.
6.
7.
8.
Write Hello World!
Learn the basic syntax
Learn about the primitive types
Learn to create/manipulate strings
Learn how to do arithmetic
Learn Flow control
Learn how to write a function
Learn at least one cool/unique thing about this
language
Your First Program
• No matter what language it is, the first
program you’ll always write in it is the hello
world application
• This is because a program is useless unless it
can create output!
• In Python 3:
print("Hello world!")
Syntax Example
x = 5
i = 5
#comments start with #
if x == i :
print(“x is equal to “ + i)
else:
print(“x was not equal to “ + i)
• No curly brackets
– New scope indicated with a colon
– Scope is determined by indentation
• No semi colons
– Lines are ended by a newline (imagine that!)
– If you want to continue a line, just add a backslash:
print(“x is equal \
to “ + i)
• Parentheses are optional, except when calling functions
Declaring Variables
• You don’t!
• Variables are created when they are first given
a value.
• You cannot refer to a variable until it has been
assigned
• Python types are dynamic, but strongly-typed
– Variables get their type at time of assignment
– Once assigned, they must be treated like the
expected type, or an exception will occur
The Primitive Types
• Python simplifies primitive types from what
you are used to:
– Integers
– Floats (double precision)
– Complex numbers (if you care)
– strings (no chars)
– Booleans:
• False = {False, None, anything equal to 0,any empty
container}
• True = {True, and anything not listed above}
Creating and Manipulating Strings
• String literals are:
– Concatenated with the + operator:
>>> S = “he” + “llo”
>>>S
‘hello’
– Indexable:
>>> S[1]
‘e’
– Slice-able
>>> S = “hello”
>>> S[1:4]
‘ell’
– Immutable
>>> S[1] = “G”
ERROR
– There is a lot more to learn about strings! Check the python documentation.
Arithmetic
• Arithmetic is greatly simplified in
python 3.0
• Resulting type is the most
complicated type in the
expression:
– 2+2=4
– 2.0 + 2 = 4.0
• Operators: {+ - * / % // **}
• Ints, floats evaluated like a
mathematician would do it:
•
•
•
•
•
•
7.5 + 7 = 14.5
7–6=1
5 * 5 = 25
3.5/2 = 1.75
5%2=1
5 / 2 = 2.5
• ** is the power operator:
• 3**2 = 9
• 4**.5 = 2.0
• 27**(1/3) = 3
• // is the integer division operator
(sort of)
– Actually, it rounds down the result
of the division operator toward
minus infinity
– 5//2 = 2
– 3.5//2 = 1.0
– -3//2 = -2
• Good rule to follow: for basic
things you do, python will mostly
do what you expect, but be
careful if doing something out of
the ordinary
Flow Control
• if/else/elif:
if x == 1:
print(“1”)
elif x == 2:
print(“2”)
elif x == 3:
print(“3”)
else:
print(“invalid”)
• While loops:
x = 0
while x < 5:
x += 1
• For loops:
– Iterate over a sequence, not
counting based
x = [1,2,3,4,5]
for num in x:
print(num)
– To iterate over indices, use
range(start = 0,finish)
for i in range(len(x)):
print(x[i])
• There is more you can read
about:
–
–
–
–
break
continue
pass
else clauses on loops
Writing Functions
def foo(arg1,arg2,arg3):
return arg1/arg2 + arg3
• No return type specified
– But all functions have a return value
• Returns ‘None’—python’s version of Null—for void functions
• All other basic mechanics should be familiar to
you, but you might want to learn about the really
cool function calling features in python
Some Cool Python Features
• Lists:
>>> L = [1,2,3,4,5]
>>>L[2]
3
>>>L[2:4]
[3,4,5]
• List Comprehensions:
>>> L2 = [x**2 for x in L]
>>> L2
[1,4,9,16,25]
• Tuples—Immutable lists
>>> x1 = (1,2)
>>> x2 = (5,6)
#Assignment can be done in pairs
>>> x,y = x1
• Dictionaries
>>>D = {}
>>>D[“Ohio”] = “Columbus”
>>>D[“Iowa”] = “DesMoines”
• Reading from a file is easy:
f = open(‘foo.txt’,”r”)
#looks like C, doesn’t
it?
for line in f:
print(line)
More on Lists
• For a list L:
– L = [] creates an empty list
– L = [1,2,3] to initialize with values.
• Items can be a variable: L = [1,x,3]
• Lists can be nested: L = [1, [2,3], 4] (can use to make 2D
arrays)
– L.append(X) appends a single item
– L.extend(L2) adds all items in L2 as items at the end of L
– L1 + L2 produces the same result as L1.extend(L2) without
changing L1
– Use len(L) to get the length
– There is support for negative indexing:
• Using L above, L[-1] evaluates to 3
Slicing
• Many high-level languages include support for list
slicing:
– List slices are lists themselves
– Use a colon to indicate a range:
• L[2:8] is a sub-list including indexes 2 – 7
– Leaving numbers out defaults to the beginning/end:
• L[:len(L)//2] is the first-half of a list
• L[len(L)//2:] is the second half
– Negatives allowed here too
• X = “dropExtension.doc”
• X[:-4] evaluates to “dropExtension”
Download