制作字典图表的有效方法

时间:2010-12-17 08:52:05

标签: c++ algorithm dictionary graph distance

使用汉明距离= 1来制作字典中单词图表的最有效方法是什么?

2 个答案:

答案 0 :(得分:5)

汉明距离仅定义为相等长度的单词,因此您实际上字典中每个单词长度都有一个不相交的图形。如果您想要levenshtein距离,这允许插入和删除,那么您确实会有一个图表。

一种选择是从词典中构造BK-tree。虽然严格来说不是图表,但它允许您提出相同的问题(获取具有给定距离的元素列表),并且需要花费O(n log n)时间来构建。

另一个选择是暴力:对于每个单词,测试它与所有候选单词的距离。你可以将候选词缩小到相同长度(或者levenshtein的长度减去或者更长)。这是O(n ^ 2)最坏情况,但如果您不是多次构建图形,这可能是可以接受的。

理论上,可能有一种构造图形的O(n log n)方法 - 在平凡的情况下,构造一个BK树,然后从中生成图形为O(mn log n),其中m是平均值每个节点的边数 - 但我不知道优雅的边缘。

答案 1 :(得分:0)

我建议使用邻接图map<string, list<string>来表示图表。它将图形节点(在我们的例子中是一个单词)映射到相邻节点的列表(即距离内的所有单词== 1)。

如何填充此地图?首先,将字典分解为相同长度set<string> wordset[MAX_WORD_LENGTH]的单词集,并按如下方式填充地图。

map<string, list<string>> adjacency_map
for each wordset in wordset array  
  for each w1 in wordset
     for each w2 in wordset
        if one_char_off(w1, w2) { // if the distance between w1 and w2 == 1
           update(adjacency_map, w1, w2)
           update(adjacency_map, w2, w1)
        }

函数one_char_off(string w1, string w2)检查w1和w2之间的距离是否为1。

int diff = 0
for i in [0, w1.length) // both w1 and w2 have the same length
   if w1[i] != w2[i]
      if ++diff > 1
         return false
return diff == 1

功能update(map<string, list<string>> adjacency_map, string w1, string w2)将相邻的单词w1w2添加到相邻的地图中。