Graphs Arrays Iteration Combining Data Structures

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