View
224
Download
2
Embed Size (px)
Citation preview
CS 410 Applied Algorithms
Applied Algorithms
Lecture #2
Overall program structure, Representing graphs, finding bugs
CS 410 Applied Algorithms
Solution to the 3n+1 problem/* The 3n+1 problem */#include<stdio.h>
/* Given a number, return the next number in the sequence */int formula (int x) { return ( ((x % 2) == 0) ? (x / 2) : ((3*x)+1) ); }
/* Find the length of a sequence starting at "x" *//* tests: onecycle(1,1) = 4 onecycle(2,1) = 2 */int onecycle(int x,int count) { int next; next = formula(x); while (next != 1) { next = formula(next); count = count + 1;
} return count+1; }
Use conditional expression, its short and clear
Include tests when their might be some
ambiguity
CS 410 Applied Algorithms
/* do many cycles, 1 for each number between "i" and "j“ Assume “i <= j”, and "big" is the longest cycle found so far */int manycycles (int i, int j, int big) { int candidate; while ( i <= j ) { candidate = onecycle(i,1); if (candidate > big) big = candidate; i = i+1; } return big; }
/* find the longest cycle between "n" and "m" and print the result */void oneline (int n, int m) { int i; int j; int big; if (n <= m) { i = n; j = m; } /* make sure i <= j */ else { i = m; j = n; }; big = manycycles(i,j,1); printf("%ld %ld %ld\n",n,m,big);}
int main (){ int n; int m; while ( scanf("%ld %ld",&n, &m) != EOF ) oneline(n,m); return 0;}
Break program up into clear units with
single purpose
Use meaningful variable names
Use clear logic, and comments to annotate
strange code
Document assumptions
Main should only have the toplevel structure
CS 410 Applied Algorithms
Goals in program design
• Simplicity
• Small size
• Clarity
• Structure
• Elegance
CS 410 Applied Algorithms
Solution to the Family Tree Problem/* potential family trees */#include<stdio.h>
#define TRUE 1#define FALSE 0typedef int Bool;
typedef int Status;Status M = 0; /* mother */Status F = 1; /* father */Status Un = 2; /* unknown */
/* --------------------------------------------------------*//* Arrays or tables that store information about the trees */
Status assignment[15];int parentCount[15];int parent1[15];int parent2[15];
Use logical names, and define new types to clarify
how the data is being used.
Declare logically related data structures together so the reader can get the big
picture.
CS 410 Applied Algorithms
/* --------------------------------------------------- *//* initialize and reading the tables */
void initTables() { int i; for (i=1;i<=14;i++) { assignment [i] = Un; parentCount[i] =0; parent1[i] =(-1); parent2[i] =(-1); }}
void readTables(int i) { int parent; int child; int n; scanf("%ld %ld",&parent,&child); n = parentCount[child]; parentCount[child] = (n+1); switch(n) {
case 0: parent1[child]= parent; break; case 1: parent2[child]= parent; break; default: break; }}
Write initialization and input functions to logically
separate the different phases of the program
Use sentinel data to indicate out of bounds or
impossible cases
Use switch statements for n-way branches on
unstructured data. Don’t forget the “break”s
CS 410 Applied Algorithms
// -----------------------------------------------------------------// The key function that given the two parents of a node// determines if they are unknown, consistent, or inconsistent// if one parents' status is unknown, but can be updated to remain// consistent, then that update is made.
Bool updateStatus(int parent1, int parent2){ Status status1,status2; status1 = assignment[parent1]; status2 = assignment[parent2]; if (status1==Un && status2==Un) return TRUE; else if (status1==Un && status2==M ) {assignment[parent1]=F; return TRUE;} else if (status1==Un && status2==F ) {assignment[parent1]=M; return TRUE;} else if (status1==M && status2==Un) {assignment[parent2]=F; return TRUE;} else if (status1==F && status2==Un) {assignment[parent2]=M; return TRUE;} else if (status1==F && status2==M ) return TRUE; else if (status1==M && status2==F ) return TRUE; else if (status1==M && status2==M ) return FALSE; else if (status1==F && status2==F ) return FALSE;}
If a function is the “key” or “workhorse” for solving a
problem, say so. Use comments to describe its
role.
Use white space and indentation to layout programs so programs with
regular structure appear that way. It makes it easier to see the pattern, to
be sure coverage is exhaustive and to find bugs.
CS 410 Applied Algorithms
/* -------------------------------------------------------- *//* for each node in the tables, update that nodes status */
Bool updateTableEntries(int low, int high) { int i; int count; int p1; int p2; for (i=low;i<=high;i++) { count = parentCount[i]; p1 = parent1[i]; p2 = parent2[i]; /* failure at any node causes the loop to exit an */ /* the whole function to return FALSE */ switch(count) {
case 0: break; case 2: { if (updateStatus(p1,p2) != TRUE) return FALSE; else break; } default: return FALSE;
} }}
Give names to important intermediate results
Use return and break for unusual control flow. Document
unusual control flow
CS 410 Applied Algorithms
/* ------------------------------------------------------------ *//* Read the status of the "n"th node, if it is unknown then *//* choose an assignment for it. Then make all other nodes *//* consistent with this choice. */
Bool makeNthAssignment(int i, int j, int n) { Status st; st = assignment[n]; if (st==Un) assignment[n] = F; return updateTableEntries(i,j); }
int main() { int nodes; int edges; int i; int j; Bool valid; while (scanf("%ld %ld",&nodes,&edges) != EOF) { initTables(); for (i=1;i<=edges;i++) readTables(i); valid = TRUE; /* break out of loop is any assignment fails */ for (j=1;j<=nodes && valid;j++) valid = makeNthAssignment(1,nodes,j); if (valid) printf("valid\n\n"); else printf("invalid\n\n"); }}
Document unusual control flow
Main should only have the toplevel structure
CS 410 Applied Algorithms
Writing Contest Programs
• In Contest problems, speed is often important.
• To get started write away, imagine the top-level structure.
• Write main first, and call stubs to get started.
• Write a input data file, and test that main processes it correctly.
CS 410 Applied Algorithms
int main (){ int n; int m; while ( scanf("%ld %ld",&n, &m) != EOF ) oneline(n,m); return 0;}
int main()
{ int nodes; int edges; int i; int j; Bool valid;
while (scanf("%ld %ld",&nodes,&edges) != EOF)
{ initTables();
for (i=1;i<=edges;i++) readTables(i);
valid = TRUE;
for (j=1;j<=nodes && valid;j++)
valid = makeNthAssignment(1,nodes,j);
if (valid)
printf("valid\n\n");
else printf("invalid\n\n");
}
}
Define, and use stubs to get started
CS 410 Applied Algorithms
Representing Graphs
• Graphs are ubiquitous, they appear in many problems.
• Best to have some canned strategies for thinking about graphs.
• Separate in your mind the logical descriptions of graphs, form the physical representations– Functions– Arrays– Matrices– Pointers
CS 410 Applied Algorithms
Graphs:• A graph is a pair (V,E) where
– V is a set of vertices;– E is a set of edges {u,v}, where u,v are distinct vertices from V.
• For example:
• G = ({a,b,c,d}, {{a,b}, {a,c}, {a,d}, {b,d}})
• Examples: computer networks, street layout, etc…
a b
c d
CS 410 Applied Algorithms
Variations:
• There are many variations on this theme. For example, in some cases we may want to allow:
– Self loops {v,v};– Multiple edges between two vertices (multigraphs);– Labels attached to vertices by a function V A;– Labels attached to edges by a function E B;– Hyperedges that connect multiple vertices (hypergraphs);– etc…
CS 410 Applied Algorithms
Representing graphs:• Function: Define a function that when applied
to vertex v, returns a set of children (or a set of parents). Each child is a node where (v,c) is in the set of edges.
• Adjacency list: for each vertex v, we store a linked list of the vertices u that it connects to by a single edge.
• Adjacency matrix: a two dimensional array g[i][j]. An entry of 1 means that there is an edge between vertices i and j.
• Pointers: actually construct a heap object where edges are implemented by pointers
CS 410 Applied Algorithms
Adjacency matrix representation:• A simple example:
• Uses O(|V|2) space, much of which will be wasted if the graph is sparse (i.e., relatively few edges).
• Easily adapted to store information about each edge in the entries of the matrix.
• Alternatively, if all we need is 0/1, then a single bit will do!
a b
c d
0011
0001
1001
1110
CS 410 Applied Algorithms
Adjacency list representation• A simple example:
• Uses O(|V|+|E|) space, good for sparse graphs, more expensive for dense case (i.e., many edges).
• Easily adapted to store information about each edge in each part of the linked lists.
• Testing to see if there is an edge (u,v) is not O(1); we must search the adjacency list of u for v.
a b
c d
abcd
b c d 0
a
a 0
a b 0
d 0
CS 410 Applied Algorithms
Function representation• Best when we have directed graphs. I.e. edges
have an orientation.• A simple example:
list graph(node x) { if (node==a) return [b,c,d] else if (node==b) return [d] else if (node==c) return [] else if (node==d) return [] else return [] }
a b
c d
CS 410 Applied Algorithms
Arrays• When a graph has fixed in-degree (or out degree) the
function representation has an especially nice implementation as a set of parallel arrays.
list graph(node x) { if (node==a) return [b,c,d] else if (node==b) return [d] else if (node==c) return [] else if (node==d) return [] else return [] }
a b
c d
3
1
0
0
b
d
?
?
c
?
?
?
d
?
1
?
a
b
c
dint count [5]
node child1 [5]
node child2 [5]
node child3 [5]
CS 410 Applied Algorithms
Bug search
• Go to the home page – http://www.cs.pdx.edu/~sheard/course/appliedalg
• Under “Lecture Notes”, under today’s lecture “Lecture 2” is a clickable link that leads to a file with a solution to the 3n+1 problem, with a bug.
• Upload the file.
• Find and fix the bug.
CS 410 Applied Algorithms
In Class Problem
• Minesweeper• Page 16 of the text• Keeping in mind the rules we discussed in
class, break into teams of two, and solve the problem.
• Pick a different partner than you used last time.
• Use pair programming. One person “drives” the other observes.
CS 410 Applied Algorithms
Today’s Assignments
Read for next timeChapter 2 of the text. pp 27-55
Be prepared to answer questions in class next Friday from the reading.
Programming assignment1.6.7 Check the CheckPage 23-24Write a solutionSubmit your solution (until you get it right)Hand in both your program, and the judge output.Those who volunteer to discuss their program get class participation
points. Email me solutions before noon on Friday, April 15.