Dua koleksi bisa menyelesaikan pekerjaan yang sama dengan hasil identik, tetapi berbeda kecepatan saat data membesar. Perbedaan itu diukur dengan notasi Big-O: deskripsi bagaimana jumlah langkah bertambah ketika jumlah data n bertambah. Bab ini merangkum biaya operasi koleksi yang sudah kita pelajari, lalu menunjukkan perbedaannya pada satu operasi yang paling sering dipakai: pengecekan keanggotaan.
Tiga Taraf Big-O yang Sering Dijumpai #
- O(1) — konstan: jumlah langkah tetap berapa pun ukuran data. Contoh: akses indexer pada
Dictionary. - O(log n) — logaritmik: data bertambah dua kali lipat, langkah hanya bertambah sedikit. Contoh: pencarian pada
SortedDictionary. - O(n) — linier: jumlah langkah sebanding dengan jumlah data. Contoh:
ContainspadaListyang memindai dari depan.
Perbedaan pada Contains #
Contoh berikut memeriksa nama yang sama pada List dan HashSet. Hasilnya identik, tetapi jalannya berbeda: List membandingkan elemen satu per satu dari awal, sedangkan HashSet langsung menuju posisi yang dihitung dari hash nilai.
List<string> namaList = new List<string> { "Budi", "Siti", "Andi", "Rina" };
HashSet<string> namaSet = new HashSet<string> { "Budi", "Siti", "Andi", "Rina" };
Console.WriteLine($"List.Contains(\"Rina\"): {namaList.Contains("Rina")}");
Console.WriteLine($"HashSet.Contains(\"Rina\"): {namaSet.Contains("Rina")}");
Console.WriteLine($"List.Contains(\"Tono\"): {namaList.Contains("Tono")}");
Console.WriteLine($"HashSet.Contains(\"Tono\"): {namaSet.Contains("Tono")}");Output yang Dihasilkan:
List.Contains("Rina"): True
HashSet.Contains("Rina"): True
List.Contains("Tono"): False
HashSet.Contains("Tono"): FalseMari kita telaah hasilnya:
- Baris 1-2: Kedua koleksi berisi empat nama yang sama persis.
- Baris 4-5: Pencarian
"Rina"mengembalikanTruepada keduanya; padaList, pencarian berhenti setelah empat perbandingan karena nama berada di posisi terakhir. - Baris 6-7: Pencarian
"Tono"yang tidak ada memaksaListmemeriksa seluruh empat elemen sebelum menyimpulkanFalse;HashSettetap selesai dalam satu langkah penunjukan posisi.
Pada empat elemen, selisihnya tidak terasa. Pada empat puluh ribu elemen, selisihnya nyata: pencarian O(1) tetap stabil, sementara pencarian O(n) makin lama seiring data bertambah.
Tabel Kompleksitas Operasi Koleksi #
| Operasi | List | Dictionary | HashSet | SortedDictionary | Queue / Stack |
|---|---|---|---|---|---|
| Akses berdasarkan kunci atau indeks | O(1) | O(1) | — | O(log n) | — |
| Tambah di ujung | O(1) | O(1) | O(1) | O(log n) | O(1) |
| Cari / Contains | O(n) | O(1) | O(1) | O(log n) | O(n) |
| Hapus berdasarkan kunci atau nilai | O(n) | O(1) | O(1) | O(log n) | — |
| Sisip / hapus di tengah | O(n) | — | — | — | — |