Class No.35 Data Structures http://ecomputernotes.com
Skip List: Implementation
S3 −∞
+∞
S2 −∞ S1 −∞ S0 −∞
12
34
+∞
23
34
+∞
23
34
45
+∞
http://ecomputernotes.com
Implementation: TowerNode head
tail
Tower Node
20
26
30
40
50
57
60
TowerNode will have array of next pointers. Actual number of next pointers will be decided by the random procedure. Define MAXLEVEL as an upper limit on number of levels in a node. http://ecomputernotes.com
Implementation: QuadNode A quad-node stores: • • • • •
item link to the node before link to the node after link to the node below link to the node above
quadnode
This will require copying the key (item) at different levels
http://ecomputernotes.com
x
Skip Lists with Quad Nodes
S3
−∞
S2
−∞
S1
−∞
S0
−∞
+∞ +∞
31
23
12
23
26
31
34
31
34
+∞
64
44
56
64
http://ecomputernotes.com
78
+∞
Performance of Skip Lists In a skip list with n items • The expected space used is proportional to n. • The expected search, insertion and deletion time is proportional to log n. Skip lists are fast and simple to implement in practice
http://ecomputernotes.com
Implementation 5: AVL tree An AVL tree, ordered by key insert: a standard insert; (log n) find: a standard find (without removing, of course); (log n) remove: a standard remove; (log n)
key
key
entry
entry
key
key
entry
and so on
http://ecomputernotes.com
entry
Anything better?
 So far we have find, remove and insert where time varies between constant logn.  It would be nice to have all three as constant time operations!
http://ecomputernotes.com
Implementation 6: Hashing An array in which TableNodes are not stored consecutively Their place of storage is calculated using the key and a hash function Key
hash function
key 4 10
array index
Keys and entries are scattered throughout the array.
123
http://ecomputernotes.com
entry
Hashing insert: calculate place of storage, insert TableNode; (1) find: calculate place of storage, retrieve entry; (1) remove: calculate place of storage, set it to null; (1)
key 4 10
123
All are constant time (1) !
http://ecomputernotes.com
entry
Hashing  We use an array of some fixed size T to hold the data. T is typically prime.  Each key is mapped into some number in the range 0 to T-1 using a hash function, which ideally should be efficient to compute.
http://ecomputernotes.com
Example: fruits Suppose our hash function gave us the following values: hashCode("apple") = 5 hashCode("watermelon") = 3 hashCode("grapes") = 8 hashCode("cantaloupe") = 7 hashCode("kiwi") = 0 hashCode("strawberry") = 9 hashCode("mango") = 6 hashCode("banana") = 2
kiwi
0 1 2 3
banana watermelon
4 5 6 7 8 9
apple mango cantaloupe grapes strawberry
http://ecomputernotes.com
Example Store data in a table array: table[5] = "apple" table[3] = "watermelon" table[8] = "grapes" table[7] = "cantaloupe" table[0] = "kiwi" table[9] = "strawberry" table[6] = "mango" table[2] = "banana"
0
kiwi
1 2 3
banana watermelon
4 5 6 7 8 9
apple mango cantaloupe grapes strawberry
http://ecomputernotes.com
Example Associative array: table["apple"] table["watermelon"] table["grapes"] table["cantaloupe"] table["kiwi"] table["strawberry"] table["mango"] table["banana"]
0
kiwi
1 2 3
banana watermelon
4 5 6 7 8 9
apple mango cantaloupe grapes strawberry
http://ecomputernotes.com
Example Hash Functions If the keys are strings the hash function is some function of the characters in the strings. One possibility is to simply add the ASCII values of the characters: length −1 h( str ) = ∑ str[i ] %TableSize i =0 Example : h( ABC ) = (65 + 66 + 67)%TableSize
http://ecomputernotes.com
Finding the hash function int hashCode( char* s ) { int i, sum; sum = 0; for(i=0; i < strlen(s); i++ ) sum = sum + s[i]; // ascii value return sum % TABLESIZE; }
http://ecomputernotes.com
Example Hash Functions Another possibility is to convert the string into some number in some arbitrary base b (b also might be a prime number):
length −1 i h( str ) = ∑ str[i ] × b %T i =0 0 1 2 = + + Example : h( ABC ) (65b 66b 67b )%T
http://ecomputernotes.com
Example Hash Functions If the keys are integers then key%T is generally a good hash function, unless the data has some undesirable features. For example, if T = 10 and all keys end in zeros, then key%T = 0 for all keys. In general, to avoid situations like this, T should be a prime number.
http://ecomputernotes.com