Skip to content

Commit 31ceff5

Browse files
committed
trie
example trie via hash maps
1 parent ca6b3ca commit 31ceff5

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

algorithms/Trie.scala

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
class TrieNode {
2+
var cnt: Int = 0
3+
var abc: Map[Char, TrieNode] = Map()
4+
5+
def dump(lvl: Int = 0, prev: String = ""): Unit = {
6+
for(n <- abc) {
7+
(0 until lvl).foreach(x=>print("."))
8+
println(n._1, n._2.cnt, prev + n._1)
9+
n._2.dump(lvl + 1, prev + n._1)
10+
}
11+
}
12+
}
13+
14+
//префиксное дерево
15+
//поиск частоты с которой встречается слово в тексте
16+
class Trie {
17+
val root: TrieNode = new TrieNode()
18+
19+
//вставить строку в дерево
20+
def insert(str: String): Unit = {
21+
var cur_node = root
22+
for(c <- str) {
23+
if(!cur_node.abc.contains(c)) {
24+
cur_node.abc = cur_node.abc ++ Map(c -> new TrieNode())
25+
}
26+
27+
cur_node = cur_node.abc(c)
28+
cur_node.cnt += 1
29+
30+
}
31+
} //insert
32+
33+
//вывести дерево
34+
def dump()= root.dump()
35+
36+
//поиск строки в дереве: найденная строка, число повторов в тексте
37+
def find(str: String): (String, Int) = {
38+
var cur_node = root
39+
var prev = ""
40+
for(c <- str) {
41+
prev += c
42+
if(!cur_node.abc.contains(c)) {
43+
return (prev, cur_node.cnt)
44+
} else {
45+
cur_node = cur_node.abc(c)
46+
}
47+
48+
}
49+
return (prev, cur_node.cnt)
50+
}
51+
52+
//более длинные варианты слова
53+
def getVars(str: String): String = {
54+
var cur_node = root
55+
var prev = ""
56+
for(c <- str) {
57+
prev += c
58+
if(!cur_node.abc.contains(c)) {
59+
return Array(prev).mkString(", ")
60+
} else {
61+
cur_node = cur_node.abc(c)
62+
}
63+
64+
}
65+
cur_node.abc.map(c=> prev + c._1 ).toArray.mkString(", ")
66+
}
67+
68+
69+
70+
}
71+
72+
object ExampleTrie extends App {
73+
val lines = scala.io.Source.fromFile("C:/Users/007/Google Диск/info/articles/test.txt").mkString
74+
val tokens = lines.mkString.split(" ").filter(x=>x.size > 0).map(_.toLowerCase)
75+
76+
var tr = new Trie()
77+
tokens.foreach(t => tr.insert(t))
78+
79+
/*
80+
* (в,8,в)
81+
.(а,2,ва)
82+
..(р,1,вар)
83+
* */
84+
tr.dump()
85+
86+
//латы, лати
87+
println(tr.getVars("лат"))
88+
89+
//(лат,2)
90+
println(tr.find("лат"))
91+
}

0 commit comments

Comments
 (0)