Download session5

Document related concepts

Comparison of programming languages (associative array) wikipedia , lookup

Array data structure wikipedia , lookup

Transcript
Gentle
Introduction to
Programming
Session 5: Sorting, Searching, TimeComplexity Analysis, Memory Model,
Object Oriented Programming
1
Admin.
• Please come on time after the first break
• Who goes to the Mathematics' summer introduction
course?
2
Review
• Recursive vs. Iterative
• Guest lecture: Prof. Benny Chor
• Arrays
• Arrays in memory
• Initialization and usage
• foreach, filter
• Arrays as functions arguments
• Multi-dimensional arrays
• References to array
• Sorting, searching
• Binary search
3
Today
• Home work review
• Sorting, searching and time-complexity analysis
• Binary search
• Bubble sort, Merge sort
• Scala memory model
• Object-oriented programming (OOP)
• Classes and Objects
• Functional Objects (Rational Numbers example)
• Home work
4
Decimal  Binary
• We want to print the binary representation of a
decimal number
• Examples:
•
•
•
•
0 -> 0
8 -> 1000
12 -> 1100
31 -> 11111
Decimal  Binary Recursively
• The conversion of a number d from decimal to
binary:
•
•
•
•
If d is 0 or 1 – write d to the left and stop, else:
If d is even, write ‘0’ to the left
If d is odd, write ‘1’ to the left
Repeat recursively with floor(d/2)
Example: d = 14
d
Output at the
end of stage
Action at the end of stage
14
0
Insert 0 to left of output; divide d by 2
7
10
Insert 1 to left of output; divide d by 2
and round down
3
110
Insert 1 to left of output; divide d by 2
and round down
1
1110
Insert 1 to left of output; return.
Solution
Dec2Bin.scala
Exercise 1
Write a program that gets 10 numbers from the user.
It then accepts another number and checks to see if
that number was one of the previous ones.
Example 1:
Please enter 10 numbers:
1 2 3 4 5 6 7 8 9 10
Please enter a number to search for: 8
Found it!
Example 2:
Please enter 10 numbers:
1 2 3 4 5 6 7 8 9 10
Please enter a number to search for: 30
Sorry, it’s not there
9
Solution
FindNumber.scala
10
Exercise 2
• Implement a function that accepts two integer
arrays and returns true if they are equal, false
otherwise. The arrays are of the same size
• Write a program that accepts two arrays of
integers from the user and checks for equality
11
Solution
CompareArrays.scala
12
Solution (main)
CompareArrays.scala
13
Today
• Home work review
• Sorting, searching and time-complexity analysis
• Binary search
• Bubble sort, Merge sort
• Scala memory model
• Object-oriented programming (OOP)
• Classes and Objects
• Functional Objects (Rational Numbers example)
• Home work
14
Sort
• We would like to sort the elements in an array
in an ascending order
7 2 8 5 4
sort
2 4 5 7 8
15
What is Sorting Good For?
• Finding a number in an array
• Consider a large array (of length n) and
multiple queries on whether a given number
exists in the array (and what is its position in it)
• Naive solution: given a number, traverse the
array and search for it
• Not efficient ~ n/2 steps for each search operation
• Can we do better?
• Sort the array as a preliminary step. Now search can
be performed much faster!
16
Binary Search
• Input:
• A sorted array of integers A
• An integer query q
• Output:
• -1 if q is not a member of A
• The index of q in A otherwise
• Algorithm:
•
•
•
•
Check the middle element of A
If it is equal to q, return its index
If it is >= q, search for q in A[0,…,middle-1]
If it is < q, search for q in A[middle+1,...,end]
17
Example
index
0
1
2
3
4
5
6
7
8
9
value
-5
-3
0
4
8
11
22
56
57
97
http://www.youtube.com/watch?v=ZrN6J8No080
18
Code – Binary Search
19
Code – Usage
20
So, How Fast is it?
• Worst case analysis
• Size of the inspected array:
n  n/2  n/4  …..  1
• Each step is very fast (a small constant number
of operations)
• There are log2(n) such steps
• So it takes ~ log2(n) steps per search
• Much faster then ~ n
21
Bubble Sort
22
Bubble Sort Example
7 2 8 5 4
2 7 5 4 8
2 5 4 7 8
2 4 5 7 8
2 7 8 5 4
2 7 5 4 8
2 5 4 7 8
2 4 5 7 8
2 7 8 5 4
2 5 7 4 8
2 4 5 7 8
2 7 5 8 4
2 5 4 7 8
(done)
2 7 5 4 8
23
Another Example
http://www.youtube.com/watch?v=myKlT30nl5Y
24
Bubble Sort
25
Orders of Growth
• Suppose n is a parameter that measures the size
of a problem (the size of its input)
• R(n) measures the amount of resources needed
to compute a solution procedure of size n
• Two common resources are space, measured
by the number of deferred operations, and time,
measured by the number of primitive steps
The worst-case over all
inputs of size n!
26
Orders of Growth
• Want to estimate the “order of growth” of R(n):
R1(n)=100n2
R2(n)=2n2+10n+2
R3(n) = n2
Are all the same in the sense that if we
multiply the input by a factor of 2, the
resource consumption increases by a
factor of 4
Order of growth is proportional to n2
27
Summary
• Trying to capture the nature of processes
• Quantify various properties of processes:
• Number of steps a process takes (Time Complexity)
• Amount of Space a process uses (Space Complexity)
• You will encounter these issues in many courses
throughout your studies
• We shall focus on the (intuitive) time complexity
analysis of various sorting algorithms
28
Examples
• Find a maximum in a general array
• Find the maximum in a sorted array
• Find the 5th largest element in a sorted array
• Answer n Fibonacci quarries, each limited
by MAX
• Find an element in a general array
• Find an element in a sorted array
29
Bubble Sort Time Complexity
Array of size n
n iterations
i iterations
constant
(n-1 + n-2 + n-3 + …. + 1) * const ~ ½ * n2
30
The Idea Behind Marge Sort
• A small list will take fewer steps to sort than
a large list
• Fewer steps are required to construct a
sorted list from two sorted lists than two
unsorted lists
31
Marge Sort Algorithm
• If the array is of length 0 or 1, then it is
already sorted. Otherwise:
• Divide the unsorted array into two subarrays of about half the size
• Sort each sub-array recursively by reapplying merge sort
• Merge the two sub-arrays back into one
sorted array
32
Merge Sort Example
http://en.wikipedia.org/wiki/Merge_sort
33
Marge Sort Time Complexity
•
•
•
•
If the array is of length 0 or 1, then it is already sorted. Otherwise:
Divide the unsorted array into two sub-arrays of about half the size
Sort each sub-array recursively by re-applying merge sort
Merge the two sub-arrays back into one sorted array
n + 2 * (n/2) + 22 * n/22 + 23 * n/23 + … + 2log(n) * n/2log(n) =
n + n + … + n = n * log(n)
log(n)
34
Today
• Home work review
• Sorting, searching and time-complexity analysis
• Binary search
• Bubble sort, Merge sort
• Scala memory model
• Object-oriented programming (OOP)
• Classes and Objects
• Functional Objects (Rational Numbers example)
• Home work
35
Passing Arguments to Functions
• When a function is called, arguments’ values
are attached to function’s formal parameters
by order, and an assignment occurs before
execution
• Values are copied to formal parameters
• “Call by value”
• Function’s parameters are defined as vals
36
Passing Arguments to Functions
•
•
•
•
A reference is also passed by value
Example: arrays
Objects (?)
This explains why we can change an array’s
content within a function
a
4
5
6
7
8
9
37
Local Names
• Arguments names do not matter!
• Local variable name hides in-scope variables
with the same name
Different x!
38
Everything is an Object (in Scala)
•
•
•
•
In Java: primitives vs. objects
In Scala everything is an Object
But: special treatment for primitives
Why do we care?
val x = 5
var y = x
y = 6
?
val ar1 = Array(1,2,3)
val ar2 = ar1
ar2(0) = 4
39
?
val x = 5
var y = x
y = 6
val ar1 = Array(1,2,3)
val ar2 = ar1
ar2(0) = 4
40
Memory Image 1
val x = 5
var y = x
y = 6
x
5
y
5
6
41
Memory Image 2
val ar1 = Array(1,2,3)
val ar2 = ar1
ar2(0) = 4
ar1
1 2 3
4
ar2
42
Scala Memory Model
• Based on Java…
• Stack: local variables and arguments, every
function uses a certain part of the stack
• Stack variables “disappear” when scope ends
• Heap: global variables and object, scope
independent
• Garbage Collector
• Partial description
43
How to Change a Variable via
Functions?
• The arguments are passed as vals thus can not
be changed
• So how can a method change an outer
variable?
• By its return value
• By accessing heap-based memory (e.g., arrays)
44
Today
• Home work review
• Sorting, searching and time-complexity analysis
• Binary search
• Bubble sort, Merge sort
• Scala memory model
• Object-oriented programming (OOP)
• Classes and Objects
• Functional Objects (Rational Numbers example)
• Home work
45
Programming in Scala
Chapter 4: Classes and Objects
Chapter 6: Functional Objects
46
Singletone Objects
• All programs written so far in this course are
Signletone objects
• File start with the reserved word object
• Contain functions that can be used elsewhere
• Application: singeltone object with a main
function
• (Actually singeltone objects are more then that)
• (Java programmers: think of it as a holder of static
methods)
47
A Car
• How would you represent a car?
• Parts / features: 4 wheels, steering wheel, horn,
color,…
• Functionality: drive, turn left, honk, repaint,…
• In Scala???
48
Object-Oriented Programming
(OOP)
• Represent problem-domain entities using a
computer language
• When building a software in a specific domain,
describe the different components of the domain
as types and variables
• Thus we can take another step up in abstraction
49
Class as a Blueprint
A class is a blueprint of objects
50
Class as a Blueprint
A class is a blueprint of objects
51
Classes as Data Types
• Classes define types that are a composition of
other types and have unique functionality
• An instance of a class is named an object
• Every instance may contain:
• Data members / fields
• Methods
• Constructors
• Instances are accessed only through reference
52
Examples
• String
• Members: all private
• Methods: length, replace, startsWith, substring,…
• Constructors: String(), String(String),…
• http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html
• Array
• Members: all private
• Methods: length, filter, update,…
• Constructors: initiate with 1-9 dimensions
• http://www.scala-lang.org/docu/files/api/scala/Array.html
53
Car Example
• Members: 4 wheels, steering wheel, horn, color,…
• Every car instance has its own
• Methods: drive, turn left, honk, repaint,…
• Constructors: Car(String color),
Car(Array[Wheels], Engine,…), …
54
Today
• Home work review
• Sorting, searching and time-complexity analysis
• Binary search
• Bubble sort, Merge sort
• Scala memory model
• Object-oriented programming (OOP)
• Classes and Objects
• Functional Objects (Rational Numbers example)
• Home work
55
Rational Numbers
• A rational number is a number that can be
expressed as a ration n/d (n,d integers, d not 0)
• Examples: 1/2, 2/3, 112/239, 2/1
• Not an approximation
56
Specification
• Add, subtract, multiply, divide
• println should work smoothly
• Immutable (result of an operation is a new rational number)
• It should feel like native language support
57
Constructing a Rational
• How client programmer will create a new
Rational object?
Class parameters
58
Constructing a Rational
• The Scala compiler will compile any code placed in
the class body, which isn’t part of a field or a method
definition, into the primary constructor
?
59
Reimplementing toString
• toString method
• A more useful implementation of toString would
print out the values of the Rational’s numerator and
denominator
• override the default implementation
60
Usage
• Now we can remove the debug println…
61
Checking Preconditions
• Ensure the data is valid when the object is
constructed
• Use require
62
Define “add” Method
• Immutable
• Define add:
63
Add Fields
• n, d are in scope in the add method
• Access then only on the object on which add
was invoked 
64
Test Add, Access Fields
65
Self Reference (this)
• Define method lessThan:
• Define method max:
66
Auxiliary Constructors
• Constructors other then the primary
• Example: a rational number with a denominator
of 1 (e.g., 5/1  5)
• We would like to do: new Rational(5)
• Auxiliary constructor first action: invoke
another constructor of the same class
• The primary constructor is thus the single point
of entry of a class
67
Revised Rational
68
Private Fields and Methods
• 66/42 = 11/7
• To normalize divide the numerator and
denominator by their greatest common divisor (gcd)
• gcd(66,42) = 6  (66/6)/(42/6) = 11/7
• No need for Rational clients to be aware of this
• Encapsulation
69
Off Topic: Calculate gcd
• gcd(a,b) = g
•
•
•
•
a = n * g
b = m * g
gcd(n,m)=1(otherwise g is not the gcd)
a = t * b + r = t * m * g + r  g is a
divisor of r
• gcd(a,b) = gcd(b,a%b)
• The Euclidean algorithm: repeat iteratively:
if (b == 0) return a
else repeat using a  b, b  a%b
• http://en.wikipedia.org/wiki/Euclidean_algorithm
70
Correctness
• Example:
gcd(40,24)  gcd(24,16)  gcd(16,8) 
gcd(8,0)  8
• Prove: g
= gcd(a,b) = gcd(b,a%b)= g1
• g1 is a divisor of a ( g1 ≤ g)
• There is no larger divisor of a (
g1 ≥ g)
• ≤ : a = t * b + r  a = t * h * g1 + v * g1
 g1 is a divisor of a
• ≥ : assume g > g1  a = t * b + r  g is a
divisor of b and r  contradiction
71
Implementation
72
Revised Rational
73
Defining Operators
•
•
•
•
Why not use natural arithmetic operators?
Replace add by the usual mathematical symbol
Operator precedence will be kept
All operations are method calls
74
Revised Rational
75
Usage
76
Method Overloading
• Now we can add and multiply rational numbers!
• What about mixed arithmetic?
• r * 2 won’t work 
• r * new Rational(2) is not nice 
• Add new methods for mixed addition and
multiplication
• Method overloading
• The compiler picks the correct overloaded
method
77
Usage
• The * method invoked is determined in each
case by the type of the right operand
78
Revised Rational
79
Implicit Conversions
• 2 * r  2.*(r)  method call on 2 (Int) 
Int class contains no multiplication method
that takes a Rational argument 
• Create an implicit conversion that
automatically converts integers to rational
numbers when needed
80
Companion Object
81
Revised Rational
• Define implicit conversion in Rational.scala,
after defining object Rational
82
In Eclipse
• In Rational.scala:
• Companion object
(object Rational)
• Rational class (class
Rational)
• Place the main method
in another file
83
Summary
• Customize classes so that they are natural
to use
• fields, methods, primary constructor
• Method overriding
• Self reference (this)
• Define several constructors
• Encapsulation
• Define operators as method
• Method overloading
• Implicit conversions, companion object
84
Today
• Home work review
• Sorting, searching and time-complexity analysis
• Binary search
• Bubble sort, Merge sort
• Scala memory model
• Object-oriented programming (OOP)
• Classes and Objects
• Functional Objects (Rational Numbers example)
• Home work
85
Exercise 1
• Read, understand and implement
selection/insertion sort algorithm
• http://en.wikipedia.org/wiki/Selection_sort
• http://en.wikipedia.org/wiki/Insertion_sort
86
Exercise 2
• Implement class Complex so it is natural to use
complex numbers
• Examples:
87
Want More Exercises?
88
Exercise (tough!)
• Read, understand and implement quick sort
algorithm
• http://en.wikipedia.org/wiki/Quicksort
89