CS 261: Data Structures Dynamic...

Post on 17-Jul-2020

5 views 0 download

Transcript of CS 261: Data Structures Dynamic...

CS 261: Data Structures

Dynamic Arrays

Introduction

Arrays -- Pros and Cons

• Positives:– Simple – Each element accessible in O(1)

• Negatives:– Size must be fixed when created– What happens when the program later requires

more space?2

# define MAX_SIZE 100struct Bag {

TYPE data[MAX_SIZE];int size;

};

Dynamic Arrays

• Our goal: Hide memory management details

behind an Application Program Interface (API)

• Each element is still accessible in O(1)

• But a dynamic array can change capacity

3

Dynamic Array

Capacity( = cap)

Size( = size)

10size =data =

16cap =

4

“Unused” elements

Size and Capacity• Size:

– Current number of elements– Managed by an internal data value

• Capacity: – Number of elements that a dynamic array

can hold before it must resize

5

Adding an Element

• Increment the size

• Put the new value at the end of the dynamic array

6

Adding an Element• What happens when size == capacity?

• Must:– reallocate new space– copy all data values to the new space– hide these details from the user

7

Reallocate and Copy

8size =data =

8cap =8size =

data =

16cap =

Before reallocation: After reallocation:

Must allocate new (larger) array and copy valid data elements

8

Reallocate and Copy

8size =data =

8cap =8size =

data =

16cap =

Before reallocation: After reallocation:

DO NOT forget to free up thememory of the old array

9

old new

Inserting an Element in the Middle

• May also require reallocation– When?

• Requires that some elements be moved up to make space for the new one

10

Inserting an ElementLoop from THE END backward while copying

Before After

Add at idxà idxà

11

Inserting an Element -- Complexity

O(n) in the worst case

12

• Remove also requires looping. • Loop from idx forward while copying

Before After

Remove idxà

Removing an Element

13

Removing an Element -- Complexity

O(n) worst case

14

Interface View of

Dynamic Arrays

15

Interface file: dynArr.h

struct dyArr {

TYPE * data; /* Pointer to data array */

int size; /* Number of elements */

int capacity; /* Capacity of array */

};

/* Rest of dynarr.h on next slide */ 16

Interface (continued)/* function prototypes */

void initDynArr (struct dyArr *da, int cap);

void freeDynArr (struct dyArr *da);

void addDynArr (struct dyArr *da, TYPE val);

TYPE getDynArr (struct dyArr *da, int idx);

void putDynArr (struct dyArr *da, int idx, TYPE val);

int sizeDynArr (struct dyArr *da);

void _dyArrDoubleCapacity (struct dyArray * da); 17

Implementation View of

Dynamic Arrays

18

initDynArr -- Initialization

void initDynArr (struct dyArr *da, int cap){

assert (cap >= 0);

da->capacity = cap;

da->size = 0;

da->data = (TYPE *)

malloc(da->capacity * sizeof(TYPE));

assert (da->data != 0); /* check the status */

}

19

/* Allocate memory to data array */

freeDynArr -- Clean-up

void freeDynArr (struct dyArr * da)

{

assert (da != 0);

free (da->data); /*free entire array*/

da->capacity = 0;

da->size = 0;

}

20

Size

int sizeDynArr (struct dyArr * da){

return da->size;

}

21

Get the Value at a Given Position

TYPE getDynArr (struct dyArr *da, int idx);

{ /*always make sure the input is meaningful*/

assert((sizeDynArr(da) > idx) && (idx >= 0));

return da->data[idx];

}

22

why?

Add a New Element

void addDynArr (struct dyArr * da, TYPE val){

/*make sure there is enough capacity*/

if (da->size >= da->capacity)

_dyArrDoubleCapacity(da);

da->data[da->size] = val;

da->size++; /*must increase the size*/

}

23

Double the Capacity

8size =data =

8cap =8size =

data =

16cap =

Before reallocation: After reallocation:

1. allocate new space 2. copy data to new space3. free old space 24

MUST:

old new

Double the Capacityvoid _dyArrDoubleCapacity (struct dyArray * da) {

TYPE * oldbuffer = da->data; /*memorize old*/

int oldsize = da->size;

/*allocate new memory*/

initDynArr (da, 2 * da->capacity);

for (int i = 0; i < oldsize; i++) /*copy old*/

da->data[i] = oldbuffer[i];

da->size = oldsize;

free(oldbuffer); /*free old memory*/

}25

Next Class

How to implement

– Stack

– Bag

by using Dynamic Array26