4/18/2013 Linear Structure Linear Structures Every non-empty linear structure has A unique element called first A unique element called last Every element except last has a unique successor Chapter 4 Every element except first has a unique predecessor CPTR 318 1 2 Implementations Array details Array For an array A of size n , where n > 0 : Contiguous memory First element: A [0] Space needed only for data Last element: A [ n – 1] Insertions and deletions may require data movement Predecessor of A [ i ] , for all i > 0 : A [ i – 1] Linked list Successor of A [ i ] , for all i < n – 1 : A [ i + 1] Non-contiguous memory Data and links both require space n Insertions and deletions require no data movement A i − 1 n − 1 0 i i + 1 List details Operations template <typename T> template <typename T> struct Node class List { { Operation Array Linked List T data; Node<T> *head, *tail; Node *prev, *next; // Methods omitted … Searching O( n ) O( n ) }; }; Ordered Search O(log n ) O( n ) For a list L , where L .head is not null, and p is a Node<T> pointer to an element in the list: Insertion O( n ) O(1) First element: L .head Deletion O( n ) O(1) Last element: L .tail Sorting O( n log n ) O( n log n ) Predecessor of p , for all p ≠ L .head : p ->prev Random Access O(1) O( n ) Successor of p , for all p ≠ L .tail : p ->next 1
4/18/2013 Operations Operations Operation Array Linked List Operation Array Linked List Searching O( n ) O( n ) Searching O( n ) O( n ) Ordered Search O(log n ) O( n ) Ordered Search O(log n ) O( n ) Insertion O( n ) O(1) Insertion O( n ) O(1) Deletion O( n ) O(1) Deletion O( n ) O(1) Sorting O( n log n ) O( n log n ) Sorting O( n log n ) O( n log n ) Random Access O(1) O( n ) Random Access O(1) O( n ) Operations Operations Operation Array Linked List Operation Array Linked List Searching O( n ) O( n ) Searching O( n ) O( n ) Ordered Search O(log n ) O( n ) Ordered Search O(log n ) O( n ) Insertion O( n ) O(1) Insertion O( n ) O(1) Deletion O( n ) O(1) Deletion O( n ) O(1) Sorting O( n log n ) O( n log n ) Sorting O( n log n ) O( n log n ) Random Access O(1) O( n ) Random Access O(1) O( n ) Operations Operations Operation Array Linked List Operation Array Linked List Searching O( n ) O( n ) Searching O( n ) O( n ) Ordered Search O(log n ) O( n ) Ordered Search O(log n ) O( n ) Insertion O( n ) O(1) Insertion O( n ) O(1) Deletion O( n ) O(1) Deletion O( n ) O(1) Sorting Sorting O( n log n ) O( n log n ) O( n log n ) O( n log n ) Random Access O(1) Random Access O(1) O( n ) O( n ) 2
4/18/2013 Specialized Linear Structures Stack Stack LIFO LIFO Operations Operations: push, pop, top push Queue pop FIFO top Operations: enqueue, dequeue, first Applications Deque Depth-first search Access at both ends Recursive evaluation Operations: insert_front, insert_back, delete_front, delete_back, front, back Queue Circular Queue FIFO Operations Page 131 enqueue dequeue front Applications Breadth-first search Scheduling Simulations Encapsulation — Good! Encapsulation — Bad! Data structure encapsulation is also known as The client is insulated from accessing data hiding the individual elements of the data structure Client need not worry about the internal details The client is at the mercy of the Client is concerned with what , not how access operations provided by the The author of the encapsulating class is free to encapsulating class change the internals of the encapsulated class What if I want to print only the items in a without breaking client code list of integers that are even? Wonderful for software maintenance issues: fixes, optimizations, etc. 17 18 3
4/18/2013 Encapsulation Dilemma Iterator How can we provide access to individual An iterator is an object that provides access elements of an encapsulated data set without to individual elements of a collection in a exposing the implementation of the data standard way without exposing the structure? implementation details of that collection This problem has been encountered many The collection can be real or virtual times in the past Traversing a list vs. generating a random number Fortunately a standard solution has been devised 19 20 Design Patterns Structure of a Design Pattern Iterator is one example of a design pattern Name A design pattern in software is a design that solves Context for its use a programming problem The design has application beyond the Problem description particular problem at hand Solution Concept originally proposed by Christopher Alexander for architectural design GoF book The iterator concept is one example of a design pattern 22 23 Iterator Design Pattern The Standard Template Library. Name: Iterator The STL provides a collection of data Context for its use: An encapsulated collection of data structures and provides some generic elements algorithms, such as sorting. Problem description: Need to provide client-controlled access to individual elements of the collection without As its name suggests, the STL makes heavy exposing the underlying data structure of the collection use of templates. holding those elements Solution: Provide a separate object that All compiler that implement the standard has has data structure-specific knowledge of the collection, but that the library available. presents to the client generic operations that access elements in an implementation-independent manner 24 4
4/18/2013 Basic Data Structures STL basic components Data Structure is a representation of data and Containers the operations allowed on that data. Iterators Basic Data Structures Algorithms List Stack Queue Sets Maps Priority Queues STL Containers STL Iterators Iterators maintain a notion of a current position in the container and A collection of objects (elements) provides basic operations such as the ability to advance to the next position and access the item in the current position Must support: Must support: bool empty() itr++ iterator begin() itr-- (optional) *itr iterator end() == int size() != Each container could define several iterators const_iterator must be used to traverse const containers C++11 Smart Pointers Singly-linked List // Implements individual nodes within a singly-linked list // Implements singly-linked list objects. template <typename T> template <typename T> struct ListNode class LinkedList { { // The value of interest in a list element // Points to the first element of this list; null if the list is empty T data; shared_ptr<ListNode<T>> head; // A link to the next element in the list; null, if this node is the last element shared_ptr<ListNode<T>> next; // Points to the last element of this list; null if the list is empty shared_ptr<ListNode<T>> tail; // Constructor assumes type T is copyable public: ListNode<T>(const T& elem): data(elem), next(nullptr) {} // Creates a new, empty list object // Constructor assumes type T is copyable LinkedList<T>(): head(nullptr), tail(nullptr) {} ListNode<T>(const T& elem, shared_ptr<ListNode<T>> n): data(elem), next(n) {} // Inserts new element elem onto the back of this list object }; void insert(const T& elem ) { … } }; 5
4/18/2013 Reference Counting Insert 12 Insert 4 Insert 22 Insert 7 List Object Goes Out of Scope 6
4/18/2013 List Object Goes Out of Scope List Object Goes Out of Scope List Object Goes Out of Scope List Object Goes Out of Scope List Object Goes Out of Scope List Object Goes Out of Scope 7
4/18/2013 List Object Goes Out of Scope List Object Goes Out of Scope List Object Goes Out of Scope Doubly-linked Lists 2 2 2 2 List Object Goes Out of Scope Doubly-linked Lists 2 2 2 2 1 2 2 1 8
Recommend
More recommend