2012-04-17 83 views
30

我已经实现了一个方法,它只是围绕一组包含多个不同模块上的数据的CSV文件进行循环。然后将这个'moduleName'添加到hashSet中。 (代码如下)散列集和数组列表性能

我已经使用了一个hashSet,因为它保证不会插入重复项而不是ArrayList,它必须使用contains()方法并遍历列表来检查它是否已经存在。

我相信使用哈希集具有比数组列表更好的性能。 我说得对吗?如果使用

  1. 如何工作的每一个数据结构中的表现:

    此外,有人可以解释一下吗?

  2. 使用big-O符号的复杂性是什么?

    HashSet<String> modulesUploaded = new HashSet<String>(); 
    
    for (File f: marksheetFiles){ 
        try { 
         csvFileReader = new CSVFileReader(f); 
         csvReader = csvFileReader.readFile(); 
         csvReader.readHeaders(); 
    
         while(csvReader.readRecord()){ 
          String moduleName = csvReader.get("Module"); 
    
          if (!moduleName.isEmpty()){ 
           modulesUploaded.add(moduleName); 
          } 
         } 
    
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
    
        csvReader.close(); 
    } 
    return modulesUploaded; 
    

    }

+0

您可能希望将您正在使用的语言作为其中一个标签(您必须消除其中一个标签,但语言几乎无疑更重要)。 – 2012-04-17 17:54:03

回答

20

他们是完全不同的类,所以问题是:你想要什么样的行为?

HashSet确保没有重复,给你一个O(1)方法,但不保留顺序。
ArrayList不确保没有重复,是O(n)但您可以控制条目的顺序。

18

我相信使用哈希集具有比数组列表更好的性能。我说得对吗?

有很多(不管是什么意思)条目,是的。然而,对于小数据量的原始线性搜索可能比哈希算法更快。盈亏平衡点在哪里,你只需要衡量一下。我的直觉是,只有不到10个元素,线性查找可能更快;有超过100个元素散列可能更快,但这只是我的感觉...

从HashSet查找恒定时间O(1),前提是元素的hashCode实现是理智的。从列表中线性查找是线性时间O(n)。

40

My experiment显示HashSet比包含3个元素的集合开始的ArrayList更快。

一个完整的结果表

| Boost | Collection Size | 
| 2x |  3 elements | 
| 3x |  10 elements | 
| 6x |  50 elements | 
| 12x |  200 elements | <= proportion 532-12 vs 10.000-200 elements 
| 532x | 10.000 elements | <= shows linear lookup growth for the ArrayList 
3

它取决于数据结构的使用。

您正在将数据存储在HashSet中,对于您的案例来说,存储HashSet要好于ArrayList(因为您不需要重复条目)。但只是存储不是通常的意图。

这取决于您希望如何读取和处理存储的数据。如果您想要顺序访问或基于随机索引的访问,那么ArrayList更好,或者如果排序并不重要,那么HashSet就更好。

如果排序很重要,但您想进行大量修改(添加和删除),则LinkedList更好。

为了访问特定的元素HashSet将有时间复杂度为O(1),如果你要使用ArrayList这本来是O(N)为你自己所指出的那样,你将不得不iterate在列表中看到如果元素不存在。