Beispiel #1
0
EDGE_REF SquishedDawg::edge_char_of(NODE_REF node,
                                    UNICHAR_ID unichar_id,
                                    bool word_end) const {
  EDGE_REF edge = node;
  if (node == 0) {  // binary search
    EDGE_REF start = 0;
    EDGE_REF end = num_forward_edges_in_node0 - 1;
    int compare;
    while (start <= end) {
      edge = (start + end) >> 1;  // (start + end) / 2
      compare = given_greater_than_edge_rec(NO_EDGE, word_end,
                                            unichar_id, edges_[edge]);
      if (compare == 0) {  // given == vec[k]
        return edge;
      } else if (compare == 1) {  // given > vec[k]
        start = edge + 1;
      } else {  // given < vec[k]
        end = edge - 1;
      }
    }
  } else {  // linear search
Beispiel #2
0
 bool Trie::edge_char_of(NODE_REF node_ref, NODE_REF next_node,
                         int direction, bool word_end, UNICHAR_ID unichar_id,
                         EDGE_RECORD **edge_ptr, EDGE_INDEX *edge_index) const {
     if (debug_level_ == 3) {
         tprintf("edge_char_of() given node_ref "
         REFFORMAT
         " next_node "
         REFFORMAT
         " direction %d word_end %d unichar_id %d, exploring node:\n",
                 node_ref, next_node, direction, word_end, unichar_id);
         if (node_ref != NO_EDGE) {
             print_node(node_ref, nodes_[node_ref]->forward_edges.size());
         }
     }
     if (node_ref == NO_EDGE) return false;
     assert(node_ref < nodes_.size());
     EDGE_VECTOR &vec = (direction == FORWARD_EDGE) ?
                        nodes_[node_ref]->forward_edges : nodes_[node_ref]->backward_edges;
     int vec_size = vec.size();
     if (node_ref == 0 && direction == FORWARD_EDGE) {  // binary search
         EDGE_INDEX start = 0;
         EDGE_INDEX end = vec_size - 1;
         EDGE_INDEX k;
         int compare;
         while (start <= end) {
             k = (start + end) >> 1;  // (start + end) / 2
             compare = given_greater_than_edge_rec(next_node, word_end,
                                                   unichar_id, vec[k]);
             if (compare == 0) {  // given == vec[k]
                 *edge_ptr = &(vec[k]);
                 *edge_index = k;
                 return true;
             } else if (compare == 1) {  // given > vec[k]
                 start = k + 1;
             } else {  // given < vec[k]
                 end = k - 1;
             }
         }
     } else {  // linear search