1
+
2
+
3
+ using System ;
4
+ using System . Collections ;
5
+ using System . Collections . Generic ;
6
+ using Algorithms . DataStructures . Queue ;
7
+ using Algorithms . Utils ;
8
+
9
+ namespace Algorithms . DataStructures . SearchTries
10
+ {
11
+ public class RWayTries < T > : ISearchTries < T >
12
+ {
13
+ private const int R = 256 ;
14
+ private int N = 0 ;
15
+
16
+ private class Node
17
+ {
18
+ internal T value ;
19
+ internal Node [ ] children = new Node [ R ] ;
20
+ }
21
+
22
+ private Node root ;
23
+
24
+ public T this [ string key ]
25
+ {
26
+ get
27
+ {
28
+ var x = Get ( root , key , 0 ) ;
29
+ if ( x != null )
30
+ {
31
+ return x . value ;
32
+ }
33
+ return default ( T ) ;
34
+ }
35
+ set
36
+ {
37
+ root = Put ( root , key , value , 0 ) ;
38
+
39
+ }
40
+ }
41
+
42
+ private Node Put ( Node x , string key , T value , int d )
43
+ {
44
+ if ( x == null )
45
+ {
46
+ x = new Node ( ) ;
47
+ }
48
+
49
+ if ( key . Length == d )
50
+ {
51
+ if ( ObjectUtil . IsNullOrDefault ( x . value ) )
52
+ {
53
+ N ++ ;
54
+ }
55
+
56
+ x . value = value ;
57
+ return x ;
58
+ }
59
+
60
+ char v = key [ d ] ;
61
+ x . children [ v ] = Put ( x . children [ v ] , key , value , d + 1 ) ;
62
+ return x ;
63
+ }
64
+
65
+ public void Delete ( String key )
66
+ {
67
+ Node x = Get ( root , key , 0 ) ;
68
+ if ( x != null )
69
+ {
70
+ N -- ;
71
+ x . value = default ( T ) ;
72
+ }
73
+ }
74
+
75
+ public bool ContainsKey ( String key )
76
+ {
77
+ Node x = Get ( root , key , 0 ) ;
78
+ if ( x == null ) return false ;
79
+ return ! ObjectUtil . IsNullOrDefault ( x . value ) ;
80
+ }
81
+
82
+ public IEnumerable < string > Keys {
83
+ get
84
+ {
85
+ var queue = new QueueLinkedList < string > ( ) ;
86
+
87
+ Collect ( root , "" , queue ) ;
88
+
89
+ return queue ;
90
+ }
91
+ }
92
+
93
+ public IEnumerable < string > KeysWithPrefix ( string prefix )
94
+ {
95
+
96
+ Node x = Get ( root , prefix , 0 ) ;
97
+ QueueLinkedList < String > queue = new QueueLinkedList < string > ( ) ;
98
+ if ( x != null )
99
+ {
100
+ Collect ( x , prefix , queue ) ;
101
+ }
102
+ return queue ;
103
+ }
104
+
105
+ private void Collect ( Node x , String prefix , IQueue < string > queue )
106
+ {
107
+ if ( x == null ) return ;
108
+ if ( ! ObjectUtil . IsNullOrDefault ( x . value ) )
109
+ {
110
+ queue . Enqueue ( prefix ) ;
111
+ }
112
+ for ( int r = 0 ; r < R ; ++ r )
113
+ {
114
+ Collect ( x . children [ r ] , prefix + ( ( char ) r ) , queue ) ;
115
+ }
116
+ }
117
+
118
+ private Node Get ( Node x , string key , int d )
119
+ {
120
+ if ( x == null ) return null ;
121
+ if ( key . Length == d ) return x ;
122
+ char v = key [ d ] ;
123
+ return Get ( x . children [ v ] , key , d + 1 ) ;
124
+ }
125
+
126
+ public int Count => N ;
127
+ public bool IsEmpty => N == 0 ;
128
+
129
+
130
+ }
131
+ }
0 commit comments