public IEnumerable <string> Search(string key) { var keyIndex = KeyTrie.Get(key); if (keyIndex != -1) { var valueStartPos = MappingBitVector.Select(keyIndex, false); var valueEndPos = MappingBitVector.NextClearBit(valueStartPos + 1); var size = valueEndPos - valueStartPos - 1; if (size > 0) { var offset = MappingBitVector.Rank(valueStartPos, false); for (var i = 0; i < size; i++) { yield return(ValueTrie.GetKey((int)Mapping[valueStartPos - offset + i])); } } } }
public int Traverse(int index, char c) { var firstChild = FirstChild(index); if (firstChild == -1) { return(-1); } var childStartBit = BitVector.Select(firstChild, true); var childEndBit = BitVector.NextClearBit(childStartBit); var childSize = childEndBit - childStartBit; var result = Array.BinarySearch(Edges, firstChild, childSize, c); return(result >= 0 ? result : -1); }