高效搜索非空交叉点(Java)
我有一个返回整数值或整数范围(initial..final)的方法,我想知道值是否都不相交 是否有比以下解决方案更有效的解决方案:高效搜索非空交叉点(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
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;ierror(“,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);
}
}
}