CSIT5300: Advanced Database Systems

Similar documents
Intro to DB CHAPTER 12 INDEXING & HASHING

Chapter 11: Indexing and Hashing

Chapter 12: Indexing and Hashing. Basic Concepts

Chapter 12: Indexing and Hashing

Chapter 12: Indexing and Hashing (Cnt(

Physical Level of Databases: B+-Trees

Selection Queries. to answer a selection query (ssn=10) needs to traverse a full path.

Chapter 12: Indexing and Hashing

Database System Concepts, 6 th Ed. Silberschatz, Korth and Sudarshan See for conditions on re-use

Introduction to Indexing 2. Acknowledgements: Eamonn Keogh and Chotirat Ann Ratanamahatana

Hash-Based Indexes. Chapter 11. Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke 1

Chapter 11: Indexing and Hashing" Chapter 11: Indexing and Hashing"

Lecture 8 Index (B+-Tree and Hash)

Chapter 11: Indexing and Hashing

Chapter 11: Indexing and Hashing

Database System Concepts, 5th Ed. Silberschatz, Korth and Sudarshan See for conditions on re-use

Hashed-Based Indexing

Material You Need to Know

Hash-Based Indexes. Chapter 11

Chapter 11: Indexing and Hashing

Tree-Structured Indexes

Hash-Based Indexes. Chapter 11 Ramakrishnan & Gehrke (Sections ) CPSC 404, Laks V.S. Lakshmanan 1

Hash-Based Indexing 1

Extra: B+ Trees. Motivations. Differences between BST and B+ 10/27/2017. CS1: Java Programming Colorado State University

Announcements. Reading Material. Recap. Today 9/17/17. Storage (contd. from Lecture 6)

Introduction to Data Management. Lecture 15 (More About Indexing)

THE B+ TREE INDEX. CS 564- Spring ACKs: Jignesh Patel, AnHai Doan

Introduction. Choice orthogonal to indexing technique used to locate entries K.

Tree-Structured Indexes

Tree-Structured Indexes

Spring 2017 B-TREES (LOOSELY BASED ON THE COW BOOK: CH. 10) 1/29/17 CS 564: Database Management Systems, Jignesh M. Patel 1

Find the block in which the tuple should be! If there is free space, insert it! Otherwise, must create overflow pages!

Tree-Structured Indexes

Kathleen Durant PhD Northeastern University CS Indexes

Tree-Structured Indexes ISAM. Range Searches. Comments on ISAM. Example ISAM Tree. Introduction. As for any index, 3 alternatives for data entries k*:

Lecture 13. Lecture 13: B+ Tree

Overview of Storage and Indexing

Tree-Structured Indexes. Chapter 10

Principles of Data Management. Lecture #5 (Tree-Based Index Structures)

Tree-Structured Indexes

CSE 530A. B+ Trees. Washington University Fall 2013

Systems Infrastructure for Data Science. Web Science Group Uni Freiburg WS 2014/15

Tree-Structured Indexes

Database index structures

Tree-Structured Indexes

Indexing and Hashing

CARNEGIE MELLON UNIVERSITY DEPT. OF COMPUTER SCIENCE DATABASE APPLICATIONS

Tree-Structured Indexes. A Note of Caution. Range Searches ISAM. Example ISAM Tree. Introduction

Hashing file organization

Introduction to Data Management. Lecture 21 (Indexing, cont.)

Administrivia. Tree-Structured Indexes. Review. Today: B-Tree Indexes. A Note of Caution. Introduction

Indexing. Chapter 8, 10, 11. Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke 1

QUIZ: Buffer replacement policies

Tree-Structured Indexes (Brass Tacks)

Physical Disk Structure. Physical Data Organization and Indexing. Pages and Blocks. Access Path. I/O Time to Access a Page. Disks.

Database Applications (15-415)

Introduction to Indexing R-trees. Hong Kong University of Science and Technology

amiri advanced databases '05

Physical Database Design: Outline

(2,4) Trees Goodrich, Tamassia. (2,4) Trees 1

CS143: Index. Book Chapters: (4 th ) , (5 th ) , , 12.10

Topics to Learn. Important concepts. Tree-based index. Hash-based index

Database Applications (15-415)

Indexing: Overview & Hashing. CS 377: Database Systems

(i) It is efficient technique for small and medium sized data file. (ii) Searching is comparatively fast and efficient.

Hash-Based Indexes. Chapter 11. Comp 521 Files and Databases Spring

CSC 261/461 Database Systems Lecture 17. Fall 2017

Hash-Based Indexes. Chapter 11. Comp 521 Files and Databases Fall

Indexing and Hashing

Database Applications (15-415)

Chapter 17. Disk Storage, Basic File Structures, and Hashing. Records. Blocking

Data Organization B trees

CS 525: Advanced Database Organization 04: Indexing

Data Structures and Algorithms

Remember. 376a. Database Design. Also. B + tree reminders. Algorithms for B + trees. Remember

key h(key) Hash Indexing Friday, April 09, 2004 Disadvantages of Sequential File Organization Must use an index and/or binary search to locate data

Indexing. Jan Chomicki University at Buffalo. Jan Chomicki () Indexing 1 / 25

Indexing. Week 14, Spring Edited by M. Naci Akkøk, , Contains slides from 8-9. April 2002 by Hector Garcia-Molina, Vera Goebel

TUTORIAL ON INDEXING PART 2: HASH-BASED INDEXING

Advances in Data Management Principles of Database Systems - 2 A.Poulovassilis

Multiway searching. In the worst case of searching a complete binary search tree, we can make log(n) page faults Everyone knows what a page fault is?

INDEXES MICHAEL LIUT DEPARTMENT OF COMPUTING AND SOFTWARE MCMASTER UNIVERSITY

Indexes. File Organizations and Indexing. First Question to Ask About Indexes. Index Breakdown. Alternatives for Data Entries (Contd.

(2,4) Trees. 2/22/2006 (2,4) Trees 1

System Structure Revisited

Multi-way Search Trees. (Multi-way Search Trees) Data Structures and Programming Spring / 25

Chapter 17 Indexing Structures for Files and Physical Database Design

I think that I shall never see A billboard lovely as a tree. Perhaps unless the billboards fall I ll never see a tree at all.

Access Methods. Basic Concepts. Index Evaluation Metrics. search key pointer. record. value. Value

Storage hierarchy. Textbook: chapters 11, 12, and 13

DATABASE PERFORMANCE AND INDEXES. CS121: Relational Databases Fall 2017 Lecture 11

Indexing. Announcements. Basics. CPS 116 Introduction to Database Systems

File Organization and Storage Structures

Goals for Today. CS 133: Databases. Example: Indexes. I/O Operation Cost. Reason about tradeoffs between clustered vs. unclustered tree indexes

Database Systems. File Organization-2. A.R. Hurson 323 CS Building

Design and Analysis of Algorithms Lecture- 9: B- Trees

Indexing: B + -Tree. CS 377: Database Systems

Balanced Search Trees


Chapter 18 Indexing Structures for Files. Indexes as Access Paths

Transcription:

CSIT5300: Advanced Database Systems L08: B + -trees and Dynamic Hashing Dr. Kenneth LEUNG Department of Computer Science and Engineering The Hong Kong University of Science and Technology Hong Kong SAR, China kwtleung@cse.ust.hk CSIT5300

B + -tree Index Files Disadvantage of index-sequential files: Performance degrades as file grows, since many overflow blocks get created. Periodic reorganization of entire file is required. Advantage of B + -tree index files: Automatically reorganizes itself with small, local, changes, in the face of insertions and deletions. Reorganization of entire file is not required to maintain performance. Disadvantage of B + -trees: Extra insertion and deletion overhead, space overhead. The advantages of the B + -trees outweigh the disadvantages, and they are used extensively in all commercial products kwtleung@cse.ust.hk CSIT5300

B + -tree Index Files (cont.) All paths from root to leaf are of the same length (i.e., balanced tree) Each node has between n/ and n pointers. Each leaf node stores between (n 1)/ and n 1 values n is called fanout (it corresponds to the maximum number of pointers/children). The value (n-1)/ is called order (it corresponds to the minimum number of values) Special cases: If the root is not a leaf, it has at least children If the root is a leaf (that is, there are no other nodes in the tree), it can have between 0 and (n 1) values kwtleung@cse.ust.hk CSIT5300 3

Leaf Nodes in B + -trees For i = 1,,..., n 1, pointer P i either points to a file record with search-key value K i, or to a bucket of pointers to file records, each record having search-key value K i. If L i, L j are leaf nodes and i < j, L i s search-key values are less than L j s search-key values P n points to next leaf node in search-key order (right sibling node) kwtleung@cse.ust.hk CSIT5300 4

Non-Leaf Nodes in B + -trees Non leaf nodes form a multi-level sparse index on the leaf nodes. For a non-leaf node with m pointers: All the search-keys in the subtree to which P 1 points are less than K 1 For i n 1, all the search-keys in the subtree to which P i points have values greater than or equal to K i 1 and less than K i Example: P points to a node where the value v of each key is K 1 v < K kwtleung@cse.ust.hk CSIT5300 5

Example of B + -tree B + -tree for account file (n = 5) Leaf nodes must have between and 4 values ( (n 1)/ and n 1, with n=5) Non-leaf nodes other than root must have between 3 and 5 children ( n/ and n with n=5) Root must have at least children kwtleung@cse.ust.hk CSIT5300 6

Observations About B + -trees Since the inter-node connections are done by pointers, the close blocks need not be physically close (i.e., no need for sequential storage) The non-leaf levels of the B + -tree form a hierarchy of sparse indices The B + -tree contains a relatively small number of levels (logarithmic in the size of the main file), thus search can be conducted efficiently Insertions and deletions to the main file can be handled efficiently, as the index can be restructured in logarithmic time (as we shall see) kwtleung@cse.ust.hk CSIT5300 7

Example of Clustering (Primary) B + -tree on Candidate Key 41 11 1 30 45 51 1 3 11 13 15 1 3 30 33 41 43 45 47 51 53 record with search key 1 record with search key 3 FILE WITH RECORDS This example corresponds to dense B+-tree index: Every search key value appears in a leaf node You may also have sparse B+-tree, e.g., entries in leaf nodes correspond to pages kwtleung@cse.ust.hk CSIT5300 8

Example of Non-Clustering (Secondary) B + -tree on Candidate Key 41 11 1 30 45 51 1 3 11 13 15 1 3 30 33 41 43 45 47 51 53 FILE WITH RECORDS record with search key 11 record with search key 3 record with search key 1 Should be always dense kwtleung@cse.ust.hk CSIT5300 9

Example of Clustering B + -tree on Non-Candidate Key 41 11 1 30 45 51 1 3 11 13 15 1 3 30 33 41 43 45 47 51 53 FILE WITH RECORDS records with search key 1 record with search key 3 kwtleung@cse.ust.hk CSIT5300 10

Example of Non-Clustering B + -tree on Non-Candidate Key 41 11 1 30 45 51 1 3 11 13 15 1 3 30 33 41 43 45 47 51 53 pointers to records with search key 1 pointers to records with search key 3 FILE WITH RECORDS kwtleung@cse.ust.hk CSIT5300 11

Queries on B + -trees Find all records with a search-key value of k Start with the root node If there is an entry with search-key value K j = k, follow pointer P j+1 Otherwise, if k < K m 1 (there are m pointers in the node, i.e., k is not larger than all values in the node) follow pointer P j, where K j is the smallest search-key value > k Otherwise, if k K m 1, follow P m to the child node If the node reached by following the pointer above is not a leaf node, repeat the above procedure on the node, and follow the corresponding pointer Eventually reach a leaf node. If key K i = k for some i, follow pointer P i to the desired record or bucket. Otherwise, no record with search-key value k exists. kwtleung@cse.ust.hk CSIT5300 1

Queries on B + -trees (cont.) In processing a query, a path is traversed in the tree from the root to some leaf node If there are K search-key values in the file, the path is no longer than log n/ (K) A node has generally the same size as a disk page, typically 4 kilobytes, and n is typically around 100 (40 bytes per index entry) With 1 million search key values and n = 100, at most log 50 (1,000,000) = 4 nodes are accessed in a lookup kwtleung@cse.ust.hk CSIT5300 13

Inserting a Data Entry into a B + -tree Find correct leaf L Put data entry into L If L has enough space, done! Else, must split L (into L and a new node L) Redistribute entries evenly, copy up middle key Insert index entry pointing to L into parent of L This can happen recursively To split an index node, redistribute entries evenly, but push up middle key (different from leaf splits!) Splits grow tree; root split increases height Tree growth: gets wider or one level taller at top. kwtleung@cse.ust.hk CSIT5300 14

Inserting a Data Entry into a B + -tree (cont.) Before insertion of Clearview After insertion of Clearview kwtleung@cse.ust.hk CSIT5300 15

Deleting a Data Entry from a B + -tree Start at root, and find leaf L where the entry belongs Remove the entry If L is at least half-full, done! If L less than half-full, Try to re-distribute, borrowing from sibling (adjacent node to the right) If re-distribution fails, merge L and sibling If merge occurred, must delete entry (pointing to L or sibling) from parent of L Merge could propagate to root, decreasing height kwtleung@cse.ust.hk CSIT5300 16

Deleting a Data Entry from a B + -tree (cont.) Before deletion of Downtown After deletion of Downtown kwtleung@cse.ust.hk CSIT5300 17

Deleting a Data Entry from a B + -tree (cont.) Before deletion of Perryridge After deletion of Perryridge Node with Perryridge becomes underfull (actually empty, in this special case) and merged with its sibling As a result, Perryridge node s parent became underfull, and was merged with its sibling (and an entry was deleted from their parent) kwtleung@cse.ust.hk CSIT5300 18

Deleting a Data Entry from a B + -tree (cont.) Before deletion of Perryridge After deletion of Perryridge Parent of leaf containing Perryridge became underfull, and borrowed a pointer from its left sibling kwtleung@cse.ust.hk CSIT5300 19

B + -tree File Organization The index file degradation problem is solved using B + -tree indices. The data file degradation problem is solved by using B + -tree file organization. The leaf nodes in a B + -tree file organization store records, instead of pointers Since records are larger than pointers, the maximum number of records that can be stored in a leaf node is less than the number of pointers in a non-leaf node Leaf nodes are still required to be half full Insertion and deletion are handled in the same way as insertion and deletion of entries in a B + -tree index kwtleung@cse.ust.hk CSIT5300 0

B + -tree File Organization (cont.) Example of B + -tree File Organization Good space utilization is important, since records use more space than pointers To improve space utilization, involve more sibling nodes in redistribution during splits and merges Involving siblings in redistribution (to avoid split / merge where possible) results in each node having at least n / 3 entries kwtleung@cse.ust.hk CSIT5300 1

Index Definition in SQL To create an index create index <index-name> on <relation-name> (<attribute-list>) Example: create index b-index on branch(branch-name) Use create unique index to indirectly specify and enforce the condition that the search key is a candidate key To drop an index drop index <index-name> kwtleung@cse.ust.hk CSIT5300

Bulk Loading of a B + -tree If we have a large collection of records, and we want to create a B+ tree on some field, doing so by repeatedly inserting records is very slow Bulk Loading can be done much more efficiently Initialization: Sort all data entries (using external sorting to be discussed in the next class), insert pointer to first (leaf) page in a new (root) page. Root Sorted pages of data entries; not yet in B+ tree 3* 4* 6* 9* 10* 11* 1* 13* 0* * 3* 31* 35* 36* 38* 41* 44* kwtleung@cse.ust.hk CSIT5300 3

Bulk Loading of a B + -tree (cont.) Index entries for leaf pages always entered into right-most index page just above leaf level. When this fills up, it splits. (Split may go up right-most path to the root.) Root 10 0 6 1 3 35 Data entry pages not yet in B+ tree 3* 4* 6* 9* 10* 11* 1* 13* 0** 3* 31* 35*36* 38*41* 44* Root 0 Much faster than repeated inserts! 6 10 1 3 35 38 Data entry pages not yet in B+ tree 3* 4* 6* 9* 10* 11* 1* 13* 0** 3* 31* 35*36* 38*41* 44* kwtleung@cse.ust.hk CSIT5300 4

Deficiencies of Static Hashing In static hashing, function h maps search-key values to a fixed set of B of bucket addresses Databases grow with time. If initial number of buckets is too small, performance will degrade due to too much overflows If file size at some point in the future is anticipated and number of buckets allocated accordingly, significant amount of space will be wasted initially If database shrinks, again space will be wasted One option is periodic re-organization of the file with a new hash function, but it is very expensive These problems can be avoided by using techniques that allow the number of buckets to be modified dynamically kwtleung@cse.ust.hk CSIT5300 5

Extendible Hashing Suppose that a bucket (primary page) becomes full. Why not re-organize file by doubling # of buckets? Reading and writing all pages is expensive! Idea: Use directory of pointers to buckets Double # of buckets by doubling the directory Split just the bucket that overflowed The directory is much smaller than the file, so doubling it is much cheaper. Only one page of data entries is split. No overflow page! The trick lies in how the hash function is adjusted! kwtleung@cse.ust.hk CSIT5300 6

Example Directory is array of size 4 To find bucket for r, take last global depth bits of h(r) LOCAL DEPTH GLOBAL DEPTH 4* 1* 3* 16* Bucket A In our examples, h(r) is the binary representation of r If h(r) = 5 = binary 101, it is in bucket pointed to by 01. 00 01 1* 5* 1* 13* Bucket B Insert: If bucket is full, split it (allocate new page, re-distribute) 10 11 10* Bucket C If necessary, double the directory. (As we will see, splitting a bucket does not always require doubling; we can tell by comparing global depth with local depth for the split bucket.) DIRECTORY 15* 7* 19* DATA PAGES Bucket D kwtleung@cse.ust.hk CSIT5300 7

Example (cont.) Insert h(r)=0 (10100) LOCAL DEPTH Bucket A LOCAL DEPTH 3 GLOBAL DEPTH 4* 1* 3* 16* GLOBAL DEPTH 3* 16* Bucket A 00 01 10 Bucket B 1* 5* 1* 13* Bucket C 000 001 010 011 3 1* 5* 1* 13* 10* Bucket B Bucket C 11 DIRECTORY 10* Bucket D 15* 7* 19* 100 101 110 111 DIRECTORY 15* 7* 3 19* 4* 1* 0* Bucket D Bucket A (`split image' of Bucket A) kwtleung@cse.ust.hk CSIT5300 8

Points to Note 0 = binary 10100. Last bits (00) tell us r belongs in A or A. Last 3 bits needed to tell which. Global depth of directory: Max # of bits needed to tell which bucket an entry belongs to. Local depth of a bucket: # of bits used to determine if an entry belongs to this bucket. When does bucket split cause directory doubling? Before insert, local depth of bucket = global depth Insert causes local depth to become > global depth; directory is doubled by copying it over and `fixing pointer to split image page. (Use of least significant bits enables efficient doubling via copying of directory!) kwtleung@cse.ust.hk CSIT5300 9

Another Example Assume the following hash index where the hash function is determined by the least significant bits. global depth 00 01 10 11 local depth 8 16 64 1 5 9 13 6 10 7 Insert 18 (010010), 3 (100000) kwtleung@cse.ust.hk CSIT5300 30

Another Example (cont.) After the insertion of search keys 18 (010010), 3 (100000) global depth 00 01 10 11 local depth 8 16 64 3 1 5 9 13 6 10 18 7 Insert 3 (011), 4 (100) kwtleung@cse.ust.hk CSIT5300 31

Another Example (cont.) After the insertion of search keys 4 (100), 3 (011) global depth 3 000 001 010 011 100 101 110 111 local depth 3 8 16 64 3 1 5 9 13 6 10 18 7 3 Insert 19 (10011), 17 (10001) 3 4 kwtleung@cse.ust.hk CSIT5300 3

Another Example (cont.) After the insertion of search keys 19 (10011), 17 (10001) global depth 3 000 001 010 011 100 101 110 111 local depth 3 8 16 64 3 1 9 17 6 10 18 7 3 19 3 3 4 Insert 4 (11000) 3 5 13 kwtleung@cse.ust.hk CSIT5300 33

Another Example (cont.) After the insertion of search key 4 (11000) global depth 4 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 local depth 4 16 3 3 1 9 17 6 10 18 7 3 19 3 4 3 5 13 4 8 4 kwtleung@cse.ust.hk CSIT5300 34

Comments on Extendible Hashing If a bucket overflow cannot be handled by increasing the global depth, then we make use of overflow buckets If directory fits in memory, equality search is answered with one disk access; else two. Directory contains one pointer for each hash value for the current global depth; chances are high that directory will fit in memory. Directory grows in spurts, and, if the distribution of hash values is skewed, directory can grow large. Multiple entries with same hash value cause problems (overflow buckets)! Delete: If removal of data entry makes the bucket empty, then this bucket can be merged with its `split image If each directory element points to the same bucket as its split image, then we can halve the directory kwtleung@cse.ust.hk CSIT5300 35

Linear Hashing Linear hashing (LH) is another dynamic hashing scheme, an alternative to Extendible Hashing LH handles the problem of long overflow chains without using a directory, and handles duplicates Idea: Use a family of hash functions h 0, h 1, h,... h i (key) = h(key) mod( i N); N = initial # buckets h is some hash function (range is not 0 to N-1) If N = d0, for some d0, h i consists of applying h and looking at the last di bits, where di = d0 + i. h i+1 doubles the range of h i (similar to directory doubling) kwtleung@cse.ust.hk CSIT5300 36

Linear Hashing (cont.) Directory avoided in LH by using overflow pages, and choosing bucket to split round-robin Splitting proceeds in `rounds. A round ends when all N R initial (for round R) buckets are split. Buckets 0 to Next-1 have been split; Nex to N R yet to be split. Current round number is Level. Search: To find bucket for data entry r, find h Level (r): If h Level (r) in range `Nex to N R, r belongs here. Else, r could belong to bucket h Level (r) or bucket h Level (r) + N R ; must apply h Level+1 (r) to find out. kwtleung@cse.ust.hk CSIT5300 37

Overview of LH File In the middle of a round. Bucket to be split Next Buckets that existed at the beginning of this round: this is the range of h Level Buckets split in this round: If h Level ( search key value ) is in this range, must use h Level+1 ( search key value ) to decide if entry is in `split image' bucket. `split image' buckets: created (through splitting of other buckets) in this round kwtleung@cse.ust.hk CSIT5300 38

Example of Linear Hashing On split, h Level+1 is used to redistribute entries. Level=0, N=4 insert 43 (101011) insert 37(..101), insert 9 (..101) Level=0 h 1 h 0 PRIMARY Next=0 PAGES h 1 h 0 PRIMARY PAGES OVERFLOW PAGES 000 001 00 01 3*44* 36* 9* 5* 5* Data entry r with h(r)=5 000 001 00 01 3* Next=1 9* 5* 5* 37* 010 10 14* 18*10* 30* Primary bucket page 010 10 14* 18*10* 30* insert h(r)=43 011 11 31* 35* 7* 11* 011 11 31* 35* 7* 11* 43* (This info is for illustration only!) (The actual contents of the linear hashed file) 100 00 44* 36* kwtleung@cse.ust.hk CSIT5300 39

Example of Linear Hashing (cont.) After the insertion of search key 9 (11101) level 0 hash fun. 1 hash fun. 0 Primary Pages Overflow Pages 000 00 3 001 010 01 10 next 9 5 14 18 10 30 011 11 31 35 7 11 43 100 00 44 36 101 01 5 37 9 LETS INSERT : 10110 Insert (10110) kwtleung@cse.ust.hk CSIT5300 40

Example of Linear Hashing (cont.) After the insertion of search key (10110) level 0 hash fun. 1 hash fun. 0 Primary Pages Overflow Pages 000 00 3 001 01 9 5 010 011 10 11 next 3 18 10 31 35 7 11 43 100 00 44 36 101 01 5 37 9 110 10 14 30 LETS INSERT Insert 66 66: (1000010) and AND 34 34: (100010) kwtleung@cse.ust.hk CSIT5300 41

Example of Linear Hashing (cont.) After the insertion of search keys 66 (1000010) and 34 (100010) hash fun. 1 hash fun. 0 Primary Pages Overflow Pages 000 00 3 001 01 9 5 010 011 10 11 next 3 18 10 66 34 31 35 7 11 43 100 00 44 36 101 01 5 37 9 110 10 14 30 LETS INSERT 50: 110010 Insert 50 (110010) kwtleung@cse.ust.hk CSIT5300 4

Example of Linear Hashing (cont.) After the insertion of search key 50 (110010) hash fun. 1 000 next 0 Primary Pages 3 Overflow Pages 001 9 5 010 18 10 66 34 50 011 35 11 43 100 44 36 101 5 37 9 Level becomes 1 110 14 30 111 31 7 kwtleung@cse.ust.hk CSIT5300 43