题目地址:
https://www.lintcode.com/problem/mini-cassandra/description
Cassandra是一个NoSQL数据库。一个条目由
3
3
3部分组成:
1、row_key 用于哈希,不支持范围查询。我们将其简化为字符串;
2、column_key 已排序并支持范围查询。我们将其简化为整数;
3、value 是一个字符串。你可以将任何数据序列化为字符串并将其存储在值中;
要求实现两个方法:
1、insert(row_key, column_key, value);
2、query(row_key, column_start, column_end) 返回条目列表,要按照column_key的顺序返回。
思路是哈希表套哈希表,也就是HashMap<String, TreeMap<Integer, String>>
的形式来存储。value用TreeMap以保证key有序。代码如下:
import java.util.*;
public class MiniCassandra {
private Map<String, Map<Integer, String>> map;
public MiniCassandra() {
// do intialization if necessary
map = new HashMap<>();
}
/*
* @param raw_key: a string
* @param column_key: An integer
* @param column_value: a string
* @return: nothing
*/
public void insert(String row_key, int column_key, String value) {
// write your code here
map.putIfAbsent(row_key, new TreeMap<>());
map.get(row_key).put(column_key, value);
}
/*
* @param row_key: a string
* @param column_start: An integer
* @param column_end: An integer
* @return: a list of Columns
*/
public List<Column> query(String row_key, int column_start, int column_end) {
// write your code here
List<Column> res = new ArrayList<>();
// 一定要判断一下key是否存在,否则会NPE
if (map.containsKey(row_key)) {
for (Map.Entry<Integer, String> entry : map.get(row_key).entrySet()) {
if (column_start <= entry.getKey() && entry.getKey() <= column_end) {
res.add(new Column(entry.getKey(), entry.getValue()));
}
}
}
return res;
}
}
class Column {
public int key;
public String value;
public Column(int key, String value) {
this.key = key;
this.value = value;
}
}
插入的时间复杂度是 O ( log n c ) O(\log n_c) O(lognc), n c n_c nc表示那个row_key对应的TreeMap里有多少个entry,query的时间复杂度是 O ( n c ) O(n_c) O(nc),空间 O ( ∑ n c ) O(\sum n_c) O(∑nc)。