Java 在不到O(n)的时间内获得数据结构中元素之间的最小差异

Java 在不到O(n)的时间内获得数据结构中元素之间的最小差异,java,algorithm,data-structures,tree,Java,Algorithm,Data Structures,Tree,假设数据结构中有一些整数。当我在数据结构中插入新编号时, 我希望得到新插入的元素与数据结构中已有的任何其他元素之间的最小差异。我应该使用什么数据结构和算法?O(n)解很简单,我想要更好的。 谢谢。你可以用一个。这些可以通过多种数据结构之一实现。插入通常平均为O(log(n)),查找一个或两个最近的整数(插入值的任一侧)也最多为O(log(n)) 可能还有其他数据结构可以做得更好(特别是如果你可以合理地绑定需要处理的整数值),但我想不出一个现成的数据结构。一个选择是使用树集(基于树映射),这需要几

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

你可以用一个。这些可以通过多种数据结构之一实现。插入通常平均为O(log(n)),查找一个或两个最近的整数(插入值的任一侧)也最多为O(log(n))


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

一个选择是使用
树集(基于
树映射
),这需要几个
O(lg n)
操作。该类公开了两个方法,可用于查找最接近要插入的值的元素:

公共电子天花板(E E)
返回此集合中大于或等于给定元素的最小元素,如果没有此类元素,则返回null

公共电子楼层(E)
返回此集合中小于或等于给定元素的最大元素,如果没有此类元素,则返回null

public static int findClosest(树集,整数val){
if(set==null | | set.size()==0){
返回-1;
}
//上限==9,输入7
//O(lg n)操作
整数上限=(整数)设置上限(val);
//输入7时,楼层=6
//O(lg n)操作
整数楼层=(整数)集合楼层(val);
如果(上限==null){
返回值-楼层;
}
if(floor==null){
返回上限-val;
}
返回(val-地板>天花板-val)?天花板-val:val-地板;
}
公共静态void main(字符串[]args){
树集ts=新树集();
ts.add(5);
ts.add(1);
ts.add(6);
ts.add(9);
ts.add(2);
ts.add(3);
int diff=findClosest(ts,7);
//最近的是6,所以diff==1
}

您可以使用基于树的解决方案,该解决方案可能会给出一个
O(lg n)
解决方案。
天花()
floor()
是否至少对其中一个更好,因为如果值已经在集合中,则0的距离比任何其他值都小?(当然,假设您在插入新值之前进行检查)@Andreas我添加了一个检查,以查看集合是否包含已传入的值,在这种情况下,差值将为零。添加此检查后,我的逻辑应该正常。是否有任何特殊原因导致
TreeSet
参数为原始参数?--当
val
已经是
Integer
时,
newinteger(val)
有什么意义添加
contains()。调用
contains();这只是另一个
O(lgn)
操作。
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
}