Java 在列表与集合中搜索元素的复杂性

Java 在列表与集合中搜索元素的复杂性,java,collections,complexity-theory,Java,Collections,Complexity Theory,考虑一下,如果我必须搜索表中的某一行,根据ORM,我相信每一行都是一个对象。我没有在JDBC上做过大量的工作,所以一般来说,作为更好的实践,这些POJO对象收集或保存在哪里?在集合或列表中 我试图找出在列表和集合中搜索元素的复杂性 我做了什么 private void searchSet() { Set<String> names = new HashSet<>(); names.add("srk"); names.add(

考虑一下,如果我必须搜索表中的某一行,根据ORM,我相信每一行都是一个对象。我没有在JDBC上做过大量的工作,所以一般来说,作为更好的实践,这些POJO对象收集或保存在哪里?在集合或列表中

我试图找出在列表和集合中搜索元素的复杂性

我做了什么

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

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

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
基于这些统计数据,我们可以得出结论,在列表中搜索元素比在集合中搜索元素要快?
这是存储数据库记录对象的更好集合,用于搜索。在列表和集合中搜索元素的复杂性是什么。在一般意义上?

在这两个集合中都已经给出了方法contain,那么为什么要再次遍历?列表的复杂度为On,集合的复杂度为O1,这是常数。

两个集合中已经给出了方法contain,那么为什么要再次遍历?列表的复杂性为On,集合的复杂性为O1,这是常数。

数据结构没有复杂性,算法有复杂性。请注意,数据结构通常伴随着其基本操作的复杂性而来,这些操作本身就是微小的算法。在您的例子中,您自己为这两个容器实现了find算法,并将其作为一个线性搜索来实现,这是启用的。您观察到的速度差异是由于ArrayList比HashSet更简单,遍历速度更快,即算法具有相同的复杂性,但常数因子更小

第二,在要计时的函数中有I/O。这通常会完全支配您执行的任何实际操作,并使您的基准变得无用

第三,您正在寻找复杂性,并编写了一个基准。那是错误的。通过使用基准测试并在图形中绘制不同输入大小的结果,您可以得到复杂性的提示,但要真正了解复杂性,您必须分析算法,而不是运行算法

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

对于数组,除非对其进行排序,否则查找算法需要线性时间,因为除了遍历整个过程之外,您别无选择


对于为查找而优化的哈希表,从技术上讲,在最坏的情况下,查找算法仍然处于启用状态,但在常见情况下将是O1。但是,您必须实际使用Set.contains提供的优化查找算法才能利用这一点-在HashSet上进行线性搜索并不比在ArrayList上进行线性搜索更好,实际上更差。

数据结构没有复杂性,算法有。请注意,数据结构通常伴随着其基本操作的复杂性而来,这些操作本身就是微小的算法。在您的例子中,您自己为这两个容器实现了find算法,并将其作为一个线性搜索来实现,这是启用的。您观察到的速度差异是由于ArrayList比HashSet更简单,遍历速度更快,即算法具有相同的复杂性,但常数因子更小

第二,在要计时的函数中有I/O。这通常会完全支配您执行的任何实际操作,并使您的基准变得无用

第三,您正在寻找复杂性,并编写了一个基准。那是错误的。通过使用基准测试并在图形中绘制不同输入大小的结果,您可以得到复杂性的提示,但要真正了解复杂性,您必须分析算法,而不是运行算法

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

对于数组,除非对其进行排序,否则查找算法需要线性时间,因为除了遍历整个过程之外,您别无选择

对于为查找而优化的哈希表,从技术上讲,在最坏的情况下,查找算法仍然处于启用状态,但在常见情况下将是O1。但是,您必须实际使用Set.contains提供的优化查找算法才能利用这一点-在HashSet上进行线性搜索并不比在ArrayList上进行线性搜索更好,实际上更差。

列出实现代码:

设置实现代码:

数据结构时间复杂度:

有用的书:介绍算法的设计和分析阿纳尼莱维廷

前两个链接演示了Set类和List的内部实现,basical 它们都是使用数组数据结构类型实现的。 第三个链接演示了不同操作的每个数据结构的复杂性。 如果您希望度量两个不同代码集的复杂性,请列出

在算法分析中使用时间复杂度,通过查看对算法解决问题所需的大部分时间进行补偿的most操作。 2.设置一个表示算法基本运算次数的和 被处决 使用标准公式和求和操作规则,或者- 形成计数公式,或者至少建立其增长顺序。 列出实施代码:

设置实现代码:

数据结构时间复杂度:

有用的书:介绍算法的设计和分析阿纳尼莱维廷

前两个链接演示了Set类和List的内部实现,它们基本上都是使用数组数据结构类型实现的。 第三个链接演示了不同操作的每个数据结构的复杂性。 如果您希望度量两个不同代码集的复杂性,请列出

在算法分析中使用时间复杂度,通过查看对算法解决问题所需的大部分时间进行补偿的most操作。 2.设置一个表示算法基本运算次数的和 被处决 使用标准公式和求和操作规则,或者- 形成计数公式,或者至少建立其增长顺序。
我认为地图的复杂性是O1,因为你可以用它的键找到值。在集合中,没有任何理由可以立即找到元素。列表和集合应具有On/2。你们是对的,但我说的是当所有元素都位于不同的桶中时的最佳情况。最糟糕的复杂度可能会出现,但我会更新我的答案。我认为对于地图来说,复杂度是O1,因为你可以用它的键找到值。在集合中,没有任何理由可以立即找到元素。列表和集合应具有On/2。你们是对的,但我说的是当所有元素都位于不同的桶中时的最佳情况。最糟糕的复杂性可能会出现,但我会更新我的答案
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