Menghitung kemunculan tiap nilai

Satu akumulator per nilai unik, dan kunci yang belum ada harus disiapkan sebelum dapat ditambah.

Sebaiknya baca lebih dulu: Map, data yang ditunjuk dengan nama, Menghitung sampai berhenti.

Banyak akumulator sekaligus

Menghitung kemunculan adalah akumulator dari pelajaran 1.2, tetapi bukan satu, melainkan satu per nilai unik. Yang menyimpan seluruh akumulator itu satu map, dan kuncinya nilai yang sedang dihitung.

IngatKunci yang belum ada tidak dapat ditambah. Ia harus disiapkan dengan nol lebih dulu, baru dinaikkan.

Bug yang paling khas

Langsung menambah

SET hasil = {}
FOR EACH item IN items
  SET hasil[item] = hasil[item] + 1
END

Disiapkan lebih dulu

SET hasil = {}
FOR EACH item IN items
  IF NOT ADA hasil[item]
    SET hasil[item] = 0
  END
  SET hasil[item] = hasil[item] + 1
END

Kolom kiri gagal pada kemunculan PERTAMA setiap nilai, sebab ia membaca kunci yang belum ada. Yang membuatnya sulit dilacak: kegagalannya bukan pada elemen pertama array saja, melainkan pada elemen pertama setiap nilai baru, jadi ia dapat berjalan benar untuk lima elemen lalu gagal pada elemen keenam. Kolom kanan memisahkan penyiapan dari penambahan, dan sesudah penyiapan itu barisnya sama persis dengan akumulator biasa.

Perhatikan bahwa penyiapannya menulis nol, bukan satu. Menulis satu terasa lebih pendek sebab menggabungkan penyiapan dengan penambahan pertama, tetapi ia menaruh angka satu di dua tempat berbeda dalam satu blok kode, dan pada suatu hari salah satunya akan diubah tanpa yang lain. Menyiapkan dengan nol membuat baris penambahan menjadi satu satunya tempat angka satu muncul.

Melihat map bertumbuh

SET hasil = {}
FOR EACH item IN items
  IF NOT ADA hasil[item]
    SET hasil[item] = 0
  END
  SET hasil[item] = hasil[item] + 1
END
hasil{} kosong

Map hasil dimulai kosong. Belum ada satu pun kunci.

Langkah 1 dari 8
items berisi ["a", "b", "a"]. Perhatikan kunci a disiapkan sekali lalu dinaikkan dua kali.

Perhatikan langkah ketujuh. Cabang penyiapan dilewati bukan karena ada penanda khusus, melainkan karena kuncinya memang sudah ada dari kemunculan sebelumnya. Itulah gunanya penyiapan bersyarat: ia berjalan tepat sekali per nilai unik, tanpa perlu satu pun daftar nilai yang sudah pernah dilihat.

Nilai yang muncul sekali, dan array kosong

  • Nilai yang muncul sekali tetap masuk, dengan hitungan satu. Ia bukan diabaikan karena tidak berulang.
  • Array kosong menghasilkan map kosong. Loop tidak berjalan sekali pun, dan map kosong adalah jawaban yang benar.
  • Jumlah seluruh hitungan selalu sama dengan panjang array masukannya. Ini pemeriksaan cepat yang dapat dipakai membuktikan hasilnya masuk akal.

Butir terakhir berguna di luar pelajaran ini. Ketika sebuah hasil sulit diperiksa satu per satu, mencari besaran yang seharusnya kekal biasanya lebih murah daripada menelusuri seluruhnya. Di sini besaran itu jumlah total, dan kalau jumlahnya tidak cocok, kesalahannya pasti ada tanpa perlu tahu di mana.

Periksa pemahaman

items berisi ["m", "n", "m", "o", "n", "m"]. Berapa kali cabang penyiapan dijalankan?

Ringkasan

  • Menghitung kemunculan adalah banyak akumulator sekaligus, satu per nilai unik.
  • Kunci yang belum ada harus disiapkan dengan nol sebelum dapat ditambah.
  • Penyiapan bersyarat berjalan tepat sekali per nilai unik, tanpa daftar tambahan.
  • Siapkan dengan nol, bukan dengan satu, supaya angka satu hanya muncul di satu tempat.
  • Kegagalan membaca kunci yang belum ada muncul pada elemen pertama setiap nilai baru, bukan hanya pada elemen pertama array.
  • Jumlah seluruh hitungan wajib sama dengan panjang masukan. Pakai itu untuk memeriksa hasilnya.