2015-10-06 6 views
-3

Я изучаю некоторую реализацию дерева суффикса, и вот одна эталонная реализация, и вопрос в том, как «индексы» (см. Строку 19) используются для класса SuffixTreeNode? Я не уверен, что «индексы» полезны, и я думаю, вероятно, нам просто нужно сохранить значение всех узлов и их детей? Не найти слишком много значений «индексов» для класса SuffixTreeNode.проблема с реализацией дерева суффиксов

Пожалуйста, не стесняйтесь поправить меня. Любые идеи оцениваются.

public class SuffixTree { 
    SuffixTreeNode root = new SuffixTreeNode(); 
    public SuffixTree(String s) { 
     for (int i = 0; i < s.length(); i++) { 
      String suffix = s.substring(i); 
      root.insertString(suffix, i); 
     } 
    } 

    public ArrayList<Integer> getIndexes(String s) { 
     return root.getIndexes(s); 
    } 
} 

public class SuffixTreeNode { 
    HashMap<Character, SuffixTreeNode> children = new 
    HashMap<Character, SuffixTreeNode>(); 
    char value; 
    ArrayList<Integer> indexes = new ArrayList<Integer>(); 
    public SuffixTreeNode() { } 

    public void insertString(String s, int index) { 
     indexes.add(index); 
     if (s != null && s.length() > 0) { 
      value = s.charAt(0); 
      SuffixTreeNode child = null; 
      if (children.containsKey(value)) { 
       child = children.get(value); 
      } else { 
       child = new SuffixTreeNode(); 
       children.put(value, child); 
      } 
      String remainder = s.substring(1); 
      child.insertString(remainder, index); 
     } 
    } 

    public ArrayList<Integer> getIndexes(String s) { 
     if (s == null || s.length() == 0) { 
      return indexes; 
     } else { 
      char first = s.charAt(0); 
      if (children.containsKey(first)) { 
       String remainder = s.substring(1); 
       return children.get(first).getIndexes(remainder); 
      } 
     } 
     return null; 
    } 
} 

public class Question { 
    public static void main(String[] args) { 
     String testString = “mississippi”; 
     String[] stringList = {“is”, “sip”, “hi”, “sis”}; 
     SuffixTree tree = new SuffixTree(testString); 
     for (String s : stringList) { 
      ArrayList<Integer> list = tree.getIndexes(s); 
      if (list != null) { 
       System.out.println(s + “: “ + list.toString()); 
      } 
     } 
    } 
} 
+0

Я запустил ваш код, он работает как разработанный. Если у вас есть ошибка, допустим, вы уменьшите строку, вы получите исключение stackoverflow, потому что вы никогда не ударили бы по вашему рекурсивному базовому футляру и не застряли в цикле forever –

ответ

2

indexes, безусловно, необходим для реализации вы смотрите из дерева суффиксов (есть несколько версий дерева суффиксов некоторые более эффективен, чем другие). Переменная indexes играет неотъемлемую роль в возвращении индексов, где подстрока (is, sip, hi, sis) существует в исходной строке (mississippi) обратно вызывающему методу. getIndexes возвращает indexes в своем базовом примере, как вы получаете список вхождений каждой подстроки. см. ниже выход

is: [1, 4] 
sip: [6] 
sis: [3] 
+0

Спасибо Marquis, что вы имеете в виду в базовом случае? –

+0

Привет, Marquis, задаваясь вопросом, есть ли ошибка, которую я опубликовал, для строки 34, «child.insertString (остаток, индекс)», индекс должен быть индексом + 1? Благодарю. –

+1

@ Lin Ma базовый регистр используется в рекурсивном методе. Это условие, которое говорит рекурсивному вызову прекратить вызов себя и вернуть резервную копию стека. Базовый блок - это строка 39 в вашем коде. Нет, индекс ошибок не увеличивается в цикле for на строках 4-6. –