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是正确的,则为边的长度)
这就是我尝试快速深入到最短路径问题的原因。如果你想做更多的研究,我建议你对这个问题进行全面的研究。还有许多其他算法在复杂性上类似。您的理想方法还取决于您的F

附笔。:
除非你有很多很多词,否则你的邻居数还是相当大的: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:路径查询
它是O(V+E)时间和O(V)空间

每个查询都是一个没有任何修改的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))