@@ -18,6 +18,13 @@ public class TranslationMapping
18
18
private List < int > translatedIndexs = new List < int > ( ) ;
19
19
private int translaedLength = 0 ;
20
20
21
+ public string key { get ; private set ; }
22
+
23
+ public void setKey ( string key )
24
+ {
25
+ this . key = key ;
26
+ }
27
+
21
28
public void AddNewIndex ( int originalIndex , int translatedIndex , int length )
22
29
{
23
30
if ( constructed )
@@ -29,28 +36,64 @@ public void AddNewIndex(int originalIndex, int translatedIndex, int length)
29
36
translaedLength += length - 1 ;
30
37
}
31
38
32
- public int ? MapToOriginalIndex ( int translatedIndex )
39
+ public int MapToOriginalIndex ( int translatedIndex )
33
40
{
34
41
if ( translatedIndex > translatedIndexs . Last ( ) )
35
42
return translatedIndex - translaedLength - 1 ;
36
-
37
- for ( var i = 0 ; i < originalIndexs . Count ; i ++ )
43
+
44
+ int lowerBound = 0 ;
45
+ int upperBound = originalIndexs . Count - 1 ;
46
+
47
+ int count = 0 ;
48
+
49
+
50
+ // Corner case handle
51
+ if ( translatedIndex < translatedIndexs [ 0 ] )
52
+ return translatedIndex ;
53
+ if ( translatedIndex > translatedIndexs . Last ( ) )
54
+ {
55
+ int indexDef = 0 ;
56
+ for ( int k = 0 ; k < originalIndexs . Count ; k ++ )
57
+ {
58
+ indexDef += translatedIndexs [ k * 2 + 1 ] - translatedIndexs [ k * 2 ] ;
59
+ }
60
+
61
+ return translatedIndex - indexDef - 1 ;
62
+ }
63
+
64
+ // Binary Search with Range
65
+ for ( int i = originalIndexs . Count / 2 ; ; count ++ )
38
66
{
39
- if ( translatedIndex >= translatedIndexs [ i * 2 ] && translatedIndex < translatedIndexs [ i * 2 + 1 ] )
40
- return originalIndexs [ i ] ;
41
67
if ( translatedIndex < translatedIndexs [ i * 2 ] )
42
68
{
43
- int indexDiff = 0 ;
44
- for ( int j = 0 ; j < i ; j ++ )
69
+ // move to lower middle
70
+ upperBound = i ;
71
+ i = ( i + lowerBound ) / 2 ;
72
+ }
73
+ else if ( translatedIndex > translatedIndexs [ i * 2 + 1 ] - 1 )
74
+ {
75
+ lowerBound = i ;
76
+ // move to upper middle
77
+ // due to floor of integer division, move one up on corner case
78
+ i = ( i + upperBound + 1 ) / 2 ;
79
+ }
80
+ else
81
+ return originalIndexs [ i ] ;
82
+
83
+ if ( upperBound - lowerBound <= 1 &&
84
+ translatedIndex > translatedIndexs [ lowerBound * 2 + 1 ] &&
85
+ translatedIndex < translatedIndexs [ upperBound * 2 ] )
86
+ {
87
+ int indexDef = 0 ;
88
+
89
+ for ( int j = 0 ; j < upperBound ; j ++ )
45
90
{
46
- indexDiff += translatedIndexs [ i * 2 + 1 ] - translatedIndexs [ i * 2 ] - 1 ;
91
+ indexDef += translatedIndexs [ j * 2 + 1 ] - translatedIndexs [ j * 2 ] ;
47
92
}
48
93
49
- return translatedIndex - indexDiff ;
94
+ return translatedIndex - indexDef - 1 ;
50
95
}
51
96
}
52
-
53
- return translatedIndex ;
54
97
}
55
98
56
99
public void endConstruct ( )
@@ -117,7 +160,10 @@ public void Initialize([NotNull] Settings settings)
117
160
118
161
map . endConstruct ( ) ;
119
162
120
- return _pinyinCache [ content ] = ( resultBuilder . ToString ( ) , map ) ;
163
+ var key = resultBuilder . ToString ( ) ;
164
+ map . setKey ( key ) ;
165
+
166
+ return _pinyinCache [ content ] = ( key , map ) ;
121
167
}
122
168
else
123
169
{
0 commit comments