大家好,这是本人的第二篇笔记,记于2022.8.31,目的是分享前几天的学习内容(我没有想到我作为新生时有这么多的学长帮我清理宿舍,我也没有想到为什么技术部要去打扫卫生),由于刚刚接触这门课程,如果有什么错误或者有什么表达不清楚的地方,请斧正,谢谢。
书接上文。
我们已经将模型介绍给大家了。在模型中我们可以看出,一个程序要想成功解出问题肯定是要两件东西:算法和数据结构。(这个在我的第一篇文章中已经提出了,那个时候我还没有学习数据结构,炫耀)根据书上的介绍:算法+数据结构=程序。
先来说说算法,我相信不少的朋友的听说过“算法”这个词,觉得好高大上,好厉害,好**,是的,厉害的算法可以称之为艺术,我作为一个在逻辑上普普通通的一个人,我甚至无法想象出他是怎么想出这么一个方法的(可能是因为我没有参加acm培训,很多思考工具没有有意识的使用)。
算法是问题的解决方案,它对于程序的性能有比重非常大的决定能力。
举个栗子,对于“将一个有n个单位的数组向左移动i个位置”这个问题,你能想到几个解法?
看到这里,你可以先停下来给自己几分钟想想你会怎么做。(说实在的,我只能想到一个方法)
所以,经过这几分钟的思考你有什么解决方法呢?
老师的教材上给出了三种方法:
1.先将数组中的前i个元素存放在一个临时数组中,再将余下的n-i个元素左移i个位置,最后将前i个元素从临时数组中复制回原数组中后面的i个位置
2.先设计一个函数将数组向左循环移动1个单位,然后调用该函数i次
3.先将A逆置得到(A^-1)B,再将B逆置得到(A^-1)(B^-1),最后将(A^-1)(B^-1)逆置得到BA
(解法3讲解
举个栗子,我们要将1,2,3,4,5,6,7这个数组向左移动2个位置,也就是说我们要得到3,4,5,6,7,1,2。
所以设1,2为A。
3,4,5,6,7为B。
所以(A^-1)为2,1。
(A^-1)(B^-1)为2,1,7,6,5,4,3。
最后BA为3,4,5,6,7,1,2。
)(正常人的怎么可能会想到这种地步!!!)
然后,这几个算法的性能怎么样我们可以直接去判定,因为毕竟越难理解的就越是高效,但是我们计算机毕竟是一门科学,所以我们要用数据说话。
算法的性能的判定因素有两个:空间占用量和时间消耗量(这两个名称不是专业名称,是我自己为了更方便理解所取的,他们原本的名字是空间复杂度和时间复杂度,刚刚学习的小伙伴不要被我误导了)
解法 | 占用空间 | 时间消耗量 |
解法1 | i个额外储存单位 | i+n |
解法2 | 1个额外储存单位 | n*i |
解法3 | 无额外储存单位 | n |
时间消耗量:
解法1:i(先将数组中的前i个元素存放在一个临时数组中)+n-i(再将余下的n-i个元素左移i个位置)+i(将前i个元素从临时数组中复制回原数组中后面的i个位置)。
解法2:n(数组向左循环移动1个单位)*i(调用该函数i次)。
解法3:i/2(将A逆置得到(A^-1)B)+(n-i)/2(将B逆置得到(A^-1)(B^-1))+n/2(最后将(A^-1)(B^-1)逆置得到BA)。
所以当n=100时,不同的算法的时间消耗量与空间占用量是大大不同的。
好的,由于时间限制接下来的学习内容我会放在下一篇的笔记里面。
记于2022.8.31,与诸君共勉。