Menu
CoddyTech

Trie (Pohon Prefiks)

Terakhir diperbarui

Trie (dibaca "try"), atau prefix tree (pohon prefiks), adalah struktur data yang menyimpan himpunan string berdasarkan karakternya: setiap edge diberi label sebuah karakter, dan jalur dari root membentuk sebuah prefiks. Kata-kata yang punya prefiks yang sama berbagi node yang sama, jadi "car", "card", dan "care" semuanya memakai ulang jalur c-a-r. Tekan Putar di atas untuk melihat kata-kata disisipkan satu karakter demi satu karakter, dan hanya bercabang di bagian yang berbeda.

Karena pencarian menelusuri satu node per karakter, mencari kata sepanjang m butuh waktu O(m), berapa pun jumlah kata yang disimpan trie. Itulah yang membuat trie ideal untuk autocomplete, pemeriksaan ejaan, dan pencarian prefiks.

Kompleksitas waktu dan ruang

OperasiKompleksitasCatatan
PenyisipanO(m)m = panjang kata
PencarianO(m)Satu langkah per karakter
Query prefiksO(m)Telusuri sampai node prefiks
RuangO(total chars)Prefiks yang sama disimpan sekali

Langkah demi langkah (penyisipan)

LangkahApa yang terjadi
1Mulai dari node root.
2Untuk setiap karakter dalam kata, cari edge anak yang cocok.
3Jika ada, ikuti edge itu (memakai ulang prefiks yang sama).
4Jika tidak ada, buat node anak baru untuk karakter itu.
5Setelah karakter terakhir, tandai node itu sebagai akhir kata.

Contoh penerapan

Menyisipkan ["car", "card", "care"] ke trie kosong:

LangkahStrukturAksi
Sisipkan carroot → c → a → r✓Belum ada anak yang cocok, jadi buat c, a, r dan tandai r sebagai akhir kata.
Sisipkan cardroot → c → a → r✓ → d✓Pakai ulang jalur c-a-r yang sudah ada, lalu buat satu anak baru d dan tandai sebagai akhir kata.
Sisipkan careroot → c → a → r✓ → {d✓, e✓}Pakai ulang c-a-r, buat cabang dari r dengan anak baru e, dan tandai e sebagai akhir kata.
Cari careroot → c → a → r → e✓Telusuri c, a, r, e; node terakhirnya ditandai sebagai akhir kata, jadi care ada.
Cari caroot → c → aJalurnya ada, tetapi a tidak ditandai sebagai akhir kata, jadi ca adalah prefiks, bukan kata yang disimpan.

Kapan memakai trie

Pakai saatHindari saat
Kamu butuh query prefiks atau autocomplete atas sekumpulan string.Kamu hanya butuh pencarian key utuh: hash table lebih cepat dan lebih ringan.
Banyak kata yang disimpan punya prefiks yang sama, sehingga node dipakai ulang.Key-nya panjang dan jarang tumpang tindih, sehingga membuang satu node per karakter.
Kamu ingin key dikembalikan dalam urutan terurut lewat penelusuran.Memori terbatas: pointer anak di setiap node menambah beban yang besar.
Biaya pencarian harus bergantung pada panjang key, bukan ukuran data.Alfabetnya sangat besar (misalnya seluruh Unicode) dan anak-anaknya disimpan secara padat.

Kode Trie (Prefix Tree)

Implementasi Trie (Prefix Tree) yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Trie (Prefix Tree) dalam Python

Python
1class TrieNode:2    def __init__(self):3        self.children = {}4        self.is_word = False5
6
7class Trie:8    def __init__(self):9        self.root = TrieNode()10
11    def insert(self, word):12        node = self.root13        for ch in word:14            node = node.children.setdefault(ch, TrieNode())15        node.is_word = True16
17    def search(self, word):18        node = self._walk(word)19        return node is not None and node.is_word20
21    def starts_with(self, prefix):22        return self._walk(prefix) is not None23
24    def _walk(self, s):25        node = self.root26        for ch in s:27            if ch not in node.children:28                return None29            node = node.children[ch]30        return node31
32
33trie = Trie()34for word in ["car", "card", "care", "dog"]:35    trie.insert(word)36
37print("search(card):     ", trie.search("card"))38print("search(ca):       ", trie.search("ca"))39print("starts_with(ca):  ", trie.starts_with("ca"))40print("starts_with(do):  ", trie.starts_with("do"))41print("starts_with(cat): ", trie.starts_with("cat"))
Jalankan kode ini di Playground Python

FAQ Trie

Untuk apa trie dipakai?

Trie menggerakkan fitur berbasis prefiks: autocomplete dan saran pencarian, pemeriksa ejaan, tabel routing IP, dan pencarian kamus. Di mana pun kamu butuh query cepat "adakah kata tersimpan yang diawali prefiks ini?", trie unggul.

Berapa kompleksitas waktu trie?
Penyisipan, pencarian, dan query prefiks semuanya berjalan dalam waktu O(m), dengan m adalah panjang kata atau prefiksnya, tidak bergantung pada berapa banyak kata yang disimpan. Pertukarannya ada di memori: trie bisa memakan banyak ruang, meskipun prefiks yang sama hanya disimpan sekali.
Apa perbedaan trie dan hash table?
Hash table menawarkan pencarian key utuh rata-rata O(1), tetapi tidak bisa menjawab query prefiks. Trie sedikit lebih lambat per pencarian, tetapi secara alami mendukung pencarian prefiks, penelusuran terurut, dan autocomplete, dan itulah alasan trie lebih dipilih untuk kebutuhan tersebut.
Kapan sebaiknya memakai trie, bukan binary search tree?
Pakai trie saat key-mu berupa string dan kamu butuh pencarian prefiks: trie berjalan dalam O(m) per operasi berdasarkan panjang key, sedangkan BST yang seimbang berbiaya O(m log n) karena setiap perbandingan memindai string dan ada log n perbandingan. BST adalah pilihan yang lebih baik saat key-nya tidak berbentuk string atau saat beban memori lebih penting daripada kecepatan prefiks.
Bagaimana cara menangani akhir kata dalam trie?
Setiap node membawa penanda akhir kata yang hanya diaktifkan saat sebuah kata utuh yang disisipkan berakhir di sana. Tanpa penanda itu, kamu tidak bisa membedakan kata yang disimpan dari sekadar prefiks. Contohnya, setelah menyisipkan card, node untuk car memang ada, tetapi hanya boleh dilaporkan sebagai kata jika car juga disisipkan.
Apakah trie selalu menghemat memori dengan berbagi prefiks?

Tidak selalu. Berbagi prefiks hanya membantu jika banyak key yang tumpang tindih; dengan key yang panjang dan berbeda-beda, trie bisa memakai jauh lebih banyak memori daripada hash set, karena setiap karakter menjadi node tersendiri dengan pointer anak. Jika ruang menjadi perhatian, compressed radix tree menggabungkan rantai node yang hanya punya satu anak untuk memangkas beban itu.

Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai