CS 3 Arrays 2x2
CS 3 Arrays 2x2
S E D G E W I C K / W A Y N E S E D G E W I C K / W A Y N E
PA R T I : P R O G R A M M I N G I N J AVA PA R T I : P R O G R A M M I N G I N J AVA
3. Arrays
Computer Science
• Basic concepts
Science
An Interdisciplinary Approach
• Two-dimensional arrays
ROBERT SEDGEWICK
1.4 K E V I N WAY N E
http://introcs.cs.princeton.edu
CS.3.A.Arrays.Basics
any program you might want to write An array is an indexed sequence of values of the same type.
objects
Examples. index value
10 values, without arrays An array is an indexed sequence of values of the same type.
double a0 = 0.0;
double a1 = 0.0;
A computer's memory is also an indexed sequence of memory locations. stay tuned for many details
double a2 = 0.0; 10 values, with an array 1 million values, with an array • Each primitive type value occupies a fixed number of locations.
double a3 = 0.0;
double a4 = 0.0; • Array values are stored in contiguous locations.
double[] a; double[] a;
double a5 = 0.0; a = new double[10]; a = new double[1000000];
double a6 = 0.0; ... ... a for simplicity in this lecture, think of a as the memory address of the first location
double a7 = 0.0; a[4] = 3.0; a[234567] = 3.0; the actual implementation in Java is just slightly more complicated.
double a8 = 0.0; ... ...
double a9 = 0.0; a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
a[8] = 8.0; a[876543] = 8.0;
... ... ...
a4 = 3.0; double x = a[4] + a[8]; double x = a[234567] + a[876543];
...
a8 = 8.0; Critical concepts
... • Indices start at 0.
double x = a4 + a8; scales to handle huge amounts of data
an easy alternative
• Given i, the operation of accessing the value a[i] is extremely efficient.
• The assignment b = a makes the names b and a refer to the same array.
it does not copy the array,
as with primitive types
tedious and error-prone code
(stay tuned for details)
5 6
Basic support operation typical code To copy an array, create a new array , then copy all the values.
a i b i
Refer to the length of an array a.length;
0.3 0.6 0.99 0.01 0.5 0.3 0.6 0.99 0.01 0.5
Initialization options
no need to use a loop like
for (int i = 0; i < 1000; i++) Important note: The code b = a does not copy an array (it makes b and a refer to the same array).
a[i] = 0.0;
operation typical code
double[] b = new double[a.length];
Default initialization to 0 for numeric types a = new double[1000];
b = a;
BUT cost of creating an
array is proportional to
its length.
Declare, create and initialize in one statement double[] a = new double[1000]; a b
Access command-line args in system array For brevity, N is a.length and b.length in all this code.
Q. What does the following code print?
int stake = Integer.parseInt(args[0]);
int goal = Integer.parseInt(args[1]); Copy to another array
int trials = Integer.parseInt(args[2]); double[] b = new double[N]; public class PQarray1
for (int i = 0; i < N; i++) {
b[i] = a[i]; public static void main(String[] args)
{
int[] a = new int[6];
Create an array with N random values
int[] b = new int[a.length];
double[] a = new double[N]; Print array values, one per line
for (int i = 0; i < N; i++) for (int i = 0; i < N; i++) b = a;
a[i] = Math.random(); System.out.println(a[i]); for (int i = 1; i < b.length; i++)
b[i] = i;
9 10
11 12
COMPUTER SCIENCE COMPUTER SCIENCE
S E D G E W I C K / W A Y N E S E D G E W I C K / W A Y N E
PA R T I : P R O G R A M M I N G I N J AVA PA R T I : P R O G R A M M I N G I N J AVA
Image sources
http://commons.wikimedia.org/wiki/File:CERN_Server_03.jpg
3. Arrays
• Basic concepts
• Examples of array-processing code
• Two-dimensional arrays
CS.3.A.Arrays.Basics CS.3.B.Arrays.Examples
Example of array use: create a deck of cards Example of array use: create a deck of cards
Define three arrays String[] rank = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
public class Deck
• Ranks. String[] suit = { " ", " ", " ", " " }; {
public static void main(String[] args)
• Suits. {
String[] deck = new String[52];
• Full deck. j String[] rank = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
String[] suit = { " ", " ", " ", " " };
15 16
Pop quiz 2 on arrays Pop quiz 2 on arrays
Q. What happens if the order of the for loops in Deck is switched? Q. What happens if the order of the for loops in Deck is switched?
for (int j = 0; j < 4; j++) for (int i = 0; i < 13; i++) for (int j = 0; j < 4; j++) for (int i = 0; i < 13; i++)
for (int i = 0; i < 13; i++) for (int j = 0; j < 4; j++) for (int i = 0; i < 13; i++) for (int j = 0; j < 4; j++)
deck[i + 13*j] = rank[i] + suit[j]; deck[i + 13*j] = rank[i] + suit[j]; deck[i + 13*j] = rank[i] + suit[j]; deck[i + 13*j] = rank[i] + suit[j];
A. The array is filled in a different order, but the output is the same. j
0 1 2 3
suit
i
0 1 2 3 4 5 6 7 8 9 10 11 12
rank 2 3 4 5 6 7 8 9 10 J Q K A
NOTE: Error on page 92 in 3rd printing of text (see errata list on booksite).
17 18
Q. Change Deck to put the cards in rank order in the array. Q. Change Deck to put the cards in rank order in the array.
i
0 1 2 3 4 5 6 7 8 9 10 11 12
rank 2 3 4 5 6 7 8 9 10 J Q K A
0 1 2 3 4 5 6 7 8 9 10 11 12 ...
deck 2 2 2 2 3 3 3 3 4 4 4 4 5 ...
19 20
Array application: take a card, any card
Algorithm
Take N from the command line and do the following N times
• Calculate a random index r between 0 and 51.
• Print deck[r].
for (int i = 0; i < N; i++) each value between 0 and 51 equally likely
{
int r = (int) (Math.random() * 52);
System.out.println(deck[r]);
}
Note: Same method is effective for printing a random sequence from any data collection.
21 22
Array application: random sequence of cards Array application: shuffle and deal from a deck of cards
String[] rank = {"2", "3", "4", "5", "6", "7", "8", "9","10", "J", "Q", "K", "A" };
• Consider each card index i from 0 to 51.
String[] suit = { " ", " ", " ", " " }; • Calculate a random index r between i and 51.
String[] deck = new String[52]; • Exchange deck[i] with deck[r]
for (int i = 0; i < 13; i++) % java DrawCards 10
for (int j = 0; j < 4; j++) • Print the first N cards in the deck.
6 K 10 8 9 9 6 10 3 5
deck[i + 13*j] = rank[i] + suit[j];
found
Coupon collector problem
r distinct cards
0 1 2 3 4 5 • M different types of coupons.
F F F F F F 0 0 • Collector acquires random coupons, one at a time, each type equally likely.
boolean[] found = new boolean[M]; 2 F F T F F F 1 1 Q. What is the expected number of coupons needed to acquire a full collection?
Pierre-Simon Laplace
while (distinct < M)
1749-1827
{ 0 T F T F F F 2 2
int r = (int) (Math.random() * M);
A. (known via mathematical analysis for centuries) About M ln M + .57721M .
cards++; 4 T F T F T F 3 3
if (!found[r]) type M expected wait
0 T F T F T F 3 4 % java Coupon 4
{ 11
distinct++; playing card suits 4 8
1 T T T F T F 4 5 % java Coupon 13
found[r] = true; playing card ranks 13 41 38
} 2 T T T F T F 4 6
} baseball cards 1200 9201 % java Coupon 1200
5 T T T F T T 5 7 8789
Magic™ cards 12534 125508
% java Coupon 12534
0 T T T F T T 5 8 125671
Remarks
1 T T T F T T 5 9
• Computer simulation can help validate mathematical analysis.
3 T T T T T T 6 10 Example: Is Math.random()
• Computer simulation can also validate software behavior. simulating randomness?
29 30
Simulation, randomness, and analysis (revisited) Simulation, randomness, and analysis (revisited)
Image sources
http://www.vis.gr.jp/~nazoya/cgi-bin/catalog/img/CARDSBIC809_red.jpg
http://www.alegriphotos.com/Shuffling_cards_in_casino-photo-deae1081e5ebc6631d6871f8b320b808.html
http://iveypoker.com/wp-content/uploads/2013/09/Dealing.jpg
http://upload.wikimedia.org/wikipedia/commons/b/bf/Pierre-Simon,_marquis_de_Laplace_(1745-1827)_-_Guérin.jpg
3. Arrays
• Basic concepts
• Examples of array-processing code
• Two-dimensional arrays
CS.3.B.Arrays.Examples CS.3.C.Arrays.2D
Two-dimensional arrays Java language support for two-dimensional arrays (basic support)
A two-dimensional array is a doubly-indexed sequence of values of the same type. operation typical code
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[0][5] a[0][6] a[0][7] a[0][8] a[0][9]
a[1] a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5] a[1][6] a[1][7] a[1][8] a[1][9]
a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[2][5] a[2][6] a[2][7] a[2][8] a[2][9]
a 3-by-10 array
Main purpose. Facilitate storage and manipulation of data.
x-coordinate 35 36
Java language support for two-dimensional arrays (initialization) Application of arrays: vector and matrix calculations
double[][] p =
{
.70 .20 .10 .80 .30 .50 1.5 .50 .60
{ .92, .02, .02, .02, .02 },
{ .02, .92, .32, .32, .32 }, .30 .60 .10 + .50 .10 .40 = .80 .70 .50 .30 .60 .10 + .10 .40 .10 = .40 1.0 .20
Initialize to literal values
{ .02, .02, .02, .92, .02 }, .50 .10 .40 .10 .30 .40 .60 .40 .80
{ .92, .02, .02, .02, .02 },
{ .47, .02, .47, .02, .02 },
};
37 38
Mathematical abstraction: vector Mathematical abstraction: matrix Q. How many multiplications to multiply two N-by-N matrices?
Java implementation: 1D array Java implementation: 2D array
2. N 2
i x[i] y[i] x[i]*y[i] sum
end-of-loop trace
39 40
Pop quiz 4 on arrays Self-avoiding random walks
Q. How many multiplications to multiply two N-by-N matrices? A dog walks around at
random in a city, never
revisiting any intersection.
double[][] c = new double[N][N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) Q. Does the dog escape?
for (int k = 0; k < N; k++)
escape
c[i][j] += a[i][k] * b[k][j]; Model: a random process in an N-by-N lattice
• Start in the middle.
1. N • Move to a random neighboring intersection
but do not revisit any intersection.
2. N 2 • Outcome 1 (escape): reach edge of lattice.
Nested for loops: N ⇥ N ⇥ N • Outcome 2 (dead end): no unvisited neighbors.
3. N 3
Approach: Use Monte Carlo simulation, recording visited positions in an N-by-N array.
41 42
while (x > 0 && x < N-1 && y > 0 && y < N-1) % java SelfAvoidingWalker 70 100000
96% dead ends
{
if (a[x-1][y] && a[x+1][y] && a[x][y-1] && a[x][y+1]) % java SelfAvoidingWalker 80 100000
98% dead ends
{ deadEnds++; break; }
% java SelfAvoidingWalker 90 100000
99% dead ends
a[x][y] = true;
double r = Math.random(); % java SelfAvoidingWalker 100 100000
if (r < 0.25) { if (!a[x+1][y]) x++; } 99% dead ends
else if (r < 0.50) { if (!a[x-1][y]) x--; }
100%
else if (r < 0.75) { if (!a[x][y+1]) y++; }
else if (r < 1.00) { if (!a[x][y-1]) y--; }
75%
}
}
System.out.println(100*deadEnds/trials + "% dead ends"); 50%
}
} 25%
0%
10 20 30 40 50 60 70 80 90 100
43 44
Simulation, randomness, and analysis (revisited again) Your first data structure
Mathematicians and
A. Nobody knows (despite decades of study). physics researchers
cannot solve the problem.
Computational models play
digital audio
A. 99+% for N >100 (clear from simulations). YOU can! an essential role in modern
scientific research.
Remark: Computer simulation is often the only effective way to study a scientific phenomenon.
45 46
Image sources
http://en.wikipedia.org/wiki/Airedale_Terrier#mediaviewer/File:Airedale_Terrier.jpg
http://www.nobelprize.org/nobel_prizes/chemistry/laureates/1974/flory_postcard.jpg
Computer Science
Computer 3. Arrays
Science An Interdisciplinary Approach
ROBERT SEDGEWICK
1.4 K E V I N WAY N E
http://introcs.cs.princeton.edu
CS.3.C.Arrays.2D