Compact Data Structures: A Practical Approach