【Lintcode】502. Mini Cassandra

题目地址:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值