java - 高效搜索非空交集(Java)

标签 java processing-efficiency disjoint-union

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

有没有比下面这个更有效的解决方案:

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);
}

最佳答案

HashSet 中查找值(包含)平均而言,它是一个恒定时间操作 (O(1)),优于 List,其中 contains 是线性的 (O(n))。因此,如果您的列表足够大,可能值得将第一行替换为:

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

这样做的原因是,要在(未排序的)列表中查找值,您需要检查列表中的每个索引,直到找到您想要的索引或用完要检查的索引。平均而言,如果值在列表中,您将在查找值之前检查一半列表,如果不在列表中,则检查整个列表。对于 hash table ,您根据要查找的值生成一个索引,然后检查该索引(您可能需要 check more than one ,但在设计良好的哈希表中应该不常见)。

此外,如果您使用 Set,则可以保证每个值都是唯一的,因此如果您尝试 add a value that already exists, add will return false .您可以使用它来稍微简化代码(注意:如果您使用列表,这将不起作用,因为 add always returns true on a List ):

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

int value;
if(!list.add(value))
    error("",null);

关于java - 高效搜索非空交集(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13805505/

相关文章:

Java 使用正则表达式解析 Wiki 语法

java - FragmentPagerAdapter 到 ViewPager

java - Atlas-run无法启动Jira,原因是“不受支持的major.minor 52.0版”

python - 如何在 python Class-list 中有效地制作一个编号列表

java - 如何构建标准化的 RESTful Java API

ios - 如何在 Swift 中从一组图像高效地创建多行照片拼贴

c# - WPF:从绑定(bind)列表中删除最后一项的最有效方法?

c++ - 不相交集 union 数据结构中的代表距离

algorithm - 连接二维数组中的不相交集

c# - C# 列表中的不相交联合