使用Levenshtein距离的社交网络

时间:2012-05-25 11:25:56

标签: algorithm

这是一个来自here

的问题

如果Levenshtein距离为1,则两个单词是朋友(有关详细信息,请参阅http://en.wikipedia.org/wiki/Levenshtein_distance)。也就是说,你可以在单词X中添加,删除或替换一个字母来创建单词Y.单词的社交网络由其所有朋友,他们所有朋友以及他们所有朋友的朋友组成,依此类推。编写一个程序告诉我们“你好”这个词的社交网络有多大,使用这个单词列表https://raw.github.com/codeeval/Levenshtein-Distance-Challenge/master/input_levenshtein_distance.txt 输入

您的程序应该接受第一个参数作为文件名的路径。输入文件包含单词列表。此列表也可在https://raw.github.com/codeeval/Levenshtein-Distance-Challenge/master/input_levenshtein_distance.txt处获得 输出

打印出“你好”这个词的社交网络有多大。例如“abcde”这个词的社交网络是4846。

任何人都可以帮助提出相同的逻辑。 这不是家庭工作的问题。

3 个答案:

答案 0 :(得分:5)

一个简单的O(n^2)解决方案是将问题建模为graph
G = (V,E),其中V = { all words }E = { (u,v) | u is friend of v }

由此,下一个算法遵循(高级伪代码):

1. Create the graph from the data
2. Run a BFS from the source, and continue while there are more 
   vertices that can be discovered. 
3. When you are done, the size of the `visited` set is the size of 
   the social network (this set is the actual social network)

<强>复杂度:

  • 创建此图表为O(n^2)(检查所有对)。
  • BFSO(n^2)起也是|E| < n^2,因此您获得了O(n^2)算法的总数。

答案 1 :(得分:2)

您可以使用BFS或DFS或任何返回图形树覆盖的算法,它可以根据您的喜好进行调整。

答案 2 :(得分:2)

如果你知道如何找到Levenshtein距离,你需要知道的是这对词之间的Levenstein距离。

您无需绘制完整的图表。更好的方法是维护一个你知道在单词社交网络中的单词哈希表。这样就可以避免冗余对。这就是我的意思。

假设单词是: 对 亮 赖特

所有对的编辑距离均为1。但如果你只想要Right的社交网络,你不需要考虑Bright和Wright这对。

以这种方式继续检查所有单词,直到您的选中列表中没有添加内容。