大家好我想比较2种算法,并认为我可以尝试为他们写一个证明! (我的数学很糟糕,因此问题)
通常在去年的数学课上我们会遇到像
这样的问题证明:(2r + 3)= n(n + 4)
然后我会做所需的4个阶段并在最后得到答案我被困在哪里证明prims和Kruskals - 我怎样才能将这些算法变成上面的数学形式所以我可以继续证明
注意:我不是要求别人为我回答 - 只是帮我把它放到一个我可以自己去的地方
感谢
答案 0 :(得分:17)
为了证明算法的正确性,您通常必须显示(a)它终止,以及(b)其输出满足您要执行的操作的规范。这两个证明与你在问题中提到的代数证明有很大的不同。您需要的关键概念是mathematical induction。 (这是recursion证明。)
我们以quicksort为例。
为了证明quicksort总是终止,你首先会显示它终止于长度为1的输入。(这很简单。)然后显示如果它终止输入长度为 n ,然后它将终止输入长度 n + 1 。感谢归纳,这足以证明算法终止所有输入。
要证明quicksort是正确的,您必须将比较排序规范转换为精确的数学语言。我们希望输出为输入的permutation,如果 i ≤ j 那么 a i ≤ a j 。证明快速排序的输出是输入的排列很容易,因为它从输入开始,只是交换元素。证明第二个属性有点棘手,但你可以再次使用归纳法。
答案 1 :(得分:2)
你没有提供很多细节,但是有一个数学家社区(数学知识管理MKM)开发了支持数学计算机证明的工具。例如,见:
和最新的会议
答案 2 :(得分:1)
我被困在哪里证明prims和Kruskals - 我怎样才能将这些算法变成上面的数学形式所以我可以继续证明
我认为你不能直接。相反,证明两者都生成一个MST,然后证明任何两个MST是相等的(或等效,因为你可以为一些图形有多个MST)。如果两种算法都生成显示为等效的MST,则算法是等效的。
答案 3 :(得分:0)
从我在Uni I的数学课上(模糊地)记得证明Prims和Kruskals算法 - 并且你不会通过用数学形式写它来攻击它。相反,你采用经验证的图形理论并将它们结合起来,例如http://en.wikipedia.org/wiki/Prim%27s_algorithm#Proof_of_correctness建立证据。
如果你想要证明复杂性,那么只需通过算法的工作就可以得到O(n ^ 2)。对于图形稀疏的特殊情况有一些优化,可以将其减少到O(nlogn)。
答案 4 :(得分:0)
大多数情况下,证据取决于您手中的问题。 简单的论证有时候就足够了,在其他时候你可能需要严格的证明。我曾经使用过已证明定理的推论和证明来证明我的算法是正确的。但这是一个大学项目。
答案 5 :(得分:0)
也许您想尝试一种半自动校样方法。只是为了寻找不同的东西;)例如,如果你有一个Prim's和Kruskal算法的Java规范,最佳地建立在相同的图模型上,你可以使用KeY Prover来证明算法的等价性。
关键部分是在Dynamic Logic中形式化您的证明义务(这是一阶逻辑的扩展,具有Java程序的符号执行的类型和方法)。要证明的公式可以匹配以下(粗略)模式:
\forall Graph g. \exists Tree t.
(<{KRUSKAL_CODE_HERE}>resultVar1=t) <-> (<{PRIM_CODE_HERE}>resultVar2=t)
这表示对于所有图形,两种算法都终止,结果是同一棵树。
如果你很幸运,你的公式(和算法实现)是正确的,那么KeY可以自动为你证明。如果没有,您可能需要实例化一些量化变量,这使得有必要检查先前的证明树。
在用KeY证明了这一点之后,你可以对学习某些东西感到高兴,或者尝试从KeY证明重建手动证明 - 这可能是一项繁琐的工作,因为KeY知道很多特定于Java的规则。不容易理解。但是,也许你可以做一些事情,例如从Key用于在证明中的序列的右侧实例化存在量词的术语中提取Herbrand析取。
好吧,我认为KeY是一个有趣的工具,更多的人应该习惯使用这样的工具来证明关键的Java代码;)