Data Structures and Algorithms Lists, Stacks, Queues, and Graphs Sorting and searching algorithms Lists A list is a sequence of zero or more data items. The total number of items is said to be the length of the list. The length of a given list can grow and shrink on demand. The items can be accessed, inserted, or deleted at any position in a list. Two ways to implement lists Array implementation array End of list Linked list implementation null Stacks A stack is a special kind of list in which all insertions and deletions take place at one end, called the top. Therefore, it has another name ``pushdown list''. Its items are added and deleted on a last-in-first-out (LIFO) basis. In Java, “Stack s = new Stack()” creates a stack object. Java Examples – using stacks Q. What is printed out by the following fragment of Java? Stack s = new Stack(); for(int i=0; i<10; i++) s.push(i); while(!s.empty()) System.out.printnl(s.pop); Java examples – using stacks Q. What is printed out by the following fragment of Java? Stack s = new Stack(); for(int i=0; i<5; i++) s.push(i); while(!s.size() > 1) s.push(s.pop() + s.pop()); System.out.printnl(s.pop); Queues A queue is another special kind of list, where items are inserted at one end (the rear) and deleted at the other end (the front). A queue is also called a FIFO, since the items are deleted in the same order as they were added - on a first-in-first-out basis. For a queue structure, we have two special names for insertion and deletion: ENQUEUE and DEQUEUE. How to implement queues? Tricky! How to make both 0 1 2 3 4 5 6 7 tail head Wrap around 3 4 2 5 1 6 0 7 enqueue & dequeue operations efficient ? (avoid shifting items) enqueue tail= (tail+1) mod size dequeue head= (head+1) mod size An example of using queue One printer is connected to several computers Printing a file takes much longer time than transmitting the data; a queue of printing jobs is needed When new job P arrives, do enqueue(P) When a job is finished, do dequeue(P) Printing task queue job1 job2 job3 job4 job5 job6 ^ | | | jobs removed here (dequeue) ^ | |_________ | new jobs added here (enqueue) Algorithms An algorithm is a step-by-step method of solving computational tasks. Algorithm = a precise sequence of actions for performing a computational task (independent from computer languages, i.e. pseudo code). Computational Task ? A computational task is not just a “single” task such as “Is 3962431 prime ?” “What is 37487*2371 ?” A computational task is a whole family of “similar” tasks with varying INPUT, such as “Given a whole number A, is A prime?” “Given 2 numbers x and y, what is x times y?” Sorting - one of the most frequently used computational task Nature tends towards disorder Human prefer order e.g. address books shopping lists databases Insertion sort Commonly used for hand-sorting Use two lists – unsorted and sorted unsorted = input list (assume that size = n) sorted = an empty list loop from i =0 to n-1 do { // n loops insert unsorted[i] to the sorted list // needs about n steps comparing or shifting } Can you write an ordered insertion algorithm? Another sorting algorithm – quick sort (An example of using stack) Goal: sort numbers from position 1 to 10 into order (to simplify assume size=10) Sub-goal: sort numbers from position a to b into order. Easy case a = b. How to split goal into sub-goals? Use a partitioning method 4 8 2 5 10 9 1 3 7 6 partitioning Randomly pick a pivot. The rest of the numbers are shifted to either the left or right side of the pivot depending on whether it is greater or less than the pivot. Pivot is already in the sorted position. 4 8 2 10 9 1 3 7 6 8 5 10 9 7 6 Pivot’s moved to here picked pivot 2 5 1 3 4 Using a Stack push (1,10) onto stack while stack not empty do { pop (a,b) from stack partitioning (a,b) into (a,m-1) and (m+1,b) if(a < m-1) push (a,m) onto stack if(m+1 < b) push(m+1,b) onto stack } Step by step 4 2 2 2 2 2 1 1 8 1 1 1 1 1 2 2 2 3 3 3 3 3 3 3 5 4 4 4 4 4 4 4 10 9 1 3 7 6 8 5 10 9 7 6 5 7 6 8 10 9 5 7 6 8 9 10 5 7 6 8 9 10 5 6 7 8 9 10 5 6 7 8 9 10 5 6 7 8 9 10 Memo for In-class test 9 [ questions 1 2 3 4 5 my answers correct answers /5] comments Back to data structures – something not a sequence … Graphs – examples of graphs Road maps (directed, cyclic, weighted) Project network (directed, cyclic, weighted) Electrical circuits Molecules Relationships (directed, un-weighted?) - family tree - students on courses An abstract view of graphs A graph is a collection of nodes (vertices) which maybe connected in pairs by line segments called edges. Trees – a special graph without cycles Hieratical graph Root – the only node at the topmost All rest of nodes must be linked to a parent note, and may have zero or more child nodes Leaf - Node without children root Child 1 Child 2 leaf leaf Child 3 leaf A Searching Problem …… ‘My house is No. 42 and is 100 yards from the roundabout’, said your friend. Unfortunately you realise, as you reach the roundabout, that he hasn’t told you which exit to take. What should you do? Even worse case, ‘100 yards from the 3rd roundabout’, said your friend Searching Algorithms - 1 Depth first with backtracking Go far as you can in one direction, stop if the problems solved. If reach ‘dead-end’, go back up to the last point where a decision was made, and make a different (untried) direction. If there are no new decision, back up a further choice point. Searching Algorithms - 2 Breadth first Explore all possible directions in one step, and remember those intermediate stages Carry on exploring all intermediate stages, step by step, until a solution found. An Example of Breadth First Search Finding a shortest path in a graph (say, from A to D) 4 B C 3 2 3 2 A D E 2 3 F 1 H 1 1 G Breadth first and Depth first Breadth first Uses a queue Visit all nearest nodes first Depth first Uses a stack Go as far as possible Think about this You have to build a tower from a collection of small boxes of different sizes. The height of the tower must be 1m. How do you solve this problem? Memo for In-class test 10 [ questions 1 2 3 4 5 my answers correct answers comments /5]