数据结构,便于查找

时间:2015-03-16 15:12:35

标签: java algorithm data-structures lookup java-6

我正在寻找java中的数据结构/算法,它执行以下操作 -

  1. 将数据集存储到某个数据结构中以便于查找
  2. 如果不存在完全匹配,则选择最接近的(获得B的值)
  3. 如果恰好介于两者之间,请选择较高的A值以获得B
  4. 我有一对数字,例如 -

    A   B
    80  0
    76  1
    64  3
    56  4
    48  10
    

    我只知道A的值,并且应该通过应用上述规则进行直接查找来找出/得出B的值。

    示例 - 1

    如果我得到80的值,则输出为0

    示例 - 2

    如果我得到75的值,则输出为1 [根据规则2]

    示例 - 3

    如果我得到70的值,则输出为1 [根据规则3]

    有什么建议吗?

    基于评论的更新 - log(N)查找是可以接受的。我愿意自己实施它,但需要有关如何实现它的建议。 A的范围在0到1000之间变化,1位精度点。

3 个答案:

答案 0 :(得分:7)

实际上已经有一个数据结构可以完全满足您的要求,即TreeMap

它有一些方法可以让你获得一把钥匙的“地板”和“天花板”。之后,一些小数学将为您提供实际想要返回的价值:

public static TreeMap<Integer, Integer> tm = new TreeMap<>();

public static void main(String[] args) throws Exception {
    tm.put(80, 0);
    tm.put(76, 1);
    tm.put(64, 3);
    tm.put(56, 4);
    tm.put(48, 10);

    System.out.println(myGet(80));  // 0
    System.out.println(myGet(75));  // 1
    System.out.println(myGet(70));  // 1
}

public static int myGet(int key) {
    Integer value = tm.get(key);

    if (value == null) {
        Entry<Integer, Integer> floor = tm.floorEntry(key);
        Entry<Integer, Integer> ceiling = tm.ceilingEntry(key);

        if ((key - floor.getKey()) < (ceiling.getKey() - key)) {
            value = floor.getValue();
        } else {
            value = ceiling.getValue();
        }
    }

    return value;
}

注意:当没有楼层/天花板时,我没有考虑适当的null检查,但是你明白了。

答案 1 :(得分:1)

将A和B存储在按A中的值排序的数组/列表中。

使用修改后的二进制搜索形式查找A的精确或最接近的值(以满足条件2和3)。

答案 2 :(得分:1)

听起来像是家庭作业,所以我的回答将是算法建议的形式。

将值对存储在二维数组中,按照&#34; A&#34;的升序存储。要查找结果,请使用二进制搜索来查找最近的A值最低值,如果不准确,请使用索引+ 1.