首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在小于O(n)时间内求出数据结构中元素之间的最小差

在小于O(n)时间内求出数据结构中元素之间的最小差
EN

Stack Overflow用户
提问于 2016-05-30 03:19:43
回答 2查看 384关注 0票数 2

假设我在一个数据结构中有一些整数。当我在数据结构中插入新的数字时,我希望得到新插入的元素与数据结构中已经存在的任何其他元素之间的最小差异。我应该使用什么数据结构和算法?O(n)解是平凡的,我想要更好。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-30 03:37:50

一种选择是使用TreeSet (基于TreeMap),这将需要几个O(lg n)操作。该类公开两个方法,用于查找最接近您希望插入的值的元素:

公共E上限(E e) 返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回null。 公共E层(E e) 返回此集合中小于或等于给定元素的最大元素,如果没有这样的元素,则返回null。

代码语言:javascript
复制
public static int findClosest(TreeSet set, Integer val) {
    if (set == null || set.size() == 0) {
        return -1;
    }

    // ceiling == 9 for input of 7
    // O(lg n) operation
    Integer ceiling = (Integer)set.ceiling(val);
    // floor = 6 for input of 7
    // O(lg n) operation
    Integer floor = (Integer)set.floor(val);

    if (ceiling == null) {
        return val - floor;
    }
    if (floor == null) {
        return ceiling - val;
    }

    return (val - floor > ceiling - val) ? ceiling - val : val - floor;
}

public static void main(String[] args) {
    TreeSet<Integer> ts = new TreeSet<>();
    ts.add(5);
    ts.add(1);
    ts.add(6);
    ts.add(9);
    ts.add(2);
    ts.add(3);

    int diff = findClosest(ts, 7);
    // closest is 6, so diff == 1
}
票数 5
EN

Stack Overflow用户

发布于 2016-05-30 03:31:22

你可以用高度平衡二叉树。这些可以用许多数据结构中的一种实现。插入通常是O(log(n)),查找一个或两个最近的整数(插入值的两边)最多也是O(log(n))。

可能还有其他数据结构可以做得更好(特别是如果您可以合理地绑定需要处理的整数值),但我想不出有一个比这更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37517157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档