Algorithm 使用Levenshtien距离的单词社交网络

Algorithm 使用Levenshtien距离的单词社交网络,algorithm,Algorithm,这是一个来自中国的问题 如果两个单词的Levenshtein距离为1,那么它们就是朋友。有关详细信息,请参阅。也就是说,您可以添加、删除或替换word X中的一个字母来创建word Y。word的社交网络包括其所有朋友,加上其所有朋友,以及其所有朋友的朋友,依此类推。写一个程序来告诉我们“你好”这个词的社交网络有多大,使用这个单词列表 输入 您的程序应该接受文件名的路径作为其第一个参数。输入文件包含单词列表。此列表也可在 输出 打印出“你好”这个词的社交网络有多大。e、 “abcde”一词的社交

这是一个来自中国的问题

如果两个单词的Levenshtein距离为1,那么它们就是朋友。有关详细信息,请参阅。也就是说,您可以添加、删除或替换word X中的一个字母来创建word Y。word的社交网络包括其所有朋友,加上其所有朋友,以及其所有朋友的朋友,依此类推。写一个程序来告诉我们“你好”这个词的社交网络有多大,使用这个单词列表 输入

您的程序应该接受文件名的路径作为其第一个参数。输入文件包含单词列表。此列表也可在 输出

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

有谁能帮我想出一些同样的逻辑吗。 这不是家庭作业问题。

一个简单的^2解决方案是将问题建模为: G=V,E,其中V={all words}和E={u,V|u是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)
复杂性:

正在^2上创建此图表,请检查所有对。 也在^2上,因为| E |您可以使用BFS或DFS或任何返回图的树覆盖的算法,这非常符合您的口味。

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

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

假设这些词是: 正当 光线充足的 赖特

所有对的编辑距离均为1。但是如果你只想要权利的社交网络,你不需要考虑这对聪明和莱特。
以这种方式继续检查所有选中的单词,直到在您的选中列表中没有添加任何内容。

您遇到了哪些问题?与使用graph相比,这种方法有什么好处?它不是更快,也不是更好的内存。它是渐进的^2。但正如我所解释的,您可以避免大量冗余的编辑距离计算。关键是你不需要计算整个图形。图中已知元素之间的边没有用处。您使用的哈希集可能会占用大n的大量内存。这不起作用。存储完整的图也会占用大量内存。在这里,您不需要使图形在向哈希集添加内容时只使用计数器递增。存储图形最多需要^2,但是在散列集中保存n^2项可能需要很大的空间,这取决于散列场景。我认为amit的答案已经足够了。起始节点必须是hello还是可以是graph@RegisteredUser:来源可以是您想要的任何内容-结果将是该特定单词的社交网络。在本例中,标记的是整个输入序列将是一项艰巨的工作,因为我将创建的矩阵或列表我将如何定义朋友…您的BFS逻辑很好毫无疑问,我最初无法理解,但当我开始实施时,我意识到我将如何制作边缘…@RegisteredUser:我不确定我是否遵循了。创建边是通过检查所有可能的对word1、word2-并检查它们之间的距离来完成的。这些对中有^2对。图形本身可以通过矩阵稀疏或密集二维数组存储