Ringkasan kompleksitas operasi tiap container STL.
Daftar Isi
Memilih container yang tepat menentukan apakah solusi berjalan dalam O(1), O(log n), atau O(n) per operasi. STL memiliki belasan container dengan profil operasi berbeda — vector cepat untuk akses acak tetapi lambat untuk insert tengah; unordered_map cepat untuk lookup rata-rata tetapi tidak mendukung lower_bound. Pada Chapter ini kita akan menyusun tabel kompleksitas lengkap untuk semua container STL dan memvalidasinya dengan benchmark sederhana. Tabel ini adalah cheat sheet yang akan dipakai berulang-ulang sepanjang sisa course.
Array kontigu (vector, array): elemen disimpan berdampingan. Akses acak = pointer arithmetic O(1). Tetapi insert tengah butuh menggeser elemen setelahnya → O(n).
Doubly linked list (list): setiap node menyimpan pointer ke predecessor dan successor. Insert/erase pada iterator yang sudah dimiliki hanya butuh memperbarui 4 pointer → O(1). Tetapi akses acak butuh traversal dari head → O(n).
Red-Black Tree (set/map): pohon biner seimbang dengan tinggi O(log n). Setiap operasi menuruni pohon dari root ke daun → O(log n).
Hash table (unordered_*): hash function menentukan bucket. Lookup rata-rata O(1) bila distribusi hash merata; O(n) bila semua key jatuh di satu bucket.
Linear scan O(n): 100000 elemen, masing-masing diakses satu kali. Waktu ~206 µs → ~2 ns per elemen, sesuai ekspektasi cache-friendly iteration vector.
Binary search O(log n): 17 langkah untuk N = 100000 (log₂ 100000 ≈ 17). Waktu ~0.13 µs — sangat cepat, jauh lebih kecil dari linear scan.
Hash lookup O(1) avg: satu hash + satu bucket lookup. Waktu ~0.10 µs, sebanding dengan binary search. Perhatikan bahwa konstanta hash bisa lebih besar dari binary search untuk data kecil; hash unggul saat data besar.
vector::push_back100000×: ~1000 µs. Mahal karena realokasi terjadi beberapa kali (kapasitas tumbuh 1 → 2 → 4 → …). Setelah reserve(N), push_back menjadi ~200 µs (lima kali lebih cepat) — alokasi di awal menghemat realokasi.
deque::push_front100000×: ~54 µs. deque menambah chunk baru di depan saat chunk depan penuh — operasi O(1) per push. Lebih cepat dari vector::push_backtanpa reserve karena tidak ada realokasi penuh.