Skip to content

Commit

Permalink
trie judika
Browse files Browse the repository at this point in the history
  • Loading branch information
judika03 committed Dec 12, 2014
1 parent 7e7068a commit 5f0dca1
Show file tree
Hide file tree
Showing 2 changed files with 310 additions and 186 deletions.
248 changes: 155 additions & 93 deletions Trie.go
Original file line number Diff line number Diff line change
@@ -1,118 +1,180 @@
//Trie Implementation in golang by Judika
//Judika Gultom
//HCI A
//Trie implementation in go

package main

import "fmt"
import "fmt"


type node struct {
data int
link[26]*node
data int
value interface{}
link [26]*node
}

type Trie struct {
Root *node
Root *node
}

//fungsi inisialisasi, berguna untuk menginisiali sasi bahwa trie yang baru dibuat, rootnya hrs nil
//bigO=0
func (T *Trie) Initialize(){
T.Root=nil
//bigO=1
func (T *Trie) Initialize() {
T.Root = nil
}

//fungsi create_node() atau membuat node baru, berguna untuk membuat node baru dengan fungsi return node yang ditujukan untuk penggunaan node baru (untuk elemen etc)
//bigO=0
func Create_node() *node{
//membuat element berisi node baru
q:=new(node)
//membuat inisialisasi data di node tersebut -1
q.data = -1
return q
//bigO=1
func Create_node() *node {
//membuat element berisi node baru
q := new(node)
//membuat inisialisasi data di node tersebut -1
q.data = -1
q.value = nil
return q
}
//fungsi insert node dengan parameter input string

//fungsi insert node dengan parameter input string
// fungsi ini akan tetap traversing, (q = q.link [index] bukan q = q.link) sampai kita dapatkan q.link [index] == nil (bukan q.link yang == nil)
// Ketika kita mendapatkan nil, maka bukannya menambahkan hanya 1 node dan membuat node sebelumnya menunjuk ke situ, kita buat node baru yang banyak
// sebanyak nilai (panjang - level) pada waktu itu.
//BigO=n(length si key)
func (T *Trie) Insert_node(key string) {
//membuat elemen baru sebagai panjang input (key)
length := len(key)
var index int
level:=0
//pengecekan jika root masih nil/null, maka root diisi dengan node baru
if T.Root == nil {
T.Root = Create_node()
}
q:=new(node)
q=T.Root //untuk insert dari setiap huruf string, kita harus memulainya dari root

for ; level < length ; level++ {
// Pada setiap level, menemukan indeks yang sesuai
         // Karakter (a-z = 0-26)
index = int(key[level] - 'a')
if index<26 {
if q.link[index] == nil {
// Taruh nilai karakter ini kedalam q.link[index]
             // Dan membuat 1 node lagi, dan node ini akan menjadi petunjuk
// disaat p :=new(node) maka q.link[index]=p
q.link[index] = Create_node()
}

q = q.link[index];
// Ketika kita mendapatkan nil, maka bukannya menambahkan hanya 1 node dan membuat titik simpul sebelumnya untuk itu, kita buat node baru yang banyak
// Sebagai nilai (panjang - level) pada waktu itu.
//BigO=n(length si key)
func (T *Trie) Insert_node(key string, value interface{}) {
//membuat elemen baru sebagai panjang input (key)
length := len(key)
var index int
level := 0
//pengecekan jika root masih nil/null, maka root diisi dengan node baru
if T.Root == nil {
T.Root = Create_node()
}
q := new(node)
q = T.Root //untuk insert dari setiap huruf string, kita harus memulainya dari root
for ; level < length; level++ {
// Pada setiap level, menemukan indeks yang sesuai

index = int(key[level] - 'a')
if index < 26 {
if q.link[index] == nil {
// Taruh nilai karakter ini kedalam q.link[index]
// disaat p :=new(node) maka q.link[index]=p
q.link[index] = Create_node()
}

q = q.link[index]
}
}
//Sekarang, karakter terakhir (node) dari string akan berisi nilai dari key ini
q.data = level
}

//Sekarang, karakter terakhir (node) dari string akan berisi nilai dari key ini
q.data = level
q.value = value
}
//fungsi search yang berguna untuk mencari dengan input parameter string
//BigO=n (length nya si key)
func (T *Trie) Search(key string) {
//membuat variable ketemu sebagai boolean, berguna untuk tanda jika kata yang di cari ketemu, jika ketemu maka ketemu = true, dan mengeprint kata yang ketemu
var ketemu bool
//inisialisasi ketemu = false untuk mempermudah pertandaan pertemuan saat pencarian berlangsung
ketemu=false
q:=new(node)
q=T.Root
length :=len(key)
level:=0
for ;level < length;level++ {
index := key[level] - 'a';
if index<26 {
if q.link[index] != nil {
q = q.link[index]


//fungsi search yang berguna untuk mencari dengan input parameter string
//BigO=n (length nya si key)
func (T *Trie) Search(key string) (interface{}, bool) {
//membuat variable ketemu sebagai boolean, berguna untuk tanda jika kata yang di cari ketemu, jika ketemu maka ketemu = true, dan mengeprint kata yang ketemu
var ketemu bool
ketemu = true
q := new(node)
q = T.Root
length := len(key)
level := 0
for ; level < length; level++ {
index := key[level] - 'a'
if index < 26 {
if q.link[index] != nil {
q = q.link[index]
} else {
break
}
ketemu = false
break
}
}
//setelah loop pencarian selesai, sekarang melihat kondisi
//jika data element baru (q) tidak samadengan -1, maka tandanya kata yang kamu cari itu ketemu!
//lalu boolean ketemu akan menjadi true
if q.data != -1 {
ketemu=true
}
}
/*
//setelah loop pencarian selesai, sekarang melihat kondisi
//jika data element baru (q) tidak samadengan -1, maka tandanya kata yang kamu cari itu ketemu!
//lalu boolean ketemu akan menjadi true
if q.data != -1 {
ketemu = true
}
*/
if q.value == nil {
ketemu = false
}
//jika ketemu true, maka print found beserta key yang di cari
if ketemu == true {
fmt.Println("Found! = ", key)
return q.value, ketemu
} else { //elsenya (jika ketemu false maka mengeprint No match found
fmt.Println("No Match Found!")
}
return q.value, ketemu
}
//jika ketemu true, maka print found beserta key yang di cari
if ketemu==true {
fmt.Println("Found! = ", key)

} else { //elsenya (jika ketemu false maka mengeprint No match found
fmt.Println("No Match Found!")
//fungsi erase,berfungsi untuk menghapus key dan value yang ada ditrie dengan kondisi tertentu(ditentukan oleh parameter input dari user
//BigO=n(length si key)
func (T *Trie) Erase(key string) {
var ketemu bool
ketemu = true
q := new(node)
q = T.Root
length := len(key)
level := 0
for ; level < length; level++ {
index := key[level] - 'a'
if index < 26 {
if q.link[index] != nil {
q = q.link[index]
} else {
ketemu = false
break
}
}

}
if ketemu == true {
q.value = nil
}
}

type coba struct {
masuk interface{}
}


func main() {
trie:=new(Trie)
trie.Initialize()
//mencoba memasukan string kedalam trie
trie.Insert_node("halo")
trie.Insert_node("nama")
trie.Search("halo")
trie.Search("panda")

trie := new(Trie)
trie.Initialize()
baru := coba{666}
//mencoba memasukan string kedalam trie dengan value integer
trie.Insert_node("halo", 1)
//mencoba memasukan string kedalam trie dengan value string
trie.Insert_node("nama", "biar")
//mencoba memasukan string kedalam trie dengan value struct
trie.Insert_node("chikuso", baru)
//mencoba mencari key yang tidak ada di trie
valuenya, nemu := trie.Search("sialan")
fmt.Println(nemu)
fmt.Println(valuenya)
//mencoba mencari key yang ada di trie
valuenya, nemu = trie.Search("halo")
fmt.Println(nemu)
fmt.Println(valuenya)
valuenya, nemu = trie.Search("nama")
fmt.Println(nemu)
fmt.Println(valuenya)
valuenya, nemu = trie.Search("chikuso")
fmt.Println(nemu)
fmt.Println(valuenya)
//mencoba menghapus key yang ada di trie
trie.Erase("halo")
//lalu kita coba mencari halo, apakah masih ada di trie atau tidak
valuenya, nemu = trie.Search("halo")
fmt.Println(nemu)
fmt.Println(valuenya)
//kita coba menghapus key yang tidak ada di trie
trie.Erase("cobaajalah")
//kita coba erase yang lain
trie.Erase("chikuso")
//kita lihat lagi apakah chikuso masih ada?!
valuenya, nemu = trie.Search("chikuso")
fmt.Println(nemu)
fmt.Println(valuenya)
//ternyata sudah tidak ada lagi pemirsa!
}
Loading

0 comments on commit 5f0dca1

Please sign in to comment.