Java 这个词链的时间复杂性
我已经编写了一个更大的程序,我正在从数据文件中的单词构造一个图Java 这个词链的时间复杂性,java,algorithm,graph,Java,Algorithm,Graph,我已经编写了一个更大的程序,我正在从数据文件中的单词构造一个图图(V,E)。然后,我正在解析另一个文件,其中的单词在同一行:“other there”简单的答案是: 直接的方法是使用算法。该算法计算无负圈有向图中所有顶点对之间的最短路径。因为您使用的是具有正权重的无向图,所以用有向对(u,v)、(v,u)替换每个无向边(u,v)就足够了 Floyd-Warshall的运行时间是O(V^3),它会计算出你一次能找到的所有答案,只要你能在合理的时间内找到它们。(这应该很容易,因为你已经有了V^3的呼
图(V,E)
。然后,我正在解析另一个文件,其中的单词在同一行:“other there”
简单的答案是:
直接的方法是使用算法。该算法计算无负圈有向图中所有顶点对之间的最短路径。因为您使用的是具有正权重的无向图,所以用有向对(u,v)、(v,u)替换每个无向边(u,v)就足够了
Floyd-Warshall的运行时间是O(V^3),它会计算出你一次能找到的所有答案,只要你能在合理的时间内找到它们。(这应该很容易,因为你已经有了V^3的呼吸室)
越来越快:
在您的情况下,这很可能不是最佳的(更不用说,我不知道您将提出多少查询-如果只有少数,那么FW肯定是一个过度的)。由于您的图没有任何负边,而且从您的空间复杂性来看,边计数似乎只有C*| V |,因此我们可以更进一步。输入Djikstra算法的复杂性是O(E+Vlog(V))
考虑到您很可能只有~C*V边,这将使重复的Djikstra的计算成本达到F*O(V*log(V))。 更快: 如果你想尝试一下煎炸你的大脑,Djikstra可以在一些特殊情况下通过使用的黑暗魔法(为了算法的目的进行了修改,使事情更加混乱)来改进。据我所见,您的案例可能非常特殊,因此可以实现来自的O(N*sqrt(log(N))。
他们的假设是:
- n顶点
- m边
- 以n的多项式函数为界的最长弧(如果我的google fu是正确的,则为边的长度)
除非你有很多很多词,否则你的邻居数还是相当大的:5!*准确地说,在最坏的情况下是26。(四个字母是固定的,一个是任意的-可能的排列*字母计数)。在重复的情况下可以更低,尽管它在技术上可以被视为一个常数,但仍然不是很小。在我看来,您只是在问现有解决方案的计算复杂性,用3个变量V、E和F表示 如果我没有看错你的问题,那就是
O(V + E) // loading
+ O(V^2) done F times // F test cases
这简化为:
O(V + E + (F * V^2))
此假设您对加载和搜索时间的Big-O描述是正确的。如果没有看到您的解决方案的完整Java源代码,我们无法确认1这些描述是正确的。(英文或伪代码描述太不精确。)
请注意,上面的公式是“规范的”。除非消除变量,否则不能进一步简化;e、 g.将其视为常数或对其设置边界
但是,如果我们可以假设F>0
,我们可以将其减少为:
O(E + (F * V^2))
因为当F>0
时,F*V^2
项将支配V
项,因为F
或V
趋于无穷大。(直观地说,F==0
案例对应于只加载图形而不运行测试案例。在这种情况下,您会期望性能特征有所不同。)
E
变量可能近似为V
的函数。(从一个节点到另一个节点的每条边表示一个单词的排列,其中一个字母发生了变化。如果对英语中的单词进行了一些统计分析,就有可能确定每个节点的平均边数作为节点数的函数。)如果我们能证明这(假设)average_E(V)
函数是O(V^2)
或更好(看起来很可能!),那么我们可以从整体复杂性类中删除E
项
(当然,根据您试图解决的问题的描述,假设输入图形不包含重复或不正确的边。)
最后,似乎O(V^2)
实际上是最坏情况性能的度量,这取决于图的稀疏性。所以你需要在你的答案中考虑这个因素。。。以及您尝试验证复杂性的方式
1-O(V^2)对我来说似乎有点可疑。时间:O(F*(V+E)) 空格:O(V+E) 照你说的做
- V:顶点
- E:边缘
- F:路径查询
每个查询都是一个没有任何修改的BFS,所以时间复杂度是O(f*(v+e)),空间复杂度与一个BFS相同,因为你使用相同的结构O(V),但是我们必须考虑用来存储图O(E)的空间。
在图形构造中,您迭代所有对单词,并为每个单词添加一条边。您的图形始终具有$E=V^2$。如果您像社区中通常的情况一样询问改进算法的建议,我会告诉您避免添加不应该使用的边(那些差异超过1个字符的边)。您的标题是“运行时间”,但实际上您似乎在询问时间复杂度。运行时间是另一回事。@khelwood,我已经有了时间复杂性和空间复杂性。但是,我试图找出整个程序的:O(…)表达式。我在这里写的时间复杂性和空间复杂性是正确的
O(V + E) // loading
+ O(V^2) done F times // F test cases
O(V + E + (F * V^2))
O(E + (F * V^2))