高效搜索非空交叉点(Java)

高效搜索非空交叉点(Java),java,processing-efficiency,disjoint-union,Java,Processing Efficiency,Disjoint Union,我有一个返回整数值或整数范围(initial..final)的方法,我想知道值是否都不相交 是否有比以下解决方案更有效的解决方案: ArrayList<Integer> list = new ArrayList<Integer>(); // For single value int value; if(!list.contains(value)) list.add(value); else error("",null); // Range int in

我有一个返回整数值或整数范围(initial..final)的方法,我想知道值是否都不相交

是否有比以下解决方案更有效的解决方案:

ArrayList<Integer> list = new ArrayList<Integer>();

// For single value
int value;
if(!list.contains(value))
    list.add(value);
else
    error("",null);

// Range
int initialValue,finalValue;
for(int i = initialValue; i <= finalValue; i++){
    if(!list.contains(i))
        list.add(i);
    else
        error("",null);
}
ArrayList list=new ArrayList();
//对于单个值
int值;
如果(!list.contains(值))
列表。添加(值);
其他的
错误(“,空);
//射程
int initialValue,finalValue;
for(int i=initialValue;i在中查找值(
包含
)平均而言是一个常数时间操作(O(1)),这比
列表
好,其中
包含
是线性的(O(n))。因此,如果列表足够大,则可能值得将第一行替换为:

HashSet<Integer> list = new HashSet<Integer>();

涉及范围的问题通常会导致使用树。以下是一种使用树的方法:

公共类断接器{
私有最终NavigableSet整数=新树集();
公共布尔检查(int值){
返回整数。添加(值);
}
公共布尔检查(int-from,int-to){
NavigableSet range=整数。子集(from,true,to,true);
if(range.isEmpty()){
addRange(从、到);
返回true;
}
否则{
返回false;
}
}
私有void addRange(int-from,int-to){

对于(int i=from;i
error(“,null);
似乎非常无用……范围有多大?如果范围很小,则可能将其作为一系列单独的值来处理,但如果范围很大(数百个),那么最好将其作为范围处理,并将单个值作为范围的特例处理,其中包含一个值。@BrendanLong显然,该错误只是一个例子。Tom Anderson:范围很难预测(此控制用于dsl),但我认为它们大约有一到两百个。相关问题:
HashSet<Integer> list = new HashSet<Integer>();

int value;
if(!list.add(value))
    error("",null);
public class DisjointChecker {

    private final NavigableSet<Integer> integers = new TreeSet<Integer>();

    public boolean check(int value) {
        return integers.add(value);
    }

    public boolean check(int from, int to) {
        NavigableSet<Integer> range = integers.subSet(from, true, to, true);
        if (range.isEmpty()) {
            addRange(from, to);
            return true;
        }
        else {
            return false;
        }
    }

    private void addRange(int from, int to) {
        for (int i = from; i <= to; ++i) {
            integers.add(i);
        }
    }

}