【问题标题】:social network of word using Levenshtien Distance使用 Levenshtein 距离的词社交网络
【发布时间】:2012-05-25 11:25:56
【问题描述】:

这个问题来自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。

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

【问题讨论】:

  • 您在哪一部分遇到了问题?

标签: algorithm


【解决方案1】:

一个简单的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)(检查所有对)。
  • BFS 也是 O(n^2),因为 |E| < n^2,所以你得到了 O(n^2) 算法的总数。

【讨论】:

  • 起始节点必须是 hello 还是可以是图中的其他任何东西
  • @RegisteredUser:来源可以是您想要的任何东西 - 结果将是该特定单词的社交网络。
  • 在这种情况下,标记整个输入序列的朋友将是一项艰巨的工作,因为我将创建的矩阵或列表我将如何定义朋友......你的 BFS 逻辑是好的毫无疑问我最初无法理解,但当我开始实现它时,我意识到我将如何制作边缘.....
  • @RegisteredUser:我不确定我是否在关注。通过检查所有可能的对 word1word2 并检查它们之间的距离来创建边缘。这些对中有O(n^2)。图本身可以通过矩阵存储——稀疏:adjacency list或密集(二维数组)
【解决方案2】:

如果您知道如何找到 Levenshtein 距离,那么您只需要知道这对单词之间的 Levenstein 距离。

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

假设这些词是: 对 明亮的 赖特

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

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

【讨论】:

  • 这种方法比使用图有什么好处?它不是更快,在内存中也不是更好。
  • 渐近 O(n^2)。但是正如我所解释的,您避免了很多多余的编辑距离计算。关键是您不需要计算整个图表。图中已知元素之间的边没有用。
  • 您使用的 hashset 可能会占用大量内存(对于 big n 这不起作用)。
  • 存储一个完整的图也会占用很大的内存。在这里,您不需要使图表只需在向 hashset 添加内容时使用计数器来递增。
  • 存储图最多需要 O(n^2),但是在 hashset 中保存 n^2 项可能会占用非常大的空间(取决于散列方案)。
【解决方案3】:

您可以使用 BFS 或 DFS 或任何返回图树覆盖的算法,这很符合您的口味。

【讨论】:

  • 我觉得阿米特的回答就够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2012-01-13
  • 2010-11-11
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多