散列表反向查找以查找最小的键

时间:2014-03-14 03:07:26

标签: java dictionary hashmap hashtable reverse-lookup

我有一个面试问题来搜索哈希表中的值并返回最小的键。

我的方法是按键对哈希表进行排序,并遍历它以找到与搜索值对应的键。

我在Python中编写了这个函数:

def smallestKey(x):
    my_dict = {10:20, 5:30, -2:25, 1:20}
    for key in sorted(dict.iterkeys()):
        if (my_dict[key] == x):
            print key

有更好的方法吗?我怎样才能在Java中做同样的事情?

1 个答案:

答案 0 :(得分:1)

我愿意打赌你可以,如果你可以保证你所检查的内容以及你的密钥类型是Number

这是一个代码示例。排序成本为O(n log(n)),线性搜索为O(n),因此其性能约为O(n log(n))。

public <K extends Number & Comparable<K>, V extends Number> K findSmallestKey(Map<K, V> values, V searchItem) {
    // Grab the key set, and sort it.
    List<K> keys = new ArrayList<>(values.keySet());
    Collections.sort(keys);
    for(K key : keys) {
        if(values.get(key).doubleValue() == searchItem.doubleValue()) {
            return key;
        }
    }
    return null;
}

番石榴offers BiMap可能是一个更实用的现实案例;但是,它不允许存在重复值而不会覆盖它们。

这是一个例子。

public <K extends Number, V extends Number> K findSmallestKeyWithBimap(BiMap<K, V> values, V searchItem) {
    return values.inverse().get(searchItem);
}

它更简洁,并且不需要与前一个相同类型的泛型(这个只需要Number,而不是{{1} }和Number)。它的灵活性也低得多,而且由于其性质,您明确保证在键和值之间进行一对一的映射。