看书有点看上瘾了,先把这本书看完再上网课吧。
不过今天白天摆了一天,到晚上才想起来看书,想想就亏。还有关于AI的训练,我经过多方查证和尝试之后,发现确实是硬件问题,我这台电脑连卷积都没办法完成。
匪常滴无奈啊
========================================================================
关于昨天我好奇的那些很厉害的递归函数的使用,今天我在书中见到了一点点它的踪影。
分治:先把问题大致分成两个相等的子问题,递归地对它们求解,接着将两个子问题的解合在一起并再做些少量的附加工作,最后得到整个问题的解。
分治算法的运行时间一般为NlogN,一般来说:如果一个算法用常数时间将问题的大小削减为其的一部分(通常为1/2),那么该算法就是O(NlogN),另一方面,如果使用常数时间只是把问题减少一个常数,那么这种算法就是O(N)的。
二分查找:实例:给定一个整数X和等差为X(X>0)的等差数列A,后者已经预先排序并在内存中,求使得A[i]=X的i,如果X不在数据中,则返回i。相比于从右到左扫描A,可以验证X是否为居中元素,如果X小于居中元素,则扫描A的左边,如果X大于居中元素,则扫描A的右边。
实例2:计算X的N次方
long int
Pow( long int x, unsigned in N )
{
if( N == 0 )
return 1;
if( N == 1 )
return x;//上面四行都是在处理基准情况(应该是四行吧)
if(IsEven(N))//如果N为偶数
return Pow( x * x, N / 2 );//利用递归函数,简单的X的N次自乘变成XN=XN/2*XN/2。
else//如果N为奇数
return Pow( x * x, N / 2 ) * x;
}
上述两个例子的一般想法都是从按次数慢慢计算,在上述算法表明,当我们面对这次按次数慢慢的运行的情况时,不妨可以想想能不能用二分的思想来解决问题。
以及在昨天中,我从书中学到了优化算法的方法之一是祛除冗余,在书上对欧几里得算法的解释中,我学到了第二个方法:通过事物的必然性来优化算法。
下面是代码(该算法连续计算余数到余数为0为止,最后的非零余数就是最大公因数。)
unsigned int
Gcd( unsigned int M, unsigned int N )
{
unsigned int Rem;
while( N > 0 )
{
Rem = M % N; //取得M%N的余数
M = N; //将上一次的余数赋值给M
N = Rem; //将余数的值赋值给N,当N<=0时,结束循环(实际上N不存在小于0的情况,因为余数不可能小于0)
}
return M;
}
这个算法忽略了余数的值按照常数因子递减的必然性,在两次迭代以后,余数最多是原始值的一半。
算法的检验:
当然,即使设计好了算法我们也不能确保程序会按我们所设计好的运行。
书上提供了一种检验的方法:编程并比较实际运行的时间与通过分析所描述的运行时间是否相匹配。
仔细阅读了一遍,发现这部分内容有点看不懂啊。
。。。。。。。。。。。。。。。。
后面再倒过来看一遍好了。
=========================================================================================================
到此为止第一章和第二章算是看完了,3月3日的学习就到了这里
(内容确实是有点少,主要是我今天太摆了,就放一张生气的图片鞭策一下自己吧,不能接着休息的借口三分钟热度)
(浅浅地看了一下后面的内容,书上说抽象数据类型(ADT)是一些操作的合集(这其实就是在编写函数吧))