我遇到了一个需要帮助的问题 - 假设我有一些由键(整数)和值(整数)组成的数据集。我需要能够,给定一个键的值,找到它所属的最小键范围(即,找到最接近的更大和更小的键),然后通过插值返回匹配值。我想知道哪种方式可以让我在最快的时间内做到这一点(空间复杂性要少得多)。此外,删除是无关紧要的,所有值都是在启动时给出的(我们可以假设启动后不会再添加任何值)。我的重点是搜索时间,而不是插入。
最基本的解决方案是保持一个排序的键数组并在其上使用二进制搜索 - 直到我找到输入键或找到两个大于和小于输入键的相邻元素。此选项将采用O(log n)进行插入和搜索。我想知道是否有更好的。
谢谢!
答案 0 :(得分:2)
我会使用像TreeMap这样的NavigableMap。
NavigableMap<Integer, Integer> map = new TreeMap<>();
map.put(1, 10);
map.put(0, -10);
map.put(5, 25);
map.put(3, 20);
// find the value below.
int key = 2;
Map.Entry<Integer, Integer> entry1 = map.floorEntry(key);
Map.Entry<Integer, Integer> entry2 = map.ceilingEntry(key);
System.out.println(key + " is between " + entry1 + " and " + entry2);
打印
2 is between 1=10 and 3=20
插入,更新,查找和删除的时间复杂度为O(log N)