【问题标题】:Hash table reverse lookup to find smallest key哈希表反向查找以找到最小的键
【发布时间】:2014-04-19 04:15:38
【问题描述】:

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

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

我用 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 中做同样的事情?

【问题讨论】:

  • 你最好对所有键进行线性搜索并记录最大值而不进行排序,因为排序需要Theta(nlogn)
  • [看起来][1] 您需要一个外部库才能在 Java 中执行此操作。 [1]:stackoverflow.com/questions/1670038/…
  • @C.B.有一点。
  • @C.B.谢谢!有道理。
  • @Ramya 检查 GETah 的答案,从 2011 年 10 月 20 日开始。它是双向映射的简单实现,您可以将其视为内部有两个映射的结构,键和值镜像.所以基本上在map1中使用k1和v1作为key和value,在map2中使用v1作为key,k1和value。因此,您可以双向查询地图。

标签: java dictionary hashmap hashtable reverse-lookup


【解决方案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;
}

Guava offers BiMap可能是一个更实用的现实案例;但是,它不允许出现重复值而不覆盖它们。

这是一个例子。

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

它更加简洁,并且不需要与前一个相同类型的泛型(这个只需要是Number,而不是NumberComparable)。它也不太灵活,并且由于其性质,您可以明确保证在键和值之间具有一对一的映射。

【讨论】:

  • 搜索项不会是最小的key吗?如果是这种情况,则不需要 searchItem。只需返回排序数组中的第一个元素(如果您显然从最小到最大排序),不是吗?另一方面,如果您确实需要搜索特定项目,那么二进制搜索会更快,毕竟它已经排序了。
  • 不一定。如果您没有使用BiMap,并且您有两个相同的值,则需要找到第一次出现的键。这并不总是保证它是第一个元素。如果我的搜索项是 300,而它的键编号结果是 127 和 133,那么 127 就是正确答案。
  • 确实如此。但是使用二分搜索而不是线性搜索怎么样?
  • 嗯...我不能使用二进制搜索,因为我正在寻找与键相关的值,而不是相反。我唯一排序的是密钥集。就这样,我不知道地图中包含的值 - 这是我需要搜索的内容。
猜你喜欢
  • 2012-01-08
  • 1970-01-01
  • 2013-12-24
  • 2012-10-11
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
相关资源
最近更新 更多