算法正确性
A. 衡量算法正确性的标准通常是
在设备的设计制造中,因为种种原因,不可能完全达到设计所要达到的理想状态。比如设计时的计算、设备零件加工送的行为误差、设备组装中的操作、以及设备在运行中的磨损等等,所以,一台设备最终完成,其所达到的状态于设计时所想达到的状态之间是有一定的差异的。这种不同越少,做达到的精度就会越高,而要使这种差异缩小就要求在各个环节中的误差减少,相应的,误差越小,两种状态的差异就越小,精度就会越高。这是基于这之间的关系,通常就会用误差作为衡量精度的标准。
B. 算法的评价指标包括正确性、可读性、________、时间复杂性、空间复杂性等。
A
C. 请教prim算法正确性的证明
为了减少不必要的麻烦,可以不妨设图中所有边的权重都不同,这样最小生成树是唯一的
然后直接用反证法就行了
如果Prim算法得到G,而最小生成树是T
设在生成G的过程中第一次产生的不在T中的边是e,而在G中去掉e得到的两个连通分支记为V1和V2,那么e连接了V1和V2
把e加入T之后会出现环,在这个环里面V1的顶点和V2的顶点至少还被另一条边f连接(否则T本身就不连通了),由Prim算法的贪心策略可知e比f权重低,那么在T里面把f换成e可得一个总权重更小的生成树,与T的最小性矛盾
(因为最小生成树的总权重的边的权重的连续函数,对于有权重重复出现的情况可以利用连续性取极限,这样即使最小生成树不唯一仍然可以保证Prim算法生成的树具有最小权重)
D. 算法的正确性如何检验
我这学期也正在学数据结构,学的那个晕那,写的只是代码而已,也就是说是编程的思路。如果你要证明,那就得用具体的程序带入吧。我师傅说,数据结构是编程的重心,最重要了。所以好好学吧。
E. 求Kruskal算法正确性证明b
证明:令G为任何一个与Kruskal算法产生的树F不同的树。考虑构造F的过程。令e为第一次选的一条不属于G的边。如果我们将e加入G,我们会得到一个圈C。这个圈不完全包含在F里面,因此在C中有一条不属于F的边f。如果我们将e加入G并删除f,我们就得到了一个新的树H。
我们想要证明H不比G贵。这意味着e不比f贵。用反证法。假设f比e便宜。
现在考虑这样一个问题:为什么Kruskal算法选择了f而不是e呢?唯一的原因只可能是f被排除了,即f与加入e之前被选入F的边会形成一个圈。但是所有这些已经被选的边都是G的边,因为e为第一次选的一条不属于G的边。又f本身属于G,所以G就包含了一个圈,这是不可能的(G是树)。这个矛盾证明了H不比G贵。
因此我们可以用H来代替G,而且H比G更接近F(即H与F有更多相同的边)。如果H不是F,重复以上步骤,我们得到一系列与H越来越接近的不比G贵的树。这个过程迟早会以F终结,这就证明了F不比G贵。
Kruskal算法的正确性也就得证。
F. 算法的评价指标包括正确性、可读性、()、时间复杂性、空间复杂性等
健壮性
算法的评价指标包括正确性、可读性、健壮性、时间复杂性、空间复杂性等
G. 算法的评价指标有哪些
时间复杂度和空间复杂度。
1、时间复杂度
算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做。
T(n)=Ο(f(n))
因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。
2、空间复杂度
算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
空间复杂度记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。
(7)算法正确性扩展阅读:
算法的方法:
1、递推法
递推是序列计算机中的一种常用算法。它是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定项的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。
2、递归法
程序调用自身的编程技巧称为递归(recursion)。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
注意:
(1) 递归就是在过程或函数里调用自身.
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
H. 求问正确性也是衡量算法的标准吗
清华大学版的《数据结构》教材上是这么说的,你可以有保留意见,毕竟这不能算严格的科学问题,但是考试时是另外一回事。
我是这么理解的,并非所有的问题都能找到精确的算法,比如
有一些数值计算方面的问题,不同的算法效率和精度可能会有
差异,当要求精度很高时,可能效率高的算法就会出现问题,
正确性不能保证;另外,有很多算法,它可能会有自身的适
应范围和条件,如有一些排序算法,可能会要求不能有重复元素,
当有重复元素时,可能会出错,因此该算法在某些场合是正确
的,而在另外的场合可能不正确,这也许就是所谓的正确性吧。
I. 验证lamport's algorithm算法的正确性,即该算法是否能保证
算法(Algorithm)是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中,算法要用计算机算法语言描述,算法代表用计算机解一类问题的精确、有效的方法。算法+数据结构=程序,求解一个给定的可计算或可解的问题,不同的人可以编写出不同的程序,来解决同一个问题,这里存在两个问题:一是与计算方法密切相关的算法问题;二是程序设计的技术问题。算法和程序之间存在密切的关系。
J. 怎样哈夫曼算法的正确性
代码如下:
void haffmantree(int weight[],int n,struct haffnode hafftree[],char data[])
/*建立叶结点个数为n,权值数组为weight[]的哈夫曼树*/
{int i,j,m1,m2,x1,x2;<br/>/*哈夫曼树hafftree[]初始化,n个叶结点共有2n-1个结点*/<br/>for(i=0;i<2*n-1;i++)<br/>{if(i<n) {hafftree[i].data=data[i];<br/>hafftree[i].weight=weight[i]; /*叶结点*/<br/>}
else {hafftree[i].weight=0; /*非叶结点*/<br/>hafftree[i].data='\0';<br/>}
hafftree[i].parent=0; /*初始化没有双亲结点*/
hafftree[i].flag=0;
hafftree[i].leftchild=-1;
hafftree[i].rightchild=-1;
}
for(i=0;i<n-1;i++) /*构造哈夫曼树n-1个非叶结点*/
{m1=m2=MAXVALUE;<br/>x1=x2=0;<br/>for(j=0;j<n+i;j++)<br/>{if(hafftree[j].weight<m1&&hafftree[j].flag==0)<br/>{m2=m1;<br/>x2=x1;<br/>m1=hafftree[j].weight;<br/>x1=j;<br/>}
else if(hafftree[j].weight<m2&&hafftree[j].flag==0)
{m2=hafftree[j].weight;<br/>x2=j;<br/>}
}
hafftree[x1].parent=n+i;
hafftree[x2].parent=n+i;
hafftree[x1].flag=1;
hafftree[x2].flag=1;
hafftree[n+i].weight=hafftree[x1].weight+hafftree[x2].weight;
hafftree[n+i].leftchild=x1;
hafftree[n+i].rightchild=x2;
}
}
void haffmancode(struct haffnode hafftree[],int n,struct haffcode haffcode[])
{/*由n个结点的哈夫曼树hafftree[]构成的哈夫曼编码haffcode[]*/
int i,j,child,parent;
struct haffcode newcode;
struct haffcode *cd;
cd=&newcode;
for(i=0;i<n;i++) /*求n个结点的哈夫曼编码*/
{cd->start=MAXBIT-1; /*不等长编码的最后一位是n-1*/<br/>cd->weight=hafftree[i].weight;<br/>cd->data=hafftree[i].data; /*取得编码对应值的字符*/<br/>child=i;<br/>parent=hafftree[child].parent;<br/>while(parent!=0)<br/>{if(hafftree[parent].leftchild==child)<br/>cd->bit[cd->start]=0; /*左孩子编码为0*/<br/>else<br/>cd->bit[cd->start]=1; /*右孩子编码为1*/<br/>cd->start--;<br/>child=parent;<br/>parent=hafftree[child].parent;<br/>}
for(j=cd->start+1;j<MAXBIT;j++) /*保存每个叶结点的编码和等长编码的起始位*/
haffcode[i].bit[j]=cd->bit[j];
haffcode[i].data=cd->data;
haffcode[i].start=cd->start;
haffcode[i].weight=cd->weight;
}
}