– Have to traverse the entire list to stop right in front of tail to delete it, so O(n) – With head and tail pointer, still O(n), tail has to point to the node in front of the original tail (original tail’s predecessor). – To avoid this, redefine the linked list so that each node has 2 pointers, one to the successor and one to the predecessor Which Operation of DLL is More Efficient than SLL • ? Circular Lists • In some situations, a circular list is needed in which nodes form a ring – E.g., resource sharing among process – The pointer current points to the next process to which the resource should be assigned Insertion at the Front and End of a Circular List
Time complexities? Circular List (cont’d) • Time complexity of deletion from the end?
• Circular doubly linked list
Define Circular Linked List Example of Add a Node to the Head of a Circular LinkedList • Different Cases • Discuss for each case Self-Organizing Lists • Linked lists have one serious drawback – Sequential scanning to locate a searched-for element – Time complexity of search is O(n)
• Can improve search efficiency by dynamically organizing the list in a
certain manner – Move-to-front method (i.e., Most Recently Used) • After desired element is located, put it at the beginning – Transpose method • After desired element is located, swap it with predecessor – Count method (i.e., Most Frequently Used) • Order the list by number of times elements are accessed – Ordering method • Order the list using certain criteria Self-Organizing Lists (cont’d) • With first 3 methods, try to locate elements most likely to be looked for near the beginning of the list – Move-to-front vs. Transpose • The ordering method is particularly advantageous when searching for information that is not in the list, because the search can terminate without scanning the entire list • But, if the desired element is not in the list, the first 3 methods just add a new node at the end of the list O(1), whereas the ordering method must maintain the order Optimal Static Ordering • Analysis of the efficiency of these methods usually compares their efficiency to that of optimal static ordering (i.e., all data already ordered by the frequency of their occurrence) • Optimal static ordering requires two passes through the body of data – Build the list – Use the list for search alone Optimal Static Ordering (cont’d) • Example: Find the optimal static ordering of the following stream of data:
ACBCDADACACCEE
• Optimal static ordering used for comparison
purposes only An Application Sparse Tables • In many applications, the choice of a table seems to be the most natural one, but space considerations may preclude this choice • Particularly true if only a small portion of the table is actually used (i.e., a sparse table) • A sparse table can be replaced by a system of linked lists Sparse Tables (cont’d) • Consider the problem of storing one semester grades for 8000 students and 300 classes • Natural implementation is a 2D array of classes and students • Assuming, on the average, students take 4 classes per semester, each column has only 4 cells occupied and the rest (296 or 98.7%) are wasted Sparse Tables (cont’d) • A better implementation is to use 2 1D arrays of linked lists – Each element of array class is a pointer to a linked list of students taking a class – Each element of array student is a pointer to a linked list of the classes taken by a student • The space needed will be approximately 10% of the space needed for the sparse table implementation Template DLL • Make the linked list to store any type of contents