CS 261 SUMMER 2011 Dynamic Array Introduction (aka Vector, ArrayList)

advertisement
CS 261 SUMMER 2011
Dynamic Array Introduction
(aka Vector, ArrayList)
Arrays, Pro and Con
 Simple Arrays have nice feature that they are
randomly accessible - can quickly get to any
element
 Dark side - size must be fixed when created.
 Often you don’t know much much space you
need until you are done
Dynamic Array (Vector,
ArrayList)
 Dynamic Array (Java Vector, ArrayList, same
thing, different API) get around this by
encapsulating a partially filled array.
 Hide memory management details behind a
simple API
 Is still randomly accessible, but now it grows
as necessary
Partially Filled Array
Size vs Capacity
 The size is the “logical” size - The number of
elements. What the programmer thinks.
Managed by an internal data value.
 The capacity is the size of the physical array.
Number of elements it can hold.
Adding an element
 Adding an element to end is sometimes easy.
Just increase the (logical) size, and put new
value at end.
 But what happens when the size reaches the
capacity?
 Must reallocate new data array - but this
detail is hidden from user.
Reallocation and copy
Adding to Middle
 Adding an element to middle can also force
reallocation (if the current size is equal to
capacity)
 But will ALWAYS require elements to moved
up to make space
 Is therefore O(n) worst case
Picture of Adding to Middle
Must use a loop to make space for new value.
Careful! Loop from top down
Removing an Element
 Removing an Element will also require
“sliding over” to delete the value
 Therefore is O(n) worst case
Picture of Remove Element
Remove also requires loop. This time should it
be from top or bottom?
Element Types
 How to make a general purpose container
class?
 We define element type as symbolic
preprocessor constant. Default double.
 Requires recompiling source for new element
types. Not elegant, but workable.
Interface file
#ifndef DyArray_H
#define DyArray_H
# ifndef EleType
# define EleType double
# endif
# ifndef LT
# define LT(a, b) (a < b)
# endif
# ifndef EQ
# define EQ(a, b) (a == b)
# endif
Interface, continued
struct dyArray {
EleType * data;
int size;
int capacity;
};
/* prototypes */
void dyArrayInit (struct dyArray *v, int initCap);
void dyArrayFree (struct dyArray *v);
void dyArrayAdd (struct dyArray *v, EleType d);
EleType dyArrayGet (struct dyArray *v, int index);
EleType dyarraySet (struct dyArray *v, int index, EleType newValue);
int dyArraySize (struct dyArray *v);
dyArrayInit - initialization
void dyArrayInit (struct dyArray * v, int initCap)
{
assert (initCap >= 0);
v->capacity = initCap;
v->size = 0;
v->data = (double *)
malloc(v->capacity * sizeof(EleType));
assert (v->data != 0);
}
dyArrayFree - clean up
Void dyArrayFree (struct dyArray * v)
{
free (v->data);
v->capacity = 0;
v->size = 0;
}
Size
int dyArraySize (struct dyArray * da)
{ return da->size; }
Add a new Element
void dyArrayAdd (struct dyArray * da,
EleType newValue)
{ if (da->size >= da->capacity)
_dyArrayDoubleCapacity(da);
da->data[da->size] = newValue;
da->size += 1;
}
Double the Capacity
void _dyArrayDoubleCapacity (struct dyArray * da) {
EleType * oldbuffer = da->data;
int oldsize = da->size;
int i;
dyArrayInit (da, 2 * da->capacity);
for (i = 0; i < oldsize; i++)
da->data[i] = oldbuffer[i];
da->size = oldsize;
free(oldbuffer);
}
Lets build something
 How about building a Stack (worksheet 16)?
What do you need to do to:
void dyArrayPush(struct dyArray *d, EleType n)
EleType dyArrayTop(struct dyArray *d)
void dyArrayPop (struct dyArray *d)
int dyArrayIsEmpty (struct dyArray *d)
What about a BAG?
 Already have add. How to do
int dyArrayContains (struct dyArray *d, EleType
e)
 What about remove?
What about remove?
 Make more useful tool by writing two
routines
Void dyArrayRemove (struct dyArray *d,
EleType e)
Void dyArrayRemoveAt (struct dyArray *d, int
index)
Think about breaking tasks down into useful
pieces
Remove At requires extra
work
 RemoveAt requires you to “slide” the
elements down. Think: from the top, or from
the bottom?
What about addAt ?
 We don’t need dyArrayAddAt for the bag
(order doesn’t matter), but it is a nice
complement to removeAt
 And we will us it later when we talk about the
advantages of keeping a collection in order
Your chance
 Worksheet time. Finish implementation of
simple get and set, including reallocation. Next
do the stack. Then move on to remove to
complete the Bag.
 Note that your implementation will be used in
programming assignment 2.
 I’m not going to collect, but you will need this for
the programming assignment.
Download