(开头是一些废话啊,最近感觉学习状态不太好,上高数的时候左耳听进去右耳就出来了,有点跟不上,可能是没吃饭的原因,也可能是最近强度有点大了,下午上完课就给自己休息了一下,结果刷手机全是关于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给我图再怎么好看,我也只是会了一个工具而已,对我本身的能力没有什么提升,但现在不一样了,学会一张海报如何做得好看,把各种各样的图片组成在一起,这不仅是我个人能力的体现,更是我想追求的人的艺术。

最新文章

  1. linux basic commands
  2. SPOJ 375. Query on a tree (树链剖分)
  3. 挂多个class还是新建class —— 多用组合,少用继承
  4. PWM控制led渐变
  5. 实际利率 &gt; 名义利率
  6. [MongoDB] Insert, find -- 1
  7. Silverlight开发工具汇总
  8. 华为软件开发云对比Jenkins-JavaWeb项目持续部署方式
  9. 201521123059 《Java程序设计》第七周学习总结
  10. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(3)!
  11. Exchange Online Mailbox Restoration
  12. python的安装和pycharm的安装
  13. 使用linux计划任务自动拉起停止的通达OA服务apache和mysql服务
  14. C++中:默认构造函数、析构函数、拷贝构造函数和赋值函数——转
  15. 删除php数组中的元素
  16. 粒子群算法(PSO)关于参数w的一些改进方法
  17. python学习——简介和入门
  18. Docker - 容器中的tomcat如何使用startup.sh启动
  19. stm32下载程序,拔了调试器不能运行程序解决方案
  20. 《从零开始学Swift》学习笔记(Day 29)——访问级别

热门文章

  1. Hangfire .NET任务调度框架实例
  2. UEFI引导安装UBUNUT
  3. P6329 【模板】点分树 | 震波
  4. vue的两种服务器端渲染方案
  5. Postgresql 锁等待检测及处理
  6. Java 反射概念的引入
  7. 记一次hooks陷阱
  8. hashMap的底层数据结构
  9. C++数据结构-结构体
  10. java开发环境搭建 (JDK卸载与安装、配置)