You are on page 1of 73

Algorithm & Data Structure CSC112

Fall 2011

Click to edit Master subtitle style Syed Muhammad Raza

5/23/12

Algorithm Requirements

Requirements for an algorithm:

Input

Output Unambiguous Generality Correctness Finite Efficiency

5/23/12

Algorithm Representation

Pseudo-code Flow chart

5/23/12

Pseudo-Code

Pseudo-code is a semi-formal, English-like language with a limited vocabulary that can be used to design and describe algorithms.

The main purpose of a pseudo-code is to define the procedural logic of an algorithm in a simple, easy-tounderstand manner for its readers, who may or may not be proficient in computer programming.

5/23/12

Pseudo-Code

Used in designing algorithms. Used in communicating to users. Used in implementing algorithms as programs. Used in debugging logic errors in programs. Used in documenting programs for future maintenance and expansion purposes.

5/23/12

Pseudo-Code

Must have a limited vocabulary. Must be easy to learn. Must produce simple, English-like narrative notation. Must be capable of describing all algorithms, regardless of their complexity.

5/23/12

Control Structures

Sequence Selection Repetition

5/23/12

Sequence

Series of steps or statements that are executed in the order they are written.

Example: Read taxable income Read filing status Compute income tax Print income tax

5/23/12

Selection

Defines one or two courses of action depending on the evaluation of a condition.

A condition is an expression that is either true or false. Example if condition (is true) then-part else else-part end_if

5/23/12

Nested Selection
if status is equal to 1 print Single else if status is equal to 2 print Married filing jointly else if status is equal to 3 print Married filing separately end_if end_if
5/23/12

Repetition

Specifies a block of one or more statements that are repeatedly executed until a condition is satisfied.

Example: while condition loop-body

end_while

5/23/12

Conventions

Each pseudo-code statement consists of keywords that describe operations and some appropriate, English-like description of operands.

Each statement should be written on a separate line. Continuation lines should be indented

5/23/12

Conventions II

Sequence statements should begin with unambiguous words (compute, set, initialize).

Selection statements then-part and else-part should be indented.

Selection statements end with the keyword end_if.

5/23/12

Convention III

Repetition statements end with end_while. Loop-bodies are indented. All words in a pseudo-code statement must be chosen to be unambiguous, and as easy as possible to understand by non-programmers.

Enclose comments between /* and */

5/23/12

Example 1
If student's grade is greater than or equal to 60 Print "passed" else Print "failed End_if

5/23/12

Example 2
Set total to zero Set grade counter to one While grade counter is less than or equal to ten Input the next grade Add the grade into the total End_while Set the class average to the total divided by ten Print the class average.
5/23/12

Example 3
initialize passes to zero initialize failures to zero initialize student to one while student counter is less than or equal to ten input the next exam result if the student passed add one to passes else add one to failures
5/23/12

Set asterik counter to one Set outer while counter to one While out counter is less than or equal to 4 set spaces counter to 1 while spaces counter is less than 4 print increment space by one end_while set asterik counter to one

counter

while asterik counter is less than or equal to odd multiple of outer print * increment asterik counter by one end_while

5/23/12

Basic Symbols
Rounded box - use it to represent an event which occurs automatically. Such an event will trigger a subsequent action, for example or box - use it to represent an Rectangle `receive telephone call, or describe a new state of affairs. within the event which is controlled process. Typically this will be a step or action which is it to represent a decision Diamond - use taken. In most flowcharts this will be the most frequently used point in the process. Typically, the symbol. statement in the symbol will require a `yes' -or `no' response a point at which Circle use it to represent and branch to different parts of the flowchart connects the with flowchart another accordingly. name or reference for the process. The other process should appear within the symbol. 5/23/12

Flowchart

A flowchart is a diagrammatic representation that illustrates the sequence of operations to be performed to get the solution of a problem

5/23/12

Guide Lines

Flowcharts are usually drawn using some standard symbols; however, some special symbols can also be developed when required
Start or end of the program. Computational steps or processing function of a program Input or output operation, Decision making and branching Connector or joining of two parts of program Magnetic Tape Off-page connector Flow line Annotation Display

5/23/12

5/23/12

Example

Draw a flowchart to find the largest of three numbers A,B, and C.

5/23/12

Example

Draw a flowchart to find the sum of first 50 natural numbers.

5/23/12

Imagination is more important than knowledge Knowledge is Limited. Imagination encircles the world
Einstein

5/23/12

Efficiency of an Algorithm

The Amount of Computer Time and Space that an Algorithm Requires

We are more interested in time complexity. Why? Efficiency of algorithms helps comparing different methods of solution for the same problem

Algorithm Analysis Should be Independent of


Specific Implementation languages, Computers and Data

Efficiency is a concern for large problems (large data size) 5/23/12

Algorithm Growth Rate


Algorithm growth rate is a measure of its efficiency Growth Rate: Measure an Algorithms Time Requirement as a Function of the Problem Size (N)

How quickly the Algorithms Time Requirement Grows as a Function of the Problem Size

The Way to Measure a Problems Size Depends on the Application


Number of Nodes in a Linked List The Size of an Array Number of Items in the Stack Etc.
5/23/12

Example

Suppose we have two algorithms A and B for solving the same problem. Which one do we use?

Suppose
Algorithm

A Requires Time Proportional to N2 (expressed as

O(N2 ). This is Big O Notation.)


Algorithm

B Requires Time Proportional to N , i.e. B is O(N)

Obviously B is a better choice

5/23/12

Big O Notation

If Algorithm A Requires Time Proportional to f(N), Algorithm A is Said to be Order f(N), Which is Denoted as O(f(N));

f(N) is Called Algorithms Growth-Rate Function

5/23/12

Growth Rates Comparison

5/23/12

Growth Rates Comparison (Tabular)

5/23/12

Common Growth Rates

Constant : O(1)
Time

Requirement is Constant of Problem Size an array element

Independent

Example: Accessing Logarithmic Time

: O(log N)

Requirement Increases Slowly for a Logarithmic

Function
Typical

algorithm: Solves a Problem by Solving a Smaller


5/23/12

Constant Fraction of the Problem

Common Growth Rates

O(N log N)
Time

Requirement Increases More Rapidly

Than a Linear Algorithm


Typical

algorithms : Divide a Problem into

Smaller Problems That are Each Solved Separately


Quadratic

: O(N2)
5/23/12

Common Growth Rates

Exponential time: O( 2N)


Very, very, very bad, even for small N Usually Increases too Rapidly to be Practical

5/23/12

Sorting Algorithms

Sorting is the process of rearranging your data elements/Item in ascending or descending order

Unsorted Data

Sorted Data (Ascending)

Sorted Data (Descending)

2
5/23/12

Sorting Algorithms

They are many


Bubble Sort Selection Sort Insertion Sort Shell sort Comb Sort Merge Sort Heap Sort Quick Sort Counting Sort Bucket Sort Radix Sort Distribution Sort

5/23/12

Bubble Sort

Compares Adjacent Items and Exchanges Them if They are Out of Order

When You Order Successive Pairs of Elements, the Largest Element Bubbles to the Top(end) of the Array

Bubble Sort (Usually) Requires Several Passes Through the Array

5/23/12

Bubble Sort
Pass 1 29 10 10 10 10 10 29 14 14 14 14 14 29 29 29 37 37 37 37 13 13 13 13 13 37 10 10 10 10 14 14 14 14 Pass 2 29 29 29 13 13 13 13 29 37 37 37 37

5/23/12

Selection Sort

To Sort an Array into Ascending Order, First Search for the Largest Element

Because You Want the Largest Element to be in the Last Position of the Array, You Swap the Last Item With the Largest Item to be in the Last Position of the Array, You Swap the Last Item with the Largest Item, Even if These Items Appear to be Identical

Now,

Ignoring the Last (Largest) Item of the Array, search


5/23/12

Rest of the Array For Its Largest Item and Swap it With Its Last Item, Which is the Next-to-Last Item in the original

Selection Sort

Initial Array After1st Swap After2nd Swap After3rd Swap After4th Swap

29 29 13 13 10

10 10 10 10 13

14 14 14 14 14

37 13 29 29 29

13 37 37 37 37

5/23/12

Insertion Sort

Divide Array Into Sorted Section At Front (Initially Empty), Unsorted Section At End

Step Iteratively Through Array, Moving Each Element To Proper Place In Sorted Section
Sort ed . . Unsort ed . . N1

i
After i Iterations

5/23/12

Insertion Sort
Initial Array

29 29 10 10 10 10 10

10 29 29 29 14 14 14 13

14 14 14 29 29 29 14 14

37 37 37 37 37 37 29 29

13 13 13 13 13 13 37 37

Copy 10 Shift 29
Insert 10, Copy 14

Shift 29
Insert 14; Copy 37 Insert 37 on Itself

Copy 13 Shift 14, 29, 37


Insert 13

Sorted Array

10

5/23/12

Shell Sort

Improved and efficient version of insertion sort It iterates the data elements/items like insertion sort, but instead of shifting it makes the swaps.

5/23/12

Shell Sort

3 5 1 2 4

1 5 3 2 4

1 2 3 5 4

1 2 3 4 5

5/23/12

Merge Sort

Divide and Conquer Algorithm Recursively split the input in half Then recursively merge pairs of pieces Recursive Steps:

Divide the Array in Half Sort the Halves Merge The Halves inside a Temporary Array Copy Temporary Array to the appropriate locations in original array

5/23/12

Merge Sort

The Recursive calls Continue to divide the Array into Pieces Until Each Piece Contains Only One Item

An Array of One Item is Obviously Sorted The Algorithm Then Merges These small Pieces Until One Sorted Array Results

5/23/12

Merge Sort
38 38 38 38 16 16 16 16 16 38 27 12 38 16 27 27 16 27 27 39 39 12 12 38 27 39 12 39 12 12 39 27 39
5/23/12

27 12 27 27
Recursive Calls to Mergesort

39

Merge Steps

Quick Sort

Divide and Conquer algorithm Quicksort Works by Partitioning the Array into Two Pieces Separated by a Single Element That is Greater Than all the Elements in the Left part and Smaller Than all the Elements in the right part

This Guarantees That, the Single Element , Called the Pivot Element, is in its Correct position

Then the Algorithm Proceeds, Applying the Same Method to the Two parts Separately

5/23/12

Quick Sort

Partition (Divide)

Choose a pivot Find the position for the pivot so that


all all

elements to the left are less elements to the right are greater

< pivot

pivot

>= pivot

5/23/12

Quick Sort

Conquer

Apply the same algorithm to each half

< pivot < p p > p pivot < p

>= pivot p >= p

5/23/12

Partitioning Method

Must Arrange Items Into Two regions S1, the Set of Items Less Than the Pivot, and S2, the Set of Items Greater Than or Equal to Pivot Different algorithms for Choice of a Pivot Retain Pivot in A[F] position The Items That await Placement are in Another Region , Called the Unknown Region S1 S2 Unknown

P <P ? >= P F LastS1 FirstUnknown L At Each Step of the partition Algorithm you Examine One Item from Unknown Region and Place it in S1 or S2

5/23/12

To Move A[FirstUnknown] into S1 Swap S1 S2 P F <P LastS1 >= >= P LastS1+P 1

Unknown <P ? FirstUnknown L

Swap A[FirstUnknown] With the First Item of S2, Which is A[LastS1+1], and Then Increment S1 by 1

Thus the Item That Was in A[FirstUnknown] will be at the Rightmost Position of S1

Item of S2 That was Moved to A[FirstUnknown]: If you Increment FirstUnknown by 1, That Item Becomes the Rightmost Member of S2 5/23/12

To Move A[FirstUnknown] into S2 S1 P F <P LastS1 S2 >= P Unknown ? FirstUnknown L

Region S2 and Unknown are Adjacent Simply Increment FirstUnknown by 1, S2 Expands to the Right

To Move Pivot Between S1 and S2


Interchange A[LastS1], the Rightmost Item in S1 with Pivot Thus, Pivot Would be in its Actual Location

5/23/12

Pivot

27
Pivot

38 38
S2

12 12 12
S2

39
Unknown

27 27 27
Unknown

16 16 16 16 16
Unknown

Choose Pivot, keep it in A[F] FirstUnknown = 1(Points to 38 38 Belongs in S2 S1 is Empty 12 Belongs in S1, swap38 & 12 39 Belongs in S2 27 Belongs in S2 16 Belongs in S1, Swap 38 & 16 No more Unknown Place Pivot between S1 and S2 5/23/12

27
Pivot

39 39 39
S2

Unknown

27
Pivot

38
S1

27
Pivot

12
S1

38 38 38
S1

27 27 27
S2

Unknown

27
Pivot

12
S1

39
S2

27
Pivot

12 12 12

39 39 39

16 38 38

27
S1

16
Pivot

27
S2

16

27

27

Radix Sort 32 497 5 657 839 436 72 305 5 72 305 5 436 457 657 32 899 3 72 302 496 3 839 355 457 657 32 395 5 436 457 657 72 809 3
5/23/12

Comparison of Sorting Algorithms


Worst Case Selection Sort Bubble Sort Insertion Sort Mergesort Quicksort Radix Sort N2 N2 N * log N N2 N N2

5/23/12

Searching Algorithms

Searching is the process of determining whether or not a given value exists in a data structure or a storage media.

We will study two searching algorithms

Linear Search Search

Binary

5/23/12

Linear Search: O(n)

The linear (or sequential) search algorithm on an array is:

Start from beginning of an array/list and continues until the item is found or the entire array/list has been searched.

Sequentially scan the array, comparing each array item with the searched value.

If a match is found; return the index of the matched element; otherwise return 1.

Note: linear search can be applied to both sorted and unsorted arrays.

5/23/12

Linear Search
bool LinSearch(double x[ ], int n, double item) { for(int i=0;i<n;i++) { if(x[i]==item) { return true; } else { return false;
5/23/12

Linear Search Tradeoffs

Benefits
Easy Array

to understand can be in any order

Disadvantages
Inefficient

for array of N elements

Examines N/2 elements on average for value in array, N elements for value not in array

5/23/12

Binary Search: O(log2 n)


Binary

search looks for an item in an array/list using divide and conquer strategy

5/23/12

Binary Search

Binary search algorithm assumes that the items in the array being searched is sorted

The algorithm begins at the middle of the array in a binary search

If the item for which we are searching is less than the item in the middle, we know that the item wont be in the second half of the array

Once again we examine the middle element The process continues with each comparison cutting in half the portion of the array where the item might be
5/23/12

Binary Search

Binary search uses a recursive method to search an array to find a specified value

The array must be a sorted array:

a[0]a[1]a[2]. . . a[finalIndex]

If the value is found, its index is returned If the value is not found, -1 is returned Note: Each execution of the recursive method reduces the search space by about a half

5/23/12

Pseudocode for Binary Search

5/23/12

Execution of Binary Search

5/23/12

Execution of Binary Search

5/23/12

Key Points in Binary Search


1.

There is no infinite recursion On each recursive call, the value of first is increased, or the value of last is decreased

If the chain of recursive calls does not end in some other way, then eventually the method will be called with first larger than last

2.

Each stopping case performs the correct action for that case If first > last, there are no array elements between a[first] and a[last], so key is not in this segment of the array, and result is correctly set to -1

5/23/12 If key == a[mid], result is correctly set to mid

Key Points in Binary Search


3.

For each of the cases that involve recursion, if all recursive calls perform their actions correctly, then the entire case performs correctly

If key < a[mid], then key must be one of the elements a[first] through a[mid-1], or it is not in the array

The method should then search only those elements, which it does

The recursive call is correct, therefore the entire action is correct

5/23/12

Key Points in Binary Search

If key > a[mid], then key must be one of the elements a[mid+1] through a[last], or it is not in the array

The method should then search only those elements, which it does

The recursive call is correct, therefore the entire action is correct

The method search passes all three tests: Therefore, it is a good recursive method definition

5/23/12

Efficiency of Binary Search

The binary search algorithm is extremely fast compared to an algorithm that tries all array elements in order

About half the array is eliminated from consideration right at the start

Then a quarter of the array, then an eighth of the array, and so forth

5/23/12

Efficiency of Binary Search

Given an array with 1,000 elements, the binary search will only need to compare about 10 array elements to the key value, as compared to an average of 500 for a serial search algorithm

The binary search algorithm has a worst-case running time that is logarithmic:

O(log n)

A serial search algorithm is linear: O(n)

If desired, the recursive version of the method search can be converted to an iterative version that will run more efficiently

5/23/12

Binary Search

5/23/12

IT IS ALL ABOUT DOING THE RIGHT THING AT THE RIGHT TIME

5/23/12

You might also like