搜索列表Vs集中元素的复杂性

时间:2013-05-23 13:41:28

标签: java collections complexity-theory

考虑一下,如果我必须在表中搜索特定的行,按照ORM,每一行都是我认为的对象。我没有在JDBC上工作过,所以通常作为一种更好的做法,这些POJO对象是收集还是保留的?在集合或列表中?

我试图找到在List Vs中搜索元素的复杂性。设置

我做了什么?

private void searchSet() {
        Set<String> names = new HashSet<>();
        names.add("srk");
        names.add("lastminute");
        names.add("monkey");
        for(String x:names){
            if(x.equals("monkey")){
                System.out.println("caught the name "+x);
            }
        }

}



private void searchList() {
    List<String> names = new ArrayList<>();
    names.add("srk");
    names.add("lastminute");
    names.add("monkey");
    for(String x:names){
        if(x.equals("monkey")){
            System.out.println("caught the name "+x);
        }
    }

}

我正在使用以下方法计算在集合和列表中搜索元素所花费的时间。

    long startTime,endTime,totalTime;
    startTime = System.nanoTime();
    endTime = System.nanoTime();
    totalTime = endTime - startTime;

现在,我有下面的统计数据

System.out.println("Time taken to search an element in list : "+totalTime);//for list - 614324 
System.out.println("Time taken to search an element in set : "+totalTime);//for set - 757359

根据这些统计数据可以得出结论,搜索List中的元素比设置更快? 哪个是用于存储数据库记录对象的更好的集合,用于搜索。在List Vs Set中搜索元素的复杂性是什么?在一般意义上?

3 个答案:

答案 0 :(得分:3)

数据结构没有复杂性,算法也有。 (请注意,数据结构通常带有基本操作的复杂性,这些算法本身就是很小的算法。)在您的情况下,您自己为两个容器实现了查找算法,并将其作为线性搜索实现,即O(n )。您观察到的速度差异是ArrayList比HashSet更简单,更快速遍历的结果,即算法具有相同的复杂度,但常数因子更小。

其次,你想要计时的功能中有I / O.这通常会完全支配您执行的任何实际操作,并使您的基准无用。

第三,你正在寻找复杂性,你写了一个基准。那是错的。您可以通过制作基准并在图表中绘制不同输入大小的结果来获得复杂性的提示,但要真正了解复杂性,您必须分析算法,而不是运行它。

第四,Java中的List和Set不是数据结构,它们是接口。您选择的数据结构是ArrayList(实现List接口的连续数组数据结构的一个版本)和HashSet(实现Set接口的哈希表数据结构的一个版本)。所以你需要看看那些。

对于数组,除非它被排序,否则查找算法需要线性时间,因为除了遍历整个事物之外别无选择。

对于针对查找进行了优化的哈希表,在最坏的情况下,查找算法在技术上仍然是O(n),但在通常情况下将是O(1)。但是,您必须实际使用优化的查找算法(由Set.contains提供)才能利用这一点 - 对线索搜索HashSet并不比在ArrayList上进行线性搜索更好(实际上更糟糕)。

答案 1 :(得分:1)

两个集合中都有方法contain(),那你为什么再次遍历?列表的复杂度为O(n),而设置为O(1)则为常量。

答案 2 :(得分:0)

列出实现代码: https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Documents/List.cs,eabc7101897ec6e6

设置实施代码: https://referencesource.microsoft.com/#System.Core/System/Collections/Generic/HashSet.cs,50c894a3f7ad7bd0

数据结构时间复杂度: https://www.bigocheatsheet.com/

有用的书:Anany Levitin的算法设计和分析简介

前两个链接演示了Set类和List的内部实现,基本上它们都是使用Array数据结构类型实现的。 第三个链接演示了不同操作的每种数据结构的复杂性。 如果您希望衡量两个不同代码(集合,列表)的复杂性,我们可以

  1. 将时间复杂度用于算法分析,方法是查看最多的操作来补偿算法解决问题所需的大部分时间。 2.设置一个总和,以表示算法基本运算的次数 被执行
  2. 使用标准公式和求和规则,找到一个封闭的- 形成计数的公式,或者至少确定其增长顺序。