‘壹’ 算法的评价指标包括正确性、可读性、()、时间复杂性、空间复杂性等
健壮性
算法的评价指标包括正确性、可读性、健壮性、时间复杂性、空间复杂性等
‘贰’ 算法的正确性如何检验
我这学期也正在学数据结构,学的那个晕那,写的只是代码而已,也就是说是编程的思路。如果你要证明,那就得用具体的程序带入吧。我师傅说,数据结构是编程的重心,最重要了。所以好好学吧。
‘叁’ 如何证明这种欧几里得算法的正确性
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a
mod b)
证明:a可以表示成a = kb +
r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a,
d|b,而r = a - kb,因此d|r
因此d是(b,a
mod b)的公约数
假设d 是(b,a
mod b)的公约数,则
d | b ,d
|r ,但是a = kb +r
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod
b)的公约数是一样的,其最大公约数也必然相等,得证
欧几里德算法就是根据这个原理来做的,其算法用C++语言描述为:
int
Gcd(int a,int b)
{
if(b ==
0)
return a;
return
Gcd(b,a % b);
}
当然你也可以写成迭代形式:
int
Gcd(int a,int b)
{
while(b !=
0)
{
int r = b;
b = a % b;
a =
r;
}
return
a;
}
本质上都是用的上面那个原理.
补充:
扩展欧几里德算法是用来在已知a,
b求解一组x,y使得a*x+b*y=Gcd(a,b)(解一定存在,根据数论中的相关定理).扩展欧几里德常用在求解模线性方程及方程组中.下面是一个使
用C++的实现:
int
exGcd(int a,int b,int &x,int
&y)
{
if(b ==
0)
{
x = 1;
y = 0;
return a;
}
int r =
exGcd(b,a % b,x,y);
int t =
x;
x =
y;
y = t - a
/ b * y;
return
r;
}
把这个实现和Gcd的递归实现相比,发现多了下面的x,y赋值过程,这就是扩展欧几里德算法的精髓.
可以这样思考:
对于a' = b,
b' = a % b 而言,我们求得 x,y使得 a'x + b'y = Gcd(a',b')
由于b' = a
% b = a - a / b * b (注:这里的/是程序设计语言中的除法)
那么可以得到:
a'x + b'y
= Gcd(a',b') ===>
bx + (a - a / b * b)y = Gcd(a',b') = Gcd(a,b)
===>
ay +b(x - a / b*y) = Gcd(a,b)
因此对于a和b而言,他们的相对应的p,q分别是
y和(x-a/b*y).
在网上看了很多关于不定方程方程求解的问题,可都没有说全,都只说了一部分,看了好多之后才真正弄清楚不定方程的求解全过程,步骤如下:
求a * x
+ b * y = n的整数解.
1、先计算Gcd(a,b),若n不能被Gcd(a,b)整除,则方程无整数解;否则,在方程两边同时除以Gcd(a,b),得到新的不定方程a'
* x + b' * y = n',此时Gcd(a',b')=1;
2、利用上面所说的欧几里德算法求出方程a' * x + b' * y = 1的一组整数解x0,y0,则n' * x0,n' *
y0是方程a' * x + b' * y = n'的一组整数解;
3、根据数论中的相关定理,可得方程a'
* x + b' * y = n'的所有整数解为:
x = n' * x0 + b' * t
y = n' * y0 - a' * t
(t为整数)
上面的解也就是a * x + b * y = n 的全部整数解.
步骤如下:
扩展欧几里德算法-求解不定方程,线性同余方程:
解不定方程ax + by = n的步骤如下:
(1)计算gcd(a,b).若gcd(a,b)不能整除n,则方程无整数解;否则,在方程的两边同除以gcd(a,b),
得到新的不定方程a'x + b'y = n',此时gcd(a',b') = 1
(2)求出不定方程a'x + b'y = 1的一组整数解x0,y0,则n'x0,n'y0是方程a'x + b'y = n'的一组整数解.
(3)根据&@^%W#&定理,可得方程a'x + b'y = n'的所有整数解为:
x = n'x0 + b't
y = n'y0 - a't
(t为整数)
这也就是方程ax + by = n的所有整数解
利用扩展的欧几里德算法,计算gcd(a,b)和满足d = gcd(a,b) = ax0 + by0的x0和y0,
也就是求出了满足a'x0 + b'y0 = 1的一组整数解.因此可得:
x = n/d * x0 + b/d * t
y = n/d * y0 - a/d * t
(t是整数)
program oujilide;
var i,j,a,b,c,d,x,y:longint;
function gcd(a,b:longint):longint;
var i:longint;
begin
if a=0 then exit(b);
if b=0 then exit(a);
gcd:=gcd(b,a mod b);
end;
procere extend_gcd(a,b:longint;var x,y:longint);
var i,j:longint;
begin
if b=0 then
begin
x:=1;
y:=0;
exit
end;
extend_gcd(b,a mod b,x,y);
i:=x;
x:=y;
y:=i-(a div b)*x;
end;
begin
assign(input,'oujilide.in');
reset(input);
assign(output,'oujilide.out');
rewrite(output);
read(a,b,c);
d:=gcd(a,b);
if c mod d=0 then begin a:=a div d; b:=b div d; c:=c div d; end
else begin writeln('No answer!'); exit; end;
extend_gcd(a,b,x,y);
x:=c*x;
y:=c*y;
writeln(x,' ',y);
end.
‘肆’ 在算法正确性的基础上,算法设计的首要目的是
最小化算法复杂度,分为空间复杂度和时间复杂度。简单说就是在算法能够得到正确结果的前提下,算法运行占用的存储越少越好,算法执行时间越小越好。
‘伍’ 求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算法的正确性也就得证。
‘陆’ 验证lamport's algorithm算法的正确性,即该算法是否能保证
算法(Algorithm)是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中,算法要用计算机算法语言描述,算法代表用计算机解一类问题的精确、有效的方法。算法+数据结构=程序,求解一个给定的可计算或可解的问题,不同的人可以编写出不同的程序,来解决同一个问题,这里存在两个问题:一是与计算方法密切相关的算法问题;二是程序设计的技术问题。算法和程序之间存在密切的关系。
‘柒’ 衡量算法正确性的标准通常是
在设备的设计制造中,因为种种原因,不可能完全达到设计所要达到的理想状态。比如设计时的计算、设备零件加工送的行为误差、设备组装中的操作、以及设备在运行中的磨损等等,所以,一台设备最终完成,其所达到的状态于设计时所想达到的状态之间是有一定的差异的。这种不同越少,做达到的精度就会越高,而要使这种差异缩小就要求在各个环节中的误差减少,相应的,误差越小,两种状态的差异就越小,精度就会越高。这是基于这之间的关系,通常就会用误差作为衡量精度的标准。
‘捌’ 请教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算法生成的树具有最小权重)
‘玖’ 求问正确性也是衡量算法的标准吗
清华大学版的《数据结构》教材上是这么说的,你可以有保留意见,毕竟这不能算严格的科学问题,但是考试时是另外一回事。
我是这么理解的,并非所有的问题都能找到精确的算法,比如
有一些数值计算方面的问题,不同的算法效率和精度可能会有
差异,当要求精度很高时,可能效率高的算法就会出现问题,
正确性不能保证;另外,有很多算法,它可能会有自身的适
应范围和条件,如有一些排序算法,可能会要求不能有重复元素,
当有重复元素时,可能会出错,因此该算法在某些场合是正确
的,而在另外的场合可能不正确,这也许就是所谓的正确性吧。