2012-04-17 4 views
30

Bir dizi farklı modülde veri içeren bir dizi CSV dosyası etrafında basitçe dolaşan bir yöntem uyguladık. Bu daha sonra 'moduleName' bir hashSet'e ekler. hiçbir çiftleri, bunun yerine daha önce var olup olmadığını kontrol etmek için liste içinde ihtiva eder() yöntemini kullanmak ve yineleme gerekir Bir ArrayList'in sokulmaktadır garanti gibi bir HashSet kullandıkKarma Ayar ve Dizilim Listesi gösterimleri

(Kod aşağıda gösterilmiştir).

Ben karma seti kullanılarak bir dizi listesinin daha iyi bir performansa sahiptir inanıyoruz. Bunu belirlerken doğru muyum? Ayrıca

, birileri bana açıklayabilir:

  1. Nasıl her veri yapısı için performans çalışması için kullanılan olur?
  2. Büyük-O notasyonu kullanan karmaşıklık nedir?

    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

Muhtemelen kullandığınız dili etiketlerden biri olarak eklemek isteyebilirsiniz (diğerlerinden birini ortadan kaldırmak zorundasınız, ancak dil neredeyse hiç şüphesiz daha önemlidir). –

cevap

20

Tamamen farklı sınıflar, o yüzden soru şu: Eğer davranışın ne tür istiyorsun?

HashSet, çoğaltmanın yapılmadığını, size bir O (1) yöntemi sağladığını, ancak siparişi korumadığını garanti eder. Hiçbir çiftleri olmadığından emin olmak değil
ArrayList, O (n) ama girişlerinin sırasını kontrol edebilir.

18

Ben karma seti kullanılarak bir dizi listesinin daha iyi bir performansa sahiptir inanıyoruz. Bunu açıklamakta mıyım? Birçok (o ne demekse) girdileri ile

, evet. Küçük veri boyutları ile, ham lineer arama, hashing'den daha hızlı olabilirdi. Tam olarak nerede kırılsa bile, sadece ölçmek zorundasın. Benim bağırsak duygularım, 10'dan az elemanla, lineer bakışın muhtemelen daha hızlı olduğu; 100'den fazla eleman karmaşası muhtemelen daha hızlıdır, ancak bu sadece benim ...

HashSet'ten aramalar sabit bir zamandır, elemanların hashCode uygulamasının akla uygun olması şartıyla O (1). Bir listeden doğrusal bakış, doğrusal zaman, O (n).

40

My experiment, HashSet öğesinin,öğesinden, 3 öğeden oluşan koleksiyonlardan başlayarak daha hızlı olduğunu gösterir.

Bu veri yapılarının kullanılması bağlıdır tam bir sonuç Tablo

| 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

.

Sen HashSet verileri depolamak ve depolama HashSet için durum için (yinelenen girdileri istemiyoruz gibi) daha iyi ArrayList olduğunu edilmektedir

. Ama sadece saklamak olağan niyet değildir.

Size saklanan verileri okumak ve işlemek için yapmak istedikleri şekilde bağlıdır. Sıralı erişim veya rasgele dizin tabanlı erişim istiyorsanız, ArrayList daha iyidir veya sipariş önemli değilse HashSet daha iyidir.

Sipariş vermek istiyorsanız ancak çok fazla değişiklik (ekleme ve silme) yapmak istiyorsanız, LinkedList daha iyidir. O olarak zaman karmaşıklığı olacak belirli bir eleman HashSet erişen için

(1) ve kullanmış olsaydı ArrayList o kendinizi belirttiğimiz gibi Listede iterate zorunda ve görecekti O (N) olurdu eleman mevcut değilse.