0% found this document useful (0 votes)
48 views20 pages

Data Structures and Algorithms: (CS210/ESO207/ESO211)

This document discusses hashing as a data structure for efficient searching. It describes how a hash function maps elements to hash values, which are used to search a hash table. A good hash function evenly distributes elements and minimizes collisions. The document also covers recursion, how activation records allow recursive calls to return to the correct point, and how recursion is implemented using a stack. It notes that while powerful, recursion uses more space and time than iteration, so recursive algorithms should aim to eliminate recursion when possible such as through iteration with an explicit stack or by leveraging properties of the specific problem.

Uploaded by

Moazzam Hussain
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
48 views20 pages

Data Structures and Algorithms: (CS210/ESO207/ESO211)

This document discusses hashing as a data structure for efficient searching. It describes how a hash function maps elements to hash values, which are used to search a hash table. A good hash function evenly distributes elements and minimizes collisions. The document also covers recursion, how activation records allow recursive calls to return to the correct point, and how recursion is implemented using a stack. It notes that while powerful, recursion uses more space and time than iteration, so recursive algorithms should aim to eliminate recursion when possible such as through iteration with an explicit stack or by leveraging properties of the specific problem.

Uploaded by

Moazzam Hussain
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 20

Data Structures and Algorithms

(CS210/ESO207/ESO211)
Lecture 38

Hashing (Data structure for searching)
Recursion
1
Data structures for searching
in O(1) time
Problem Description


: {0,1, , } called universe
,
= ,

Aim: A data structure for a given set that can facilitate efficient searching.

A search query: Does ?
Note: can be any element from .

Hash function, hash value, hash table

Hash function:
is a mapping from to {0,1, , } with the
following characteristics.
() is computable in O(1) time in word RAM.
Example: () = mod

Hash value:
() is called hash value of for a given hash
function , and .

Hash Table:
An array [0 ] of pointers storing .
0
1
2
.
.
.
.
.
.
.
.
.
.
.

0
1
.
.



Hash function, hash value, hash table

Hash function:
is a mapping from to {0,1, , } with the
following characteristics.
() is computable in O(1) time in word RAM.
Example: () = mod

Hash value:
() is called hash value of for a given hash
function , and .

Hash Table:
An array [0 ] of pointers storing .

0
1
2
.
.
.
.
.
.
.
.
.
.
.

0
1
.
.
.
.
.






Hash function, hash value, hash table





Question:
How to use (,) for searching an element ?
Answer:
();
Search element in the list [].

Time complexity for searching:
O(length of the longest list in ).
0
1
2
.
.
.
.
.
.
.
.
.
.
.

0
1
.
.
.
.
.






Efficiency of Hashing depends upon hash function

A hash function is good if it can evenly distributes .

Aim: To search for a good hash function for a given set .

Bad news: There can not be any hash function which is good for every .

Pigeon hole principle:
If there are letters to be placed in less than pigeon holes, there must be at least one
hole containing more than 1 letters.
(very simple and yet very powerful principle)




Hash function, hash value, hash table











For every , there exists a subset of

elements from which are hashed to same value under .


So we can always construct a subset for which all elements have same hash value
All elements of are present in a single list of the hah table associated with .
0
1
2
.
.
.
.
.
.
.
.
.
.
.

0
1
.
.



Hashing: Practice and theory

Practice:
In real world applications, hashing works very well because is usually a random
subset of .

Theory:
Very efficient algorithms exists for finding almost perfect hash function for a given .
The algorithms use elementary knowledge of prime numbers.
The algorithms use simple randomization.
A typical form of the hash function: () = mod
(We shall discuss such an algorithm in CS345.)
Recursion
Recursion

A very powerful way to solve various problems.

Enumerating all permutations of a sequence.
Enumerating all subsets of a given set.
Enumerating all valid expression having n left and n right parentheses.
Enumerating all 0-1 strings of length n having no consecutive 0s.

It is so inspiring to see that for each of the above problems, there is a 10-20
lines recursive program whereas it is too difficult, if not impossible, to write
an iterative program which does the same.
Visualization of recursion








Question: How to implement recursion ?
Factorial(9){

...

..9*Factorial(8)


}
Factorial(8){


..
..8*Factorial(7)


}
Factorial(1){


..
..1*Factorial(0)


}
Factorial(0){


..
..

return 1;
}
Implementation of recursion
Question: What exactly is required to implement recursion ?








Answer: After the called procedure finishes, the execution should resume
at appropriate place.
In the same environment where it left.

Fun(n){

...

Fun(n-1)


}
Fun(n-1){


..
..


}
Instruction number of the calling procedure
The values of local variables of the calling
procedure just before the recursive call
Implementation of recursion



A procedure that has been invoked but has not finished yet is called an active procedure.
At any moment of time, many procedures may be active.
If a procedure is recursive, then multiple instances of it may be active at a time.
For each active procedure, we need to keep its activation record.

value of its local variables .
return address (where to return after
the execution of the procedure)
Implementation of recursion
Suppose the calls are made in the following order:

Procedure is called first.
calls
calls
calls
Note:
, , , could be instances of
same (recursive) procedure.
-------------------
When finishes, control returns to
When finishes, control returns to
When finishes, control returns to






RAM
Activation record of
Activation record of
Activation record of
Activation record of
Having seen the way activation records are created and used during recursion,
what is the appropriate data structure to maintain a collection of activation
records ?
Stack
Implementation of recursion


Recursion is implemented using stack (called call stack).

Implementation of recursion requires extra space.

There is an extra overhead of time invoking recursive calls.

Due to these reasons, a recursive algorithm is usually slower and takes more
space than its iterative counterpart (if exists). So one should strive to
eliminate recursion whenever possible.

Elimination of recursion
method 1


Simulating recursion by iteration
(keeping an explicit stack)

Example: 8-queens problem
Most of the implementation (you may search WWW) are recursive.
We discussed an iterative implementation using an explicit stack.

Consequence: improvement in space and time, but only by a constant factor.


Elimination of recursion
method 2


Using an insight into the specific problem and its recursive algorithm.

A simple example:
Computing factorial()
A nontrivial example:
Inorder traversal of a BST

Inorder traversal of BST
Inorder()
{ If left()<> NULL Inorder(left());
print(key());
If right()<> NULL Inorder(right())
}
Question: What is the extra space used by the above algorithm due to recursion ?
Answer: O(height()). [This could be O() when is skewed ]

Question: How to perform Inorder traversal in O() time using O(1) extra space ?
Answer: (Those whose current aim is preparation for the exam, may skip this
question; others may think over this problem during bed time to get a sound sleep.
A few hints are provided on the following slide.)
Inorder traversal of BST using
Hints (a sequence of right questions):
Question: What is required to navigate the tree according to inorder traversal ?
Answer: a mechanism to decide where to go from a given node.
Question: On how many different occasions will we visit a node during inorder
traversal ?
Answer: three (once from its parent, once from left child, once from its right child).
Observation: Once we know the exact (one of the three) occasions of visiting a
node, we know which node we have to visit next.

Keep an additional parameter called state (capturing the occasion) while visiting a
node. Design an algorithm involving transition from one state to another. Exploit
the fact that the number of these states will be a constant.

You might also like