Presentation is loading. Please wait.

Presentation is loading. Please wait.

Using Arrays in Abstract Data Types

Similar presentations


Presentation on theme: "Using Arrays in Abstract Data Types"— Presentation transcript:

1 Using Arrays in Abstract Data Types

2 What is an Abstract Data Type
A built-in data type is an int, float, double, etc. An Abstract Data Type (ADT) is a collection of data and a set of operations on the data. You can use an ADT’s operations, if you know their specifications, without knowing how the operations are implemented or how the data is stored. Ultimately, you will implement an ADT with a data-structure, which is a construct you can define within a programming language to store a collection of data. Examples of ADT: lists, stacks, queues, trees, graphs, etc.

3 WHAT ARE BASIC OPERATIONS ON A LIST?
ADT: SIMPLE LIST Examples of lists: lists of student id’s in a class, grocery items, lists of records in a collection, list of club members, etc…. WHAT ARE BASIC OPERATIONS ON A LIST? Create a list Insert an element Arrange elements in sorted order Find if an element is in the list Delete an element Print the list of elements

4 What operations are likely to be performed on lists?
Grocery items: Chips Salsa Coke Tissues Sprite Jelly beans Original list Grocery items: Chips Salsa Coke Tissues Sprite Jelly beans Beer Add Beer Grocery items: Chips Salsa Coke Sprite Jelly beans Beer Delete tissues Grocery items: Beer Chips Coke Jelly beans Salsa Sprite Sort alphabetically Grocery items: Beer Coke Sprite Jelly beans Chips Salsa Sort by grocery aisles Create/Insert an element Delete an element Arrange elements in sorted order (whatever sort criteria) Print the list of elements Find if an element is in the list Print statistics about list (if numeric) Is beer on the list?

5 Implementation of the ADT List
One way to implement a “list” is using an array to hold the elements in the list….. Now have to figure out how to : insert, delete, sort, find, etc…. In the next lessons, we will slowly build up these functionalities until we can integrate them all into a “list” program. EVENTUAL GOAL : CREATE A PROGRAM TO MAINTAIN A LIST OF STUDENTS……….

6 Let’s make a simpler list
Instead of strings, we will have a list of letters const int MAXCHARS = 8; char alpharray[MAXCHARS]; B J K M S Z

7 Print Elements in a list
for (i=0; i<numofelements; i++) cout << alpharray[i] << endl; Input elements into the list: // numtoinsert should be set to the number of initial elements to insert for (i=0; i<numtoinsert; i++) cin >> alpharray[i];

8 Insert an element into an array
Simple insert routine: find end of array, insert element: alpharray[endofarray] = newelement; endofarray++; B J K M S Z Before: After inserting L B J K M S Z L

9 Insert a letter in the list
Should it be inserted at the end of the list (in this case we need to know what is the end of the list)? Should the new element be inserted into the beginning of the list? Is the list stored in some special order and elements should be inserted to maintain that order – e.g., if the list is stored in alphabetical order the new element must be inserted in alphabetical order? Should the user choose where to store the new element?

10 INSERTING INTO A ARRAY BASED Alphabetical LIST
Assume the following letters are stored in array named alpharray: B, J, K, M, S, and Z. Write a program which calls a function adlet(), which accepts both the alphabet array and a new letter as parameters and inserts the new letter in the correct alphabetical order in the alphabet array. alphabet [0] [1] [2] [3] [4] [5] [6] [7] …... B J K M S Z Before: B J K L M S Z After adding ‘L’

11 Prompt user for new letter to add
ALGORITHM: Prompt user for new letter to add Find the position (index) of where this letter should go in the alphabetical array. (This is called a linear search.) Move all letters after this position down to free up the space Insert letter into array ****

12 #include <iostream> void insertletter(char[],char,int&);
int main() { const int MAXCHARS = 30; const int STARTCHARS=6; char alpharray[MAXCHARS] = {‘B’, ‘J’, ‘K’, ‘M’,’S’,’Z’}; char newlet; int sizeofarray=STARTCHARS; while (5) { //loop forever cout << “ Enter a letter to add:”; cin >> newlet; insertletter(alpharray,newlet,sizeofarray); } CONTINUED…..

13 Find position for new letter
while (alpharray[i] < addlet && i < sizeofarray) i++; newpos =i;

14 Find position for new letter
//move chars over --- should check for full array first if (sizeofarr == MAXCHARS) ….. for (i=sizeofarr; i>newpos; i--) alpharray[i] = alpharray[i-1];

15 void insertletter(char alpharray[], char addlet, int& sizeofarr)
{ int i=0, endpos,newpos; //find position for new letter while (alpharray[i] < addlet && i < sizeofarr) i++; newpos =i; //move chars over --- should check for full array first for (i=sizeofarr; i>newpos; i--) alpharray[i] = alpharray[i-1]; alpharray[newpos] = addlet; //insert new letter sizeofarr++; //print out array for(i=0; i<sizeofarr; i++) cout <<alpharray[i]; }

16 Analysis of the simple insertion algorithm
In the worst case --- How many comparisons are needed to find the position of the letter to be inserted? In the worst case --- How many letters have to be shifted to make room for a new letter to be inserted? Are these the same cases?

17 What happens if the array is full?
void insertletter(char alpharray[], char addlet, int& sizeofarr) { int i=0, endpos,newpos; //find position for new letter while (alpharray[i] < addlet && i < sizeofarr) i++; newpos =i; //move chars over --- should check for full array first for (i=sizeofarr; i>newpos; i--) alpharray[i] = alpharray[i-1]; alpharray[newpos] = addlet; //insert new letter sizeofarr++; //print out array for(i=0; i<sizeofarr; i++) cout <<alpharray[i]; If (sizeofarr == 0) { alpharray[0] = addlet; sizeofarr++; return 0; } What happens if the array is full? Can we use this code to insert elements into an empty list?

18 Delete an element from a list
Must find the element to delete: Then move everything over

19 Delete Let’s assume we are given the position of the item to delete in delpos; DeleteElement(char alpharray[], int delpos, int& sizeofarr) { for (i=delpos+1; i<sizeofarr; i++) alpharray[i-1] = alpharray[i]; sizeofarr--; }

20 ADT LIST: DONE: Insert element at end of a list; Insert element into previously sorted list TO DO: Sort List, Delete element, Create list, Find Element…..

21 ADT: List Operation: sort. Given a list of unordered values in an array, sort the values so that they can be printed in sorted order.

22 SIMPLE Sorting Sorting is a typical operation to put the elements in an array in order. Internal Sorts [for small data sets] selection bubble (exchange) External Sorts [for large data sets]

23 Simple Sorting Selection sort
Find smallest element, and put at the head of the list, repeat with remainder of list. The algorithm can also be formulated by finding the largest element and putting that at the head of the list

24 Selection Sort 0 2 swap 21, 9 1 1 swap 13, 13 2 3 swap 21, 15
Find smallest element, and put at the head of the list,repeat with remainder of list Selection Sort index (k) sm_index swap 21, 9 swap 13, 13 swap 21, 15 swap 21, 17 21 15 9 13 17 Scan 1 Scan 2 Scan 3 Scan 4

25 Selection Sort const int size = 5; void sort(double [size]);
void swap(double [size], int, int) // prototypes int main(void) { int index; double my_list[ ] = {21, 13, 9, 15, 17}; sort(my_list); // function call cout<<"\nThe sorted array is: \n"; for(index=0; index<size; index++) cout<<'\t'<<my_list[index]<<endl; }

26 Let’s build up the algorithm
outer loop – array scans, each scan starts from the element after the previous scan inner loop – find smallest element swap smallest element with start of scan next outer loop

27 smallest=testArray[k]; //value of the smallest
Find Minimum void minimum(double testArray[], int k) { int j, sm_index; double smallest; // find the minimum from the k-th to the end in testArray[] } smallest=testArray[k]; //value of the smallest sm_index=k; //index of the smallest …… for(j=k+1; j<size; j++) if(testArray[j]<smallest) { smallest=testArray[j]; sm_index=j; }

28 smallest=testArray[k]; sm_index=k;
Selection Sort void sort(double testArray[]) { int j, k, sm_index; double smallest; for(k=0; k<size-1; k++) // size-1 = number of passes { } smallest=testArray[k]; sm_index=k; swap(testArray, sm_index, k); // call to swap() for(j=k+1; j<size; j++) if(testArray[j]<smallest) { smallest=testArray[j]; sm_index=j; }

29 Selection Sort void swap(double testArray[], int smaller, int pass) { // pass = current position: k double temp; temp=testArray[pass]; testArray[pass]=testArray[smaller]; testArray[smaller]=temp; }

30 for(k=0; k<size-1; k++) // size-1 = number of passes
{ } smallest=testArray[k]; sm_index=k; swap(testArray, sm_index, k); // call to swap() for(j=k+1; j<size; j++) if(testArray[j]<smallest) { smallest=testArray[j]; sm_index=j; } How many times is the inner if statement called? How many times is the “sm_index” being reset? How many times is the swap() function called?

31 Bubble sort (sinking sort)
4.6 Sorting Arrays Sorting data Important computing application Virtually every organization must sort some data Massive amounts must be sorted Bubble sort (sinking sort) Several passes through the array Successive pairs of elements are compared If increasing order (or identical), no change If decreasing order, elements exchanged Repeat these steps for every element

32 Simple Sorting Bubble sort
As we scan the list swap elements out of order. After the first scan, the largest element will be at the end of the list. Keep scanning the list until all of the elements are in the correct place. Bubble sort – because the small elements bubble up to the top…..

33 4.6 Sorting Arrays Example:
Go left to right, and exchange elements as necessary One pass for each element Original: Pass 1: (elements exchanged) Pass 2: Pass 3: (no changes needed) Pass 4: Pass 5: Small elements "bubble" to the top (like 2 in this example)

34 Bubble Sort 21 25 13 9 17 Put smaller first No change

35 Bubble Sort 21 17 9 13 25 Begin again and put smaller first No change Put smaller first

36 Bubble Sort Example 2 13 25 19 18 12 Begin --Put smaller first Put smaller first No change 13 25 18 19 12 19 25 18 13 12 19 25 18 13 12

37 Bubble Sort – Example 2 19 12 13 18 25 Begin again and put smaller first No change Put smaller first

38 Bubble Sort – Example 2 12 19 13 18 25 Begin again -- no change Swap – put smaller first Begin Again -- swap Sorted list 12 19 13 18 25 18 19 13 12 25 18 19 12 13 25

39 Let’s build up the algorithm – bubble sort
outer loop – array scans, each scan starts from the first element of the list until _________ inner loop compare adjacent elements and swap next outer loop

40 4.6 Sorting Arrays Swapping variables What happened? Solution
int x = 3, y = 4; y = x; x = y; What happened? Both x and y are 3! Need a temporary variable Solution int x = 3, y = 4, temp = 0; temp = x; // temp gets 3 x = y; // x gets 4 y = temp; // y gets 3

41 fig04_16.cpp (1 of 3) 1 // Fig. 4.16: fig04_16.cpp
// This program sorts an array's values into ascending order. #include <iostream> 4 using std::cout; using std::endl; 7 #include <iomanip> 9 10 using std::setw; 11 12 int main() 13 { const int arraySize = 10; // size of array a int a[ arraySize ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }; int hold; // temporary location used to swap array elements 17 cout << "Data items in original order\n"; 19 // output original array for ( int i = 0; i < arraySize; i++ ) cout << setw( 4 ) << a[ i ]; 23 fig04_16.cpp (1 of 3)

42 Do a pass for each element in the array.
// bubble sort // loop to control number of passes for ( int pass = 0; pass < arraySize - 1; pass++ ) 27 // loop to control number of comparisons per pass for ( int j = 0; j < arraySize – 1 - pass; j++ ) 30 // compare side-by-side elements and swap them if // first element is greater than second element if ( a[ j ] > a[ j + 1 ] ) { hold = a[ j ]; a[ j ] = a[ j + 1 ]; a[ j + 1 ] = hold; 37 } // end if 39 Do a pass for each element in the array. fig04_16.cpp (2 of 3) If the element on the left (index j) is larger than the element on the right (index j + 1), then we swap them. Remember the need of a temp variable.

43 fig04_16.cpp (3 of 3) fig04_16.cpp output (1 of 1)
cout << "\nData items in ascending order\n"; 41 // output sorted array for ( int k = 0; k < arraySize; k++ ) cout << setw( 4 ) << a[ k ]; 45 cout << endl; 47 return 0; // indicates successful termination 49 50 } // end main fig04_16.cpp (3 of 3) fig04_16.cpp output (1 of 1) Data items in original order Data items in ascending order

44 Can we improve the algorithm?
In the first example, we did not have to keep scanning the list since the list was sorted after the “2nd” scan…… Check to see if any swaps were performed on the previous inner loop. If none were performed do not scan the list anymore since it is sorted WE CAN END THE ALGORITHM EARLY: EARLY TERMINATION how can we accomplish this?

45 Possible early termination Bubble sort with early termination
int flag = 1; for ( int pass = 0; (pass < arraySize – 1) && flag; pass++ ) flag = 0; // loop to control number of comparisons per pass for ( int j = 0; j < arraySize – 1 - pass; j++ ) 30 // compare side-by-side elements and swap them if // first element is greater than second element if ( a[ j ] > a[ j + 1 ] ) { hold = a[ j ]; a[ j ] = a[ j + 1 ]; a[ j + 1 ] = hold; flag = 1; //set flag since swap occurred 37 } // end if 39 Possible early termination Bubble sort with early termination

46 How many times does the outer loop execute in the worst case?
// bubble sort // loop to control number of passes for ( int pass = 0; pass < arraySize - 1; pass++ ) 27 // loop to control number of comparisons per pass for ( int j = 0; j < arraySize – 1 - pass; j++ ) 30 // compare side-by-side elements and swap them if // first element is greater than second element if ( a[ j ] > a[ j + 1 ] ) { hold = a[ j ]; a[ j ] = a[ j + 1 ]; a[ j + 1 ] = hold; 37 } // end if 39 How many times does the outer loop execute in the worst case? How many times is the swap performed (inner loop) in the worst case?

47 ADT LIST So far we have seen the following operations on a “list”: Adding an element Deleting an element Sorting the list for display Computing statistics on a list of numeric values Last operation Finding an element in a list

48 Finding an element is important:
FOR DELETION: usually you must “find” the element before deleting it…. FOR INSERTION: must find the place to insert an element (if not in alphabetic order)…. TO PRINT: i.e., find students name & print grade

49 4.8 Searching Arrays: Linear Search and
Search array for a key value Linear search Key value is the value to be searched for. It is usually inputted by the user. Compare each element of array with key value Start at one end, go to other If the element is found, return the index number of the array. Remember --- we do not usually need to return the value, we know the value since it is what we were searching for. We need to know the POSITION of the value, i.e., its index.

50 Finding an element in an array
SEARCHING Finding an element in an array Example: Given an array which contains a list of integers, find the index of a particular integer. index of 24 is index of 100 is 6 index of 35 is NOT FOUND

51 Takes array, search key, and array size.
// Fig. 4.19: fig04_19.cpp // Linear search of an array. #include <iostream> 4 using std::cout; using std::cin; using std::endl; 8 int linearSearch( const int [], int, int ); // prototype 10 11 int main() 12 { const int arraySize = 100; // size of array a int a[ arraySize ]; // create array a int searchKey; // value to locate in a 16 for ( int i = 0; i < arraySize; i++ ) // create some data a[ i ] = 2 * i; 19 cout << "Enter integer search key: "; cin >> searchKey; 22 // attempt to locate searchKey in array a int element = linearSearch( a, searchKey, arraySize ); 25 fig04_19.cpp (1 of 2) Takes array, search key, and array size.

52 fig04_19.cpp (2 of 2) 26 // display results 27 if ( element != -1 )
cout << "Found value in element " << element << endl; else cout << "Value not found" << endl; 31 return 0; // indicates successful termination 33 34 } // end main 35 36 // compare key to every element of array until location is 37 // found or until end of array is reached; return subscript of 38 // element if key or -1 if key not found 39 int linearSearch( const int array[], int key, int sizeOfArray ) 40 { for ( int j = 0; j < sizeOfArray; j++ ) 42 if ( array[ j ] == key ) // if found, return j; // return location of key 45 return -1; // key not found 47 48 } // end function linearSearch fig04_19.cpp (2 of 2)

53 fig04_19.cpp output (1 of 1) Enter integer search key: 36
Found value in element 18 Enter integer search key: 37 Value not found fig04_19.cpp output (1 of 1)

54 Linear Search Analysis
In the worst case, how many elements have to be compared? int linearSearch( const int array[], int key, int sizeOfArray ) 40 { for ( int j = 0; j < sizeOfArray; j++ ) 42 if ( array[ j ] == key ) // if found, return j; // return location of key 45 return -1; // key not found 47 48 } // end function linearSearch

55 Analysis IF an element is not in the array, all of the elements in the array have to be checked to determine that a particular element is not there. FOR EXAMPLE: if there are 10 elements in the array, 10 comparisons have to be made in the worst case. Therefore, if there are n elements in the array... n comparisons have to be made in the worst case

56 What if the array were already sorted?
Search for an element in a sorted array. Do we have to check all of the elements if we know something about the order of the array? No -- we can search until we know the element cannot appear anymore, i.e. array[j] > target. However in the worst case the # of comparisons is still the number of elements in the array, I.e. we have to check all of the elements in the array

57 Better Linear Search for Sorted Array
“Early termination” --- int linearSearchSorted( const int array[], int key, int sizeOfArray ) 40 { int j = 0; while ( j < sizeOfArray-1 && key < array[j]) j++ ; 42 if ( array[ j ] == key ) // if found, return j; // return location of key 45 return -1; // key not found 47 48 } // end function linearSearch

58 How to use a telephone book

59 To find the name “Randy Jackson”
you would not start with Aardvark and continue until you hit the name...

60 start Input item; set lower index to zero set upper index to size-1 no While lower index < upper index Return -1 Calculate midpoint yes Item == midpoint? Return index no found/not found Loop until yes Set lower index to midpoint + 1 Item > midpoint Set upper index to midpoint-1 no

61 1 3 4 7 29 45 69 100 134 156 200 Example 1: Looking for the number 140
high low low Midpoint high Midpoint high low Midpoint low high How many comparisons? 3

62 1 3 4 7 29 45 69 100 134 156 200 Example 1: Looking for the number 7
low Midpoint high Midpoint high low Midpoint low high How many comparisons? 3

63 fig04_20.cpp (1 of 6) 1 // Fig. 4.20: fig04_20.cpp
// Binary search of an array. #include <iostream> 4 using std::cout; using std::cin; using std::endl; 8 #include <iomanip> 10 11 using std::setw; 12 13 // function prototypes 14 int binarySearch( const int [], int, int, int, int ); 15 void printHeader( int ); 16 void printRow( const int [], int, int, int, int ); 17 18 int main() 19 { const int arraySize = 15; // size of array a int a[ arraySize ]; // create array a int key; // value to locate in a 23 for ( int i = 0; i < arraySize; i++ ) // create some data a[ i ] = 2 * i; 26 fig04_20.cpp (1 of 6)

64 27 cout << "Enter a number between 0 and 28: ";
cin >> key; 29 printHeader( arraySize ); 31 // search for key in array a int result = binarySearch( a, key, 0, arraySize - 1, arraySize ); 35 // display results if ( result != -1 ) cout << '\n' << key << " found in array element " << result << endl; else cout << '\n' << key << " not found" << endl; 42 return 0; // indicates successful termination 44 45 } // end main 46 fig04_20.cpp (2 of 6)

65 Determine middle element
47 // function to perform binary search of an array 48 int binarySearch( const int b[], int searchKey, int low, int high, int size ) 50 { int middle; 52 // loop until low subscript is greater than high subscript while ( low <= high ) { 55 // determine middle element of subarray being searched middle = ( low + high ) / 2; 58 // display subarray used in this loop iteration printRow( b, low, middle, high, size ); 61 fig04_20.cpp (3 of 6) Determine middle element

66 Use the rule of binary search: If key equals middle, match
while ( low <= high ) { 55 // determine middle element of subarray being searched middle = ( low + high ) / 2; 58 // display subarray used in this loop iteration printRow( b, low, middle, high, size ); // if searchKey matches middle element, return middle if ( searchKey == b[ middle ] ) // match return middle; 65 else 67 // if searchKey less than middle element, // set new high element if ( searchKey < b[ middle ] ) high = middle - 1; // search low end of array 72 // if searchKey greater than middle element, // set new low element else low = middle + 1; // search high end of array } 78 return -1; // searchKey not found 80 81 } // end function binarySearch Use the rule of binary search: If key equals middle, match If less, search low end If greater, search high end Loop sets low, middle and high dynamically. If searching the high end, the new low is the element above the middle.

67 fig04_20.cpp (5 of 6) 82 83 // print header for output
84 void printHeader( int size ) 85 { cout << "\nSubscripts:\n"; 87 // output column heads for ( int j = 0; j < size; j++ ) cout << setw( 3 ) << j << ' '; 91 cout << '\n'; // start new line of output 93 // output line of - characters for ( int k = 1; k <= 4 * size; k++ ) cout << '-'; 97 cout << endl; // start new line of output 99 100 } // end function printHeader 101 fig04_20.cpp (5 of 6)

68 102 // print one row of output showing the current
103 // part of the array being processed 104 void printRow( const int b[], int low, int mid, int high, int size ) 106 { // loop through entire array for ( int m = 0; m < size; m++ ) 109 // display spaces if outside current subarray range if ( m < low || m > high ) cout << " "; 113 // display middle element marked with a * else 116 if ( m == mid ) // mark middle value cout << setw( 3 ) << b[ m ] << '*'; 119 // display other elements in subarray else cout << setw( 3 ) << b[ m ] << ' '; 123 cout << endl; // start new line of output 125 126 } // end function printRow fig04_20.cpp (6 of 6)

69 fig04_20.cpp output (1 of 2) Enter a number between 0 and 28: 6
Enter a number between 0 and 28: 6 Subscripts: * * 6 found in array element 3 Enter a number between 0 and 28: 25 * 24 26* 28 24* 25 not found fig04_20.cpp output (1 of 2)

70 fig04_20.cpp output (2 of 2) Enter a number between 0 and 28: 8
Subscripts: * * 8 10* 12 8* 8 found in array element 4 fig04_20.cpp output (2 of 2)

71 SEARCH ALGORITHM BEST CASE WORST CASE
Sorted array: SEARCH ALGORITHM BEST CASE WORST CASE Entire array Linear Search 1 1 Binary Search The number of times you can divide the array by 2 = log2(#elems_in_array) *******

72 What does log2 mean? Z Z 22 2x Z 23 Z elements
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x is the number of times I can keep splitting the list until there is only 1 element left xxxxxxxxxxxxxxxxxxxxxxxx Z/2 elements xxxxxxxxxxx Z Z 2x =1? Log2 z = x 22 Z/2/2 elements xxxxxx Z Z/2/2/2 elements 23

73 Powers of 2 Below are tables for the power 2x x 2x 1 2 3 4 5 6 7 8 9 10 11 12 13 16 32 64 128 256 512 1024 2048 4096 8192 14 15 16 17 18 19 20 21 22 16384 32768 65536 131072 262144 524288

74 SEARCH ALGORITHM BEST CASE WORST CASE
n Linear Search 1 1 Log2(n) Binary Search For an ORDERED array of n elements

75 SEARCH ALGORITHM BEST CASE WORST CASE
What about an unsorted array? SEARCH ALGORITHM BEST CASE WORST CASE 1 Linear Search n NOT APPLICABLE Binary Search


Download ppt "Using Arrays in Abstract Data Types"

Similar presentations


Ads by Google