3月1日至3月2日——数据结构与算法分析阅读笔记,线性表,AI。
(开头是一些废话啊,最近感觉学习状态不太好,上高数的时候左耳听进去右耳就出来了,有点跟不上,可能是没吃饭的原因,也可能是最近强度有点大了,下午上完课就给自己休息了一下,结果刷手机全是关于AI的内容,谢谢你,大数据。躺了两个小时感觉状态也不是太好。)
我在网上购买了有关算法的书,通过阅读的方式对网课所学的内容进行回忆和补充
看完书之后我才发现李教授讲得真的是太好了,简洁明了,由于书和网课的进度并不统一,我打算把它们分成两个模块来记笔记,同时也为我的AI再开一个模块。
由于状态不对劲,今晚不一定会更博客,而已要研究的东西也挺多的,写一半先发了吧。
============================================================================================================
看书的收获
之前在李教授那边的网课上完有关时间复杂度的内容后,我依然不是很能想象出如果要我自己去优化一段代码,我要怎么优化。
我真的要把代码的时间复杂度算出来,然后去想怎么样可以让时间复杂度减少一个量级吗?
在看完书之后,我对如何优化代码有了新的理解,书上举了一个递归函数的例子:
long int
Fib( int N)
{//斐波那契数
if( N<=1 )//第一行
return 1;//第二行
else
return Fib( N - 1 ) + Fib( N - 2);//第三行(感觉写注释确实挺烦的)
}
这是一段执行效率非常低的代码,因为在第三行中第一次调用Fib( N - 1 )时实际已经计算过一次Fib( N - 2 )了(这个知道斐波那契数的人应该知道),但随后这个信息被抛弃,而在第二次调用这个函数时再计算了一次,被抛弃的信息量递归地合成起来并导致巨大的运行时间(看到这里思维真的被打开了,书上不断强调说用得好的递归很厉害,但我还没看见例子)。
可以通过保留一个简单的数组并使用一个for循环来减少运行时间(不是很能理解,晚自习试试看)
书上的例子提醒了我,减少运行时间的最好的方式就是去掉冗余,充分利用每一次计算得到的数据,在往后设计代码时,我也会尝试将每一步得到的数据都尝试加以利用,在后续分析如何优化时,我也可以这样做。
接着还有一个我不是很能理解的例子:
int Max( const int A[],int N)
{
int ThisSum,MaxSum,i,j,k;
MaxSum = 0;//第一行
for( i = 0; i < N; i++ )//第二行
for( j = i; j < N; j++ )//第三行
{
ThisSum = 0;//第四行
for( k = i; k <= j; k++ )//第五行
ThisSum += A[k];//第六行
if( ThisSum > MaxSum )//第七行
MaxSum = ThisSum;//第八行
}
return MaxSum;//第九行
}
然后就是这一大串东西了
接着针对第五第六行进行优化:
int Max( const int A[],int N)
{
int ThisSum,MaxSum,i,j,k;
MaxSum = 0;//第一行
for( i = 0; i < N; i++ )//第二行
{
ThisSum = 0;//第三行
for( j = i; j < N; j++ )//第四行
{
ThisSum += A[j];//第五行
if( ThisSum > MaxSum )//第六行
MaxSum = ThisSum;//第七行
}
}
return MaxSum;//第八行
}
其实在第五第六行中,已经产生了变量J,而每一次循环中J的值都是我们需要的值,然而原先的算法却额外产生了一个与j的数值一样的K来给A赋值,这就产生了冗余。
网课
有关线性表的函数:
初始化线性表:InitList(&L):构建一个空的线性表L。
销毁线性表:DestoryList(&L):销毁线性表L占用的内存空间。(和内存有关的都要加&吗?)
判断线性表是否为空表:ListEmpty(L):若L为空表,则返回1,否则返回0.
求线性表的长度:ListLength(l):返回L中元素个数n。
输出线性表DispList(L):线性表L不为空时,顺序显示L中各节点的值域。
求线性表L中指定位置(i)的某个数据元素GetElem(L,i,&e):用e返回L中第i(1<=i<=n)个元素的值(简单来说就是把i保存在e中。)
定位查找LocateElem(L,e):返回L中第一个值域与e相等的逻辑位序。若这样的元素不存在则返回值为0.(如果与e相等的值在L中的第一个,返回值是多少?)
插入一个数据元素ListInsert(&L,i,e):在L的第i(1<=i<=n)个元素之前插入新的元素e,L的长度增1.
删除数据元素ListDelete(&L,i,&e):删除L的第i个元素,并用e返回其值,L的长度减一。
AI(挺重要的,可以看一下吗)
由于我当上了三班的宣传委员,我想着也不能吃白饭,就让我的AI做了一张海报的背景图试试,第一张是原图,第二张是效果:
这个背景图启发了我,原先我一直在想,就算AI给我图再怎么好看,我也只是会了一个工具而已,对我本身的能力没有什么提升,但现在不一样了,学会一张海报如何做得好看,把各种各样的图片组成在一起,这不仅是我个人能力的体现,更是我想追求的人的艺术。