Think Data Structures: Algorithms and Information Retrieval in Java