Skip to content

Commit 6485bde

Browse files
author
tianqing.liang
committed
Trie
1 parent df29ecd commit 6485bde

File tree

9 files changed

+29887
-9
lines changed

9 files changed

+29887
-9
lines changed

16-Segment-Tree/Main.dart

+4-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ class NewMerger<E> implements Merger{
1111

1212
void main(){
1313
List nums = [-2, 0, 3, -5, 2, -1];
14-
Merger<num> selfMerger = NewMerger() as Merger<num>;
15-
SegmentTree<num> segTree = SegmentTree(nums, selfMerger);
14+
// NewMerger<num> selfMerger = NewMerger<num>();
15+
// SegmentTree segTree = SegmentTree(nums, selfMerger);
16+
SegmentTree segmentTreeSec = SegmentTree(nums, new NewMerger());
17+
print(segmentTreeSec.toString());
1618
}
1719

1820

16-Segment-Tree/Merger.dart

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
abstract class Merger<E>{
2-
32
E merge(E a, E b);
4-
53
}
64

16-Segment-Tree/Segment.dart

+63-5
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,76 @@ class SegmentTree<E> {
6060
return 2 * index + 2;
6161
}
6262

63+
query(int queryL, int queryR) {
64+
if (queryL < 0 ||
65+
queryL >= _data!.length ||
66+
queryR < 0 ||
67+
queryR >= _data!.length ||
68+
queryL > queryR) {
69+
throw new Exception("Index is illegal.");
70+
}
71+
return _queryDetail(0, 0, _data!.length - 1, queryL, queryR);
72+
}
73+
74+
_queryDetail(int treeIndex, int l, int r, int queryL, int queryR) {
75+
if (l == queryL && r == queryR) {
76+
return _tree![treeIndex];
77+
}
78+
int mid = l + ((r - l) / 2).toInt();
79+
// treeIndex的节点分为[l...mid]和[mid+1...r]两部分
80+
81+
int leftTreeIndex = _leftChild(treeIndex);
82+
int rightTreeIndex = _rightChild(treeIndex);
83+
if (queryL >= mid + 1) {
84+
return _queryDetail(rightTreeIndex, mid + 1, r, queryL, queryR);
85+
} else if (queryR <= mid) {
86+
return _queryDetail(leftTreeIndex, l, mid, queryL, queryR);
87+
}
88+
E leftResult = _queryDetail(leftTreeIndex, l, mid, queryL, mid);
89+
E rightResult = _queryDetail(rightTreeIndex, mid + 1, r, mid + 1, queryR);
90+
return _merger!.merge(leftResult, rightResult);
91+
}
92+
93+
//将index位置的值,更新为e
94+
set(int index, E e){
95+
if(index < 0 || index >= _data!.length) {
96+
throw new Exception("Index is illegal");
97+
}
98+
_data![index] = e;
99+
_setDetail(0, 0, _data!.length - 1, index, e);
100+
}
101+
102+
// 在以treeIndex为根的线段树中更新index的值为e
103+
_setDetail(int treeIndex, int l, int r, int index, E e){
104+
if(l == r){
105+
_tree![treeIndex] = e;
106+
return;
107+
}
108+
int mid = l + ((r - l) / 2).toInt();
109+
// treeIndex的节点分为[l...mid]和[mid+1...r]两部分
110+
int leftTreeIndex = _leftChild(treeIndex);
111+
int rightTreeIndex = _rightChild(treeIndex);
112+
if(index >= mid + 1) {
113+
_setDetail(rightTreeIndex, mid + 1, r, index, e);
114+
}else { // index <= mid
115+
_setDetail(leftTreeIndex, l, mid, index, e);
116+
}
117+
_tree![treeIndex] = _merger!.merge(_tree![leftTreeIndex], _tree![rightTreeIndex]);
118+
}
119+
63120
@override
64121
String toString() {
65122
StringBuffer res = new StringBuffer();
66123
res.write('[');
67-
for(int i = 0 ; i < _tree!.length ; i ++){
68-
if(_tree![i] != null)
124+
for (int i = 0; i < _tree!.length; i++) {
125+
if (_tree![i] != null) {
69126
res.write(_tree![i]);
70-
else
127+
} else {
71128
res.write("null");
72-
73-
if(i != _tree!.length - 1)
129+
}
130+
if (i != _tree!.length - 1) {
74131
res.write(", ");
132+
}
75133
}
76134
res.write(']');
77135
return res.toString();

17-Trie/FileOperator.dart

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'dart:io';
2+
import 'dart:convert';
3+
4+
/**
5+
* 文件操作类
6+
*/
7+
class FileOperator{
8+
9+
static Future<List> getFileString(String filename) async{
10+
Stream<List<int>> content = File(filename).openRead();
11+
List<String> lines = await content.transform(utf8.decoder).transform(LineSplitter()).toList();
12+
var words = [];
13+
for(int i = 0;i<lines.length;i++){
14+
words.addAll(lines[i].split(" ").toList());
15+
}
16+
words.removeWhere((element) => element == "");
17+
return words;
18+
}
19+
}

17-Trie/Main.dart

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'dart:io';
2+
import 'dart:convert';
3+
4+
import 'Trie.dart';
5+
import 'FileOperator.dart';
6+
void main() async{
7+
8+
List result = await FileOperator.getFileString('text2.txt');
9+
// print(result);
10+
print("总数量:${result.length}");
11+
var now = new DateTime.now();
12+
num startTime = now.millisecondsSinceEpoch;
13+
14+
Trie trie = new Trie();
15+
for(String word in result)
16+
trie.add(word);
17+
18+
for(String word in result)
19+
trie.contains(word);
20+
21+
var endNow = new DateTime.now();
22+
num endTime = endNow.millisecondsSinceEpoch;
23+
print("开始时间:$startTime : 结束时间:$endTime");
24+
double time = (endTime - startTime) / 1000.0;
25+
26+
print("Total different words: ${trie.getSize()}");
27+
print("Trie: $time s");
28+
29+
}

17-Trie/Trie.dart

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import 'dart:collection';
2+
3+
class Trie {
4+
_Node? _root;
5+
6+
int? _size;
7+
8+
Trie() {
9+
_root = _Node();
10+
_size = 0;
11+
}
12+
13+
int? getSize() {
14+
return _size;
15+
}
16+
17+
add(String? word) {
18+
_Node? cur = _root;
19+
for (int i = 0; i < word!.length; i++) {
20+
String c = word[i];
21+
if (cur!.next![c] == null) {
22+
cur.next!.putIfAbsent(c, () => _Node());
23+
}
24+
cur = cur.next![c];
25+
}
26+
if (!(cur!.isWord!)) {
27+
cur.isWord = true;
28+
_size = _size! + 1;
29+
}
30+
}
31+
32+
// 查询单词word是否在Trie中
33+
bool contains(String word) {
34+
_Node? cur = _root;
35+
for (int i = 0; i < word.length; i++) {
36+
String c = word[i];
37+
if (cur!.next![c] == null) {
38+
return false;
39+
}
40+
cur = cur.next![c];
41+
}
42+
return cur!.isWord!;
43+
}
44+
45+
// 查询是否在Trie中有单词以prefix为前缀
46+
bool isPrefix(String prefix){
47+
_Node? cur = _root;
48+
for(int i = 0 ; i < prefix!.length ; i ++){
49+
String c = prefix[i];
50+
if(cur!.next![c] == null){
51+
return false;
52+
}
53+
cur = cur.next![c];
54+
}
55+
return true;
56+
}
57+
}
58+
59+
class _Node {
60+
bool? isWord;
61+
62+
SplayTreeMap<String, _Node>? next;
63+
64+
_Node.isWord(bool isWord) {
65+
this.isWord = isWord;
66+
next = new SplayTreeMap();
67+
}
68+
69+
factory _Node() {
70+
return _Node.isWord(false);
71+
}
72+
}

0 commit comments

Comments
 (0)