forked from kokizzu/goadsl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Trie.go
180 lines (166 loc) · 4.81 KB
/
Trie.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
//Trie implementation in go
package main
import "fmt"
type node struct {
data int
value interface{}
link [26]*node
}
type Trie struct {
Root *node
}
//fungsi inisialisasi, berguna untuk menginisiali sasi bahwa trie yang baru dibuat, rootnya hrs 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=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 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 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
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) (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 {
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
}
*/
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
}
//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()
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!
}