算法找到最常出现的长度为3的字符串序列

时间:2012-08-15 16:48:35

标签: arrays algorithm data-structures

“给定多个名称数组,找到最常出现的长度为3的序列(长度为3的序列),如果它存在”

例如: 给出3个名字数组:

Ana John Maria
Paul
Sharon Ana John Maria Tiffany Ted

输出将为Ana John Maria,因为在第一个和第三个数组中遇到此序列两次。

我似乎无法为此找到正确的解决方案。

有人能指出我正确的方向吗?也许这是一个众所周知的algorihm。谁能给我一个链接? 感谢

2 个答案:

答案 0 :(得分:4)

将数组合并到类似于trie的树中,其中每个节点不是单个字母,而是整个名称。这应该可以让您更轻松地查找和计算子序列。事实上,我强烈怀疑这个任务有一个标准的算法可以查找。

更新:使用后缀树查看算法:http://en.wikipedia.org/wiki/Suffix_tree

答案 1 :(得分:2)

一种简单的方法是采用3的序列并将它们放在HashTable中。一旦遇到3的序列,就会增加相应的出现计数器。最后只返回最常见的出现/序列。通过扫描HashTable条目以及最大出现值来找到。 Java中的示例:

public class Sequence {  
     public List<String> sequenceOfThree(List<List<String>> names){
          Map<List<String>, Integer> map = new HashMap<List<String>, Integer>();  
          for(List<String> nameList:names){  
              int startIdx = 0;
              int endIdx = 3;
              while(endIdx <= nameList.size()){  
                   List<String> subsequence = nameList.subList(startIdx, endIdx);  
                   //add to map  
                   Integer count = map.get(subsequence);  
                   if(count == null){  
                         count = 0;  
                   }  
                   map.put(subsequence, count + 1);  
                   startIdx++;  
                   endIdx++;  
              }  
          }  
          Integer max = Integer.MIN_VALUE;  
          List<String> result = Collections.emptyList();  
          for(Entry<List<String>, Integer> entries:map.entrySet()){  
              if(entries.getValue() > max){  
                  max = entries.getValue();  
                  result = entries.getKey();  
          }
      }  
      return result;  
  }  
  /**  
   * @param args  
  */  
   public static void main(String[] args) {  
         List<List<String>> names = new ArrayList<List<String>>();  
         names.add(Arrays.asList(new String[]{"Ana", "John", "Maria"}));  
         names.add(Arrays.asList(new String[]{"Paul"}));  
         names.add(Arrays.asList(new String[]  
"Sharon", "Ana", "John", "Maria", "Tiffany" ,"Ted"}));  
        System.out.println(new Sequence().sequenceOfThree(names));  
   }  
}