View
60
Download
0
Category
Preview:
DESCRIPTION
Lecture 13. Graphs Arrays Iteration Combining Data Structures. Lecture 13. Graphs. The Scenario. Imagine we need to represent a highway system within our algorithm. Chattanooga. Greenville. Atlanta. Birmingham. Tampa. Which Data Structure?. Arrays are fixed in size and linear - PowerPoint PPT Presentation
Citation preview
GraphsArrays
IterationCombining Data Structures
Graphs
The Scenario• Imagine we need to represent a highway
system within our algorithm.
Atlanta
Chattanooga
Tampa
Birmingham
Greenville
Which Data Structure?
• Arrays are fixed in size and linear• Lists are dynamic and linear• Trees are dynamic and hierarchical
• We need a non-linear structure which connects nodes to other nodes.
Graphs
Set of nodes and connecting edges.
Nodes and Edges
B
F
CA
EG
D
Nodes and Edges
B
F
CA
EG
D
Nodes are also called vertices.
Nodes and Edges
B
F
CA
EG
D
Edges connect nodes.
Undirected Graphs
B
F
CA
EG
D
Directed Graphs
B
F
CA
EG
D
Directed edges only allow movement in one direction.
Weighted Edges
B
F
CA
EG
D5
3
2
1
4
7
1
2
39
12
Edge weights represent cost.
Directed Graphs Can be Weighted Too
B
F
CA
EG
D5
3
2
1
4
7
1
2
39
12
Trees and Lists are Graphs
• Trees and lists are examples of graphs• We’ll use the term graph for situations– that don’t have the implied restrictions– i.e. non hierarchical (many-to-many)
\\
Representing Graphs
How do we represent a node that has any number of children or connections?
What’s in a Node?
Data
+\\
Edges (perhaps with weights)
A Low-level Diagram
childrendata
childrendata
childrendata
childrendata
next_childthis_child
next_childthis_child
next_childthis_child
... ... ...
Another View
Node 1Children
Node 2Children
Node 3Children
Node 4Children
Node 2 Node 3 Node 4
Node 1
Node 2
Node 2 Node 3
1
24
3
This representsa pointer to node 3
LB
Representing Non-binary Trees and
Graphs Tree_Node definesa Record data isoftype String children isoftype Ptr toa Child_List_Node endrecord //Tree_Node
Child_List_Node definesa Record this_child isoftype Ptr toa Tree_Node next_child isoftype Ptr toa Child_List_Node endrecord //Child_List_Node
Summary
• Graphs are a collection of edges and nodes– Non-hierarchical and non-linear– Edges can be weighted or unweighted– Edges can be directed or undirected
• Graphs allow a “many to many” relationship between nodes.
Questions?
Arrays
The Scenario
• We need a data structure to hold information.
• We know ahead of time how many items we need to hold.
• All of the items are of the same type.• We need fast access to each element
in the collection.
Properties of Arrays
• Linear data structure• Homogeneous collection– All entries are of the same type
• Static and cannot grow or shrink• Allow random access– Like a CD player (vs. a tape player)
Terms
• A cell or element represents one item in an array.
• The index of a cell represents its location within the array.
Visually Representing Arrays
A cell at the fourth index.
1 2 3 4 5 6 7 8 9 10
Defining Arrays
Like a record definition, we define a new data type:
MAX is 10NumArrayType definesa Array [1..MAX] of Num
Constant size
Type name
Bounds/Range
Cell type
LB
Declaring an Array Variable
Like declaring any other variable:
MyNumArray isoftype NumArrayType
Type nameVariable name
LB
Accessing an Element in an Array
Use brackets “[ ]” and specify an index value within the bounds:
MyNumArray[4] <- 42An array
A number
42
1 2 3 4 5 6 7 8 9 10
Multi-Dimension Arrays
2-D
3-D
1 2 3 4 5 6
12345 1
23
12345
1 2 3 4 5 6 7 8 9 10
4-D & beyondcan do,
but visually ???
Defining A Two-Dimensional Array
COLS is 10ROWS is 5
NumArrayType definesa Array [1..COLS] of Num2DNumArrayType definesa Array [1..ROWS] of
NumArrayType
- or –
2DNumArrayType definesa Array [1..ROWS][1..COLS] of Num
Accessing Elements in a 2-D Array
Row
Column
12345
1 2 3 4 5 6 7 8 9 10
My2DNumArray
My2DNumArray isoftype 2DNumArrayType
Accessing Elements in a 2-D Array
Row
Column
12345
1 2 3 4 5 6 7 8 9 10
My2DNumArray
My2DNumArray
Accessing Elements in a 2-D Array
Row
Column
12345
1 2 3 4 5 6 7 8 9 10
My2DNumArray
My2DNumArray[3]
Accessing Elements in a 2-D Array
Row
Column
31
12345
1 2 3 4 5 6 7 8 9 10
My2DNumArray
My2DNumArray[3][8] <- 31 - or –My2DNumArray[3,8] <- 31
LB
Using Bounds Correctly
31
31
.
.
[3][8]
[8][3] (out of bounds)
1 2 3 4 5 6 7 8 9 10
12345
Row
Column
Summary
• Arrays– Are homogeneous collections– Are fixed in size– Are a linear data structure– Allow random, immediate access to
elements
Questions?
Iteration
An Example: Golf
1. Go to the golf course.2. Practice hitting balls on the driving range.3. Go to the first hole.4. Tee off.5. Hit ball closer to hole until it goes in.6. Move to next hole.7. If you haven’t played all 18 holes, then repeat
steps 4-7.8. Turn in scorecard to the pro shop.
The Scenario
• We need a way to repeat instructions• Recursion allows this via module calls,• But what about another solution…
• We’ll use iteration to achieve repetition– Need some way of marking which
instructions to repeat– Need some way to determine when to
stop repeating
Three Properties of Repetition
• Need some way of repeating (or starting the instructions again)
• Need to know when to stop repeating (when finished)
• Need to do some work and move closer to being finished
Back to the Golf Course
Go to the golf coursePractice hitting balls on the driving range
hole <- 1loop Tee off Hit ball closer to hole until it goes in hole <- hole + 1 // move closer exitif (hole > 18) // terminating conditionendloop
Turn in scorecard to the pro shop
Not Always a Hole in One!...hole <- 1loop Tee off loop exitif (ball in hole) hit ball closer to hole endloop hole <- hole + 1 exitif (hole > 18)endloop...
Iteration
Allows for the repetition of instructions.
• loop begins the iteration.• exitif(<conditional expression>)
provides a terminating condition; when the conditional expression is true, then execution jumps to the algorithm step after endloop and continues.
• endloop ends the iteration section.
The Loop Constructi, sum isoftype num
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum) // prints 55
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
1 0
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
1 1
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
2 1
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
2 1
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
2 1
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
2 3
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
3 3
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
3 3
Time Passes...
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
3 3
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
3 6
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
4 6
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
4 6
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
4 6
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
4 10
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
5 10
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
5 10
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
5 10
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
5 15
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
6 15
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
6 15
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
6 15
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
6 21
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
7 21
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
7 21
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
7 21
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
7 28
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
8 28
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
8 28
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
8 28
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
8 36
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
9 36
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
9 36
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
9 36
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
9 45
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
10 45
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
10 45
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
10 45
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
10 55
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
11 55
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
11 55
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
11 55
Tracing the Loop’s Behavior
i sum
sum <- 0 // initializei <- 1 // initializeloop exitif (i > 10) sum <- sum + i // work i <- i + 1 // incrementendloopprint(sum)
11 55
Items to Consider with Loops
• Initialize values• Determine exitif conditional and
placement• Perform work• Increment counter (if needed)
An Iterative List Traversal Example
• Given some linked list of numbers, double each element in the list
• We’ll do this iteratively:– Work to be done is the doubling of the
elements– Stop when we reach the end of the list
Traversing the List
• Iteratively repeat until we reach nil.
48 17 142ListHead //96 34 284
Start With a Framework
loop ??? exitif(???) ???endloop
Initialize
current isoftype ptr toa Nodecurrent <- ListHead // from elsewhere
loop ??? exitif(???) ???endloop
Do the Work
current isoftype ptr toa Nodecurrent <- ListHead // from elsewhere
loop current^.data <- current^.data * 2 exitif(???) ???endloop
Move Closer to the End
current isoftype ptr toa Nodecurrent <- ListHead // from elsewhere
loop current^.data <- current^.data * 2 current <- current^.next exitif(???) ???endloop
When Can We Finish?
current isoftype ptr toa Nodecurrent <- ListHead // from elsewhere
loop current^.data <- current^.data * 2 current <- current^.next exitif(current = nil) ???endloop
But There’s a Problem!
current isoftype ptr toa Nodecurrent <- ListHead // from elsewhere
loop current^.data <- current^.data * 2 current <- current^.next exitif(current = nil)endloop
What If the List is Empty?
current isoftype ptr toa Nodecurrent <- ListHead // from elsewhere
loop exitif(current = nil) current^.data <- current^.data * 2 current <- current^.nextendloop
Sentinel Loops
A “sentinel” is a guard, so a sentinel loop is one in which the loop is “guarded.”
Loops which have the exitif as the first line in the loop body.
The loop may execute 0 or more times.
loop exitif(<conditional>) <statements>endloop
A Simplified Teaching Example
• Imagine a classroom of 2nd graders.• We want to teach them multiplication.
Jon’s wife’s process is:
1. Give them some instructions2. Let them practice3. Grade their work4. Repeat steps 1-3 until they know how to
multiply
LB
Start With a Framework
loop ??? exitif(???) ???endloop
What Work Must We Do?
loop teach class let students practice grade their work exitif(???) ???endloop
When Can We Finish?
loop teach class let students practice grade their work exitif(students know how to multiply)endloop
Test-Last Loops
Loops which have the exitif as the last line in the loop body.
The loop executes at least once.
loop <statements> exitif(<conditional>)endloop
Typically used when
This
Is generatedin here
LB
A Sample Problem
Design a system that• Presents a menu to the user• Reads in the user’s choice• Processes the user’s choice• Until the user types “quit”
Start With a Framework
loop ??? exitif(???) ???endloop
What Must We Do?
choice isoftype string
loop Print_Menu() // displays menu read(choice) // reads user’s choice exitif(???) ???endloop
When Can We Finish?
choice isoftype string
loop Print_Menu() // displays menu read(choice) // reads user’s choice exitif(choice = “quit”) ???endloop
What Else – Do Work!
choice isoftype string
loop Print_Menu() // displays menu read(choice) // reads user’s choice exitif(choice = “quit”) Process_Choice(choice)endloop
N-and-a-Half Loops
Loops which have the exitif in the middle of other instructions in the loop body.
The “before statements” will execute one more time than the “after statements”.
loop <before statements> exitif(<conditional>) <after statements>endloop
Placement of the Exitif Statement
• The exitif conditional statement can be placed anywhere in the loop:– At the beginning, before instructions– At the end, after all instructions– In the middle of instructions
• Often, changing the placement of the exitif conditional alters the number of iterations performed.
Sisyphus’ Infinite Loop
Make sure that your exitif conditions are correctly placed and will be true!
loop select a rock roll the rock uphill exitif(no more rocks below) go back downhillendloop
Summary
• Iteration allows us to repeat instructions until some exit criteria is met.
• We have choice in the placement of the exit condition:– At the front (sentinel)– At the end (test last)– In the middle (N-and-a-half)
• Be sure to trace your loops and test to see they exit correctly.
Questions?
Combining Data Structures
Basic Data Structures
Some basic data structures:– Linked List– Binary Tree– Array
But we can combine these as needed.
A Linked List of Arrays
…
A Linked List of Arrays Defined
MAX is 150
NumArray definesa array [1..MAX] of num
Node definesa record data isoftype NumArray next isoftype ptr toa Nodeendrecord
An Array of Linked Lists
An Array of Linked Lists Defined
MAX is 150
Node definesa record data isoftype Char next isoftype ptr toa Nodeendrecord ListArray definesa array [1..MAX] of ptr toa Node
Other Possibilities
• A Binary Search Tree of Sorted Arrays of Unsorted Linked Lists
• An Array of Linked Lists of Linked Lists• A Linked List of Trees of Arrays• Etc.
Questions?
Recommended