A Computer Science Tapestry 8.1 Vectors l Vectors are homogeneous collections with random access ä Store the same type/class of object, e.g., int, string,

Slides:



Advertisements
Similar presentations
C++ Templates. What is a template? Templates are type-generic versions of functions and/or classes Template functions and template classes can be used.
Advertisements

1 CSC 222: Computer Programming II Spring 2004  vectors  library, templated  advantages over arrays:  const-reference parameters  growable vectors.
Chapter 6: Arrays Java Software Solutions for AP* Computer Science
HST 952 Computing for Biomedical Scientists Lecture 9.
Sorting Algorithms. Motivation Example: Phone Book Searching Example: Phone Book Searching If the phone book was in random order, we would probably never.
An Array-Based Implementation of the ADT List public class ListArrayBased implements ListInterface { private static final int MAX_LIST = 50; private Object.
Arrays.
Main Index Contents 11 Main Index Contents Container Types Container Types Sequence Containers Sequence Containers Associative Containers Associative Containers.
Main Index Contents 11 Main Index Contents Container Types Container Types Sequence Containers Sequence Containers Associative Containers Associative Containers.
 2003 Prentice Hall, Inc. All rights reserved Sorting Arrays Sorting data –Important computing application –Virtually every organization must sort.
Searching/Sorting Introduction to Computing Science and Programming I.
Arrays Data Structures - structured data are data organized to show the relationship among the individual elements. It usually requires a collecting mechanism.
C++ for Engineers and Scientists Third Edition
Introducing Hashing Chapter 21 Copyright ©2012 by Pearson Education, Inc. All rights reserved.
Ordered Arrays An array is ordered if the elements are in ascending or descending order. The array may be ordered numerically or alphabetically (which.
1 CSC 222: Computer Programming II Spring 2005 Searching and efficiency  sequential search  big-Oh, rate-of-growth  binary search  example: spell checker.
CSE 332: C++ templates and generic programming I Motivation for Generic Programming in C++ We’ve looked at procedural programming –Reuse of code by packaging.
1 CSC 222: Computer Programming II Spring 2004 Searching and efficiency  sequential search  big-Oh, rate-of-growth  binary search Class design  templated.
Chapter 7: Arrays. In this chapter, you will learn about: One-dimensional arrays Array initialization Declaring and processing two-dimensional arrays.
Data Structures Using C++ 2E
Searching a vector We can search for one occurrence, return true/false or the index of occurrence Search the vector starting from the beginning Stop searching.
A Computer Science Tapestry 1 Recursion (Tapestry 10.1, 10.3) l Recursion is an indispensable technique in a programming language ä Allows many complex.
Week 11 Introduction to Computer Science and Object-Oriented Programming COMP 111 George Basham.
Containers Overview and Class Vector
Introduction to STL and the vector container class CS342 Data Structures Based on Ford & Topp.
Today  Table/List operations  Parallel Arrays  Efficiency and Big ‘O’  Searching.
Main Index Contents 11 Main Index Contents Week 3 – The Vector Container.
Chapter 13 Recursion. Learning Objectives Recursive void Functions – Tracing recursive calls – Infinite recursion, overflows Recursive Functions that.
CS 61B Data Structures and Programming Methodology July 28, 2008 David Sun.
CSIS 123A Lecture 9 Recursion Glenn Stevenson CSIS 113A MSJC.
Pointers OVERVIEW.
CSC 211 Data Structures Lecture 13
M180: Data Structures & Algorithms in Java Arrays in Java Arab Open University 1.
CPSC 252 The Big Three Page 1 The “Big Three” Every class that has data members pointing to dynamically allocated memory must implement these three methods:
Review 1 Arrays & Strings Array Array Elements Accessing array elements Declaring an array Initializing an array Two-dimensional Array Array of Structure.
2nd Midterm Exam December 26th, 2008, Friday 17:40 – 19:20 Places: FENS G032 Acar - Avcı FENS G035 Aydeniz - Büyükkıdık FASS G022 Büyüknacar - Demir FASS.
M1G Introduction to Programming 2 3. Creating Classes: Room and Item.
 2008 Pearson Education, Inc. All rights reserved. 1 Arrays and Vectors.
1 Chapter 13-2 Applied Arrays: Lists and Strings Dale/Weems.
Searching and Sorting Searching: Sequential, Binary Sorting: Selection, Insertion, Shell.
Course Code #IDCGRF001-A 5.1: Searching and sorting concepts Programming Techniques.
1. Searching The basic characteristics of any searching algorithm is that searching should be efficient, it should have less number of computations involved.
CSC 221: Computer Programming I Fall 2001  arrays  homogeneous collection of items, accessible via an index  initializing/traversing/displaying arrays.
Struct s (7.4) Used as data aggregates for an entity can be different types of data e.g. for student id, name, GPA, address,... Similar to classes, but.
Extra Recitations Wednesday 19:40-22:30 FENS L055 (tomorrow!) Friday 13:40-16:30 FENS L063 Friday 17: :30 FENS L045 Friday 19:40-22:30 FENS G032.
Chapter 7 Constructors and Other Tools Copyright © 2010 Pearson Addison-Wesley. All rights reserved.
Data Structures Arrays and Lists Part 2 More List Operations.
Announcements Midterm 2 is on TODAY, December 19 th at 19:40. Extra Recitation TODAY at 15:40-18:30 in FENS L062 Midterm Places: if (LastName
1 Applied Arrays Lists and Strings Chapter 12 2 Applying What You Learn Searching through arrays efficiently Sorting arrays Using character arrays as.
Kruse/Ryba Ch071 Object Oriented Data Structures Searching STL Vector Sequential Search Binary Search Comparison Trees.
Vectors of structs We can define vectors of structs struct student { unsigned int id; string name, lastname; double gpa; }; vector class(11); // a vector.
Searching/Sorting. Searching Searching is the problem of Looking up a specific item within a collection of items. Searching is the problem of Looking.
A Computer Science Tapestry 8.1 Vectors l Vectors are homogeneous collections with random access  Store the same type/class of object, e.g., int, string,
LESSON 8: INTRODUCTION TO ARRAYS. Lesson 8: Introduction To Arrays Objectives: Write programs that handle collections of similar items. Declare array.
CSC 222: Object-Oriented Programming
Announcements HW6 due this Wednesday
Announcements Final Exam on August 17th Wednesday at 16:00.
Arrays … The Sequel Applications and Extensions
What’s Left in the Course
Announcements Midterm2 grades were announced
© A+ Computer Science - Arrays and Lists © A+ Computer Science -
Announcements HW6 due this Wednesday
Vectors Vectors are homogeneous collections with random access
Vectors Vectors are homogeneous collections with random access
Chapter 13 Recursion Copyright © 2010 Pearson Addison-Wesley. All rights reserved.
Vectors Vectors are homogeneous collections with random access
Linked lists Low-level (concrete) data structure, used to implement higher-level structures Used to implement sequences/lists (see CList in Tapestry) Basis.
Vectors Vectors are homogeneous collections with random access
Presentation transcript:

A Computer Science Tapestry 8.1 Vectors l Vectors are homogeneous collections with random access ä Store the same type/class of object, e.g., int, string, … ä The 1000 th object in a vector can be accessed just as quickly as the 2 nd object l We’ve used files to store text and StringSets to store sets of strings; vectors are more general and more versatile, but are simply another way to store objects ä We can use vectors to count how many times each letter of the alphabet occurs in Hamlet or any text file ä We can use vectors to store CD tracks, strings, or any type l Vectors are a class-based version of arrays, which in C++ are more low-level and more prone to error than are Vectors

A Computer Science Tapestry 8.2 Vector basics We’re using the class tvector, need #include”tvector.h” ä Based on the standard C++ (STL) class vector, but safe ä Safe means programming errors are caught rather than ignored: sacrifice some speed for correctness ä In general correct is better than fast, programming plan: Make it run Make it right Make it fast Vectors are typed, when defined must specify the type being stored, vectors are indexable, get the 1 st, 3 rd, or 105 th element tvector ivals(10); // store 10 ints vals[0] = 3; tvector svals(20); // store 20 strings svals[0] = “applesauce”;

A Computer Science Tapestry 8.3 Tracking Dice, see dieroll2.cpp const int DICE_SIDES = 4; int main() { int k, sum; Dice d(DICE_SIDES); tvector diceStats(2*DICE_SIDES+1); int rollCount = PromptRange("how many rolls",1,20000); for(k=2; k <= 2*DICE_SIDES; k++) { diceStats[k] = 0; } for(k=0; k < rollCount; k++) { sum = d.Roll() + d.Roll(); diceStats[sum]++; } cout << "roll\t\t# of occurrences" << endl; for(k=2; k <= 2*DICE_SIDES; k++) { cout << k << "\t\t" << diceStats[k] << endl; } return 0; } diceStats

A Computer Science Tapestry 8.4 Defining tvector objects l Can specify # elements in a vector, optionally an initial value tvector values(300); // 300 ints, values ?? tvector nums(200,0); // 200 ints, all zero tvector d(10,3.14); // 10 doubles, all pi tvector w(10,"foo");// 10 strings, "foo" tvector words(10); // 10 words, all "" The class tvector stores objects with a default constructor  Cannot define tvector cubes(10); since Dice doesn’t have default constructor  Standard class vector relaxes this requirement if vector uses push_back, tvector requires default constructor

A Computer Science Tapestry 8.5 Vectors as lists l The “vector as counters” example constructs and initializes a vector with a specific number of elements l Other uses of vector require the vector to “grow” to accommodate new elements ä Consider reading words from Hamlet, storing them in a vector ä How big should we define vector to be initially? What are potential problems? ä Analogy of shopping list on the refrigerator, what happens when we run out of room on the list? l When a vector is used as a list we’ll use a different method for adding elements to the vector so that the vector can “grow” ä The vector grows itself, we (as client programmers) don’t

A Computer Science Tapestry 8.6 Reading words into a vector tvector words; string w; string filename = PromptString("enter file name: "); ifstream input(filename.c_str()); while (input >> w) { words.push_back(w); } cout << "read " << words.size() << " words" << endl; cout << "last word read is " << words[words.size() - 1] << endl; What header files are needed? What happens with Hamlet ? Where does push_back() put a string?

A Computer Science Tapestry 8.7 Using tvector::push_back The method push_back adds new objects to the “end” of a vector, creating new space when needed ä The vector must be defined initially without specifying a size ä Internally, the vector keeps track of its capacity, and when capacity is reached, the vector “grows” ä A vector grows by copying old list into a new list twice as big, then throwing out the old list l The capacity of a vector doubles when it’s reached: 0, 2, 4, 8, 16, 32, … ä How much storage used/wasted when capacity is 1024? ä Is this a problem?

A Computer Science Tapestry 8.8 Comparing size() and capacity() When a vector is defined with no initial capacity, and push_back is used to add elements, size() returns the number of elements actually in the vector  This is the number of calls of push_back() if no elements are deleted  If elements deleted using pop_back(), size updated too The capacity of vector is accessible using tvector::capacity(), clients don’t often need this value  An initial capacity can be specified using reserve() if client programs know the vector will resize itself often  The function resize() grows a vector, but not used in conjunction with size() – clients must track # objects in vector separately rather than vector tracking itself

A Computer Science Tapestry 8.9 Passing vectors as parameters l Vectors can be passed as parameters to functions ä Pass by reference or const reference (if no changes made) ä Passing by value makes a copy, requires time and space void ReadWords(istream& input, tvector & v); // post: v contains all strings in input, // v.size() == # of strings read and stored void Print(const tvector & v) // pre: v.size() == # elements in v // post: elements of v printed to cout, one per line If tvector::size() is not used, functions often require an int parameter indicating # elements in vector

A Computer Science Tapestry 8.10 Vectors as data members l A tvector can be a (private) instance variable in a class ä Constructed/initialized in class constructor ä If size given, must be specified in initializer list class WordStore { public: WordStore(); private: tvector myWords; }; WordStore::WordStore() : myWords(20) { }  What if push_back() used? What if reserve() used?

A Computer Science Tapestry 8.11 Vectors as data members (continued) l It’s not possible to specify a size in the class declaration ä Declaration is what an object looks like, no code involved ä Size specified in constructor, implementation.cpp file class WordStore { private: tvector myWords(20); // NOT LEGAL SYNTAX! }; l If push_back is used, explicit construction not required, but ok WordStore::WordStore() : myWords() // default, zero-element constructor { }  No () ’s for local variable: tvector words;

A Computer Science Tapestry 8.12 David Gries l Advocates formal methods as integral part of program development ä Formal means well- founded mathematically ä Loop invariants are an example of formalisms that help program development A programmer needs a bag of ticks, a collection of methods for attacking a problem. … One technique will never suffice l In 1999 is developing a CD- based book for learning to program with Java

A Computer Science Tapestry 8.13 Picking a word at random l Suppose you want to choose one of several words at random, e.g., for playing a game like Hangman  Read words into a vector, pick a random string from the vector by using a RandGen or Dice object. Drawbacks? ä Read words, shuffle the words in the vector, return starting from front. Drawbacks? l Steps: read words into vector, shuffle, return one-at-a-time ä Alternatives: use a class, read is one method, pick at random is another method ä Don’t use a class, test program with all code in main, for example

A Computer Science Tapestry 8.14 First approach, pick a word at random tvector words; string w, filename = “words.txt”; RandGen gen; ifstream input(filename.c_str()); while (input >> w) { words.push_back(w); } for(k=0; k < words.size(); k++) { int index = gen.RandInt(0,words.size()-1); cout << words[index] << endl; } l What could happen in the for-loop? Is this desired behavior?

A Computer Science Tapestry 8.15 Shuffling the words ( shuffle.cpp ) tvector words; string w, filename = “words.txt”; RandGen gen; ifstream input(filename.c_str()); while (input >> w) { words.push_back(w); } // note: loop goes to one less than vector size for(k=0; k < words.size()-1; k++) { int index = gen.RandInt(k,words.size()-1); string temp = words[k]; words[k] = words[index]; words[index] = temp; } // Print all elements of vector here l Key ideas: swapping elements, choosing element “at random” ä All arrangements/permuations equally likely

A Computer Science Tapestry 8.16 Why this is a good shuffling technique l Suppose you have a CD with 5 tracks, or a vector of 5 words ä The first track stays where it is one-fifth of the time, that’s good, since 1/5 of all permutations have track one first ä If the first track is swapped out (4/5 of the time) it will then end up in the second position with probability 1/4, that’s 4/5 x 1/4 = 1/5 of the time, which is what we want  Also note five choices for first entry, # arrangements is 5x4x3x2x1 = 5! Which is what we want. l One alternative, make 5 passes, with each pass choose any of the five tracks/words for each position  Number of arrangements is 5x5x5x5x5 > 5!, not desired, there must be some “repeat” arrangements

A Computer Science Tapestry 8.17 tvector details, optimizations l Space/storage is “wasted” if we use push_back and a vector resizes itself many times ä Don’t need to worry about this in most cases, storage lost is in many ways minimal (not too bad in any case) l We can reserve storage so that vector doesn’t waste space, fills reserved spaces allocated tvector iv; iv.reserve(1024); // room to grow up to 1,024 int x = iv.size(); // stores zero in x Can also use resize(), this “grows” vector and changes size iv.resize(512); //size changes, maybe capacity

A Computer Science Tapestry 8.18 Vector idioms: insertion and deletion It’s easy to insert at the end of a vector, use push_back() ä We may want to keep the vector sorted, then we can’t just add to the end ä Why might we keep a vector sorted? l If we need to delete an element from a vector, how can we “close-up” the hole created by the deletion? ä Store the last element in the deleted spot, decrease size ä Shift all elements left by one index, decrease size In both cases we decrease size, this is done using pop_back()  Analagous to push_back(), changes size, not capacity

A Computer Science Tapestry 8.19 Insert into sorted vector void insert(tvector & a, const string& s) // pre: a[0] <= … <= a[a.size()-1], a is sorted // post: s inserted into a, a still sorted { int count = a.size(); // size before insertion a.push_back(s); // increase size int loc = count; // insert here? // invariant: for k in [loc+1..count], s < a[k] while (0 <= loc && s < a[loc-1]) { a[loc] = a[loc-1]; loc--; } a[loc] = s; } l What if s belongs last? Or first? Or in the middle?

A Computer Science Tapestry 8.20 What about deletion? void remove(tvector & a, int pos) // post: original a[pos] removed, size decreased { int lastIndex = a.size()-1; a[pos] = a[lastIndex]; a.pop_back(); } l How do we find index of item to be deleted? l What about if vector is sorted, what changes? What’s the purpose of the pop_back() call?

A Computer Science Tapestry 8.21 Deletion from sorted vector

A Computer Science Tapestry 8.22 Deletion from sorted vector void remove(tvector & a, int pos) // pre: a is sorted // post: original a[pos] removed, a sorted { int lastIndex = a.size()-1; int k; for(k=pos; k < lastIndex; k++) { a[k] = a[k+1]; } a.pop_back(); } l What happens if we start at lastIndex and shift right? Does pop_back() remove an element?

A Computer Science Tapestry 8.23 Searching a vector l We can search for one occurrence, return true/false or index ä Sequential search, every element examined ä Are there alternatives? Are there reasons to explore these? l We can search for number of occurrences, count “the” in a vector of words, count jazz CDs in a CD collection ä Search entire vector, increment a counter ä Similar to one occurrence search, differences? l We can search for many occurrences, but return occurrences rather than count ä Find jazz CDs, return a vector of CDs

A Computer Science Tapestry 8.24 Counting search void count(tvector & a, const string& s) // pre: number of elements in a is a.size() // post: returns # occurrences of s in a { int count = 0; int k; for(k=0; k < a.size(); k++) { if (a[k] == s) { count++; } return count; } l How does this change for true/false single occurrence search?

A Computer Science Tapestry 8.25 Collecting search void collect(tvector & a, const string& s, tvector & matches) // pre: number of elements in a is a.size() // post: matches contains all elements of a with // same first letter as s { int k; matches.clear(); // size is zero, capacity? for(k=0; k < a.size(); k++) { if (a[k].substr(1,0) == s.substr(1,0)) { matches.push_back(a[k]); } What does clear() do, similar to resize(0) ?

A Computer Science Tapestry 8.26 Algorithms for searching l If we do lots of searching, we can do better than sequential search aka linear search where we look at all vector elements ä Why might we want to do better? ä Analogy to “guess a number” between 1 and 100, with response of high, low, or correct l In guess-a-number, how many guesses needed to guess a number between 1 and 1,000? Why? ä How do you reason about this? ä Start from similar, but smaller/simpler example ä What about looking up word in dictionary, number in phone book given a name? ä What about looking up name for given number?

A Computer Science Tapestry 8.27 Binary search l If a vector is sorted we can use the sorted property to eliminate half the vector elements with one comparison using < ä What number do we guess first in game? ä What page do we turn to first in the dictionary? l Idea of creating program to do binary search ä Consider range of entries search key could be in, eliminate half the the entries if the middle element isn’t the key ä How do we know when we’re done? ä Is this harder to get right than sequential search?

A Computer Science Tapestry 8.28 Binary search code, is it correct? int bsearch(const tvector & list, const string& key) // pre: list.size() == # elements in list, list is sorted // post: returns index of key in list, -1 if key not found { int low = 0; // leftmost possible entry int high = list.size()-1; // rightmost possible entry int mid; // middle of current range while (low <= high) { mid = (low + high)/2; if (list[mid] == key) // found key, exit search { return mid; } else if (list[mid] < key) // key in upper half { low = mid + 1; } else // key in lower half { high = mid - 1; } return -1; // not in list }