예제 #1
0
 public UTree(byte[] store, int count)
 {
     _store       = store;
     _root        = new UNode();
     _activePoint = new ActivePoint(_root, 0, 0);
     ConstructFromInitialStoreValues(count);
 }
예제 #2
0
 private void ActiveEdgeWithSymbol()
 {
     _activePoint = _activePoint.MoveOneSymbol();
     if (_activePoint.PointsToTheEndOfActiveEdge())
     {
         _activePoint = _activePoint.MoveToNextNodeOfActiveEdge();
     }
 }
예제 #3
0
 private void ActiveNodeHasEdgeForSymbol(byte symbol, UNode uNode)
 {
     _activePoint.SetSuffixLinkToActiveNodeAndReturnActiveNode(uNode);
     _activePoint = _activePoint.MoveToEdgeStartingWith(symbol);
     if (_activePoint.PointsToTheEndOfActiveEdge())
     {
         _activePoint = _activePoint.MoveToNextNodeOfActiveEdge();
     }
 }
예제 #4
0
 private ActivePoint WalkDownTree(int index)
 {
     while (!_activePoint.PointsToActiveNode() && (_activePoint.PointsAfterTheEndOfActiveEdge() || _activePoint.PointsToTheEndOfActiveEdge()))
     {
         _activePoint = _activePoint.PointsAfterTheEndOfActiveEdge()
             ? _activePoint.MoveToNextNodeOfActiveEdge(_store, index)
             : _activePoint.MoveToNextNodeOfActiveEdge();
     }
     return(_activePoint);
 }
예제 #5
0
        private UNode InternalWithoutEdgeForSymbol(int index, byte symbol, UNode uNode)
        {
            _activePoint.AddEdgeToActiveNode(symbol, new UEdge(index, _store.Length, null));
            UNode activeUNode = _activePoint.SetSuffixLinkToActiveNodeAndReturnActiveNode(uNode);

            _activePoint = _activePoint.HasASuffixLink()
                ? _activePoint.MoveToSuffixLink()
                : _activePoint.MoveTo(_root);
            return(activeUNode);
        }
예제 #6
0
        private UNode EdgeFromRootWithoutSymbol(int index, byte symbol, UNode oldUNode)
        {
            UNode newUNode = new UNode();

            _activePoint.SplitActiveEdge(_store, newUNode, index, symbol);
            _activePoint.SetSuffixLinkTo(oldUNode, newUNode);
            _activePoint = _activePoint.MoveToEdgeStartingWithAndByActiveLengthLessOne(_root, _store[index - _remainder + 2]);
            _activePoint = WalkDownTree(index);
            return(newUNode);
        }
예제 #7
0
        private UNode EdgeFromInternalWithoutSymbol(int index, byte symbol, UNode oldUNode)
        {
            UNode newUNode = new UNode();

            _activePoint.SplitActiveEdge(_store, newUNode, index, symbol);
            _activePoint.SetSuffixLinkTo(oldUNode, newUNode);
            _activePoint = _activePoint.HasASuffixLink()
                ? _activePoint.MoveToSuffixLink()
                : _activePoint.MoveTo(_root);
            _activePoint = WalkDownTree(index);
            return(newUNode);
        }
예제 #8
0
 private void RootHasNoEdgeForSymbol(int index, byte symbol)
 {
     _activePoint.AddEdgeToActiveNode(symbol, new UEdge(index, _store.Length, null));
     _activePoint = _activePoint.MoveTo(_root);
 }