4.1 周三 第一天
本周序言:
《算法图解》这类书是学习用书,读起来是没有积极性的,毕竟谁会没事读教材,这不是跟自己过不去吗,但是我还必须得跟自己过不去,于是用写博客的形式记录下我的学习笔记。本书一共11章,每天读一章的话11天才能读完,一想到11天我就难受,但是要达到速战速决,还得每天的坚持,这个也是难得一匹,折衷想法是每天至少读一章,长痛不如短痛。
第一章:算法简介
(1)主要知识:二分查找,大O表示法
1.1 二分查找:输入要求是一个有序序列,例如经典的猜数问题,就是根据每次将中值和要找的值进行比对,根据大了还是小了调整查找范围,直到查找范围缩小到上限等于下限。对于二分查找,每次淘汰的是查找范围一半的数值,因此就是相当于除以2,故按照这种猜法,只需要看能被2除几次,直到商小于1为止(淘汰的数字的至少为1嘛,小于1就是淘汰环节终止),换句话说就是查找范围的总数等于几个2连乘,也就是取以2为底的对数(取对数就是幂运算的逆运算)。
1.2 大O表示法:O是指operator,也即操作数的次数,陈斌老师讲的,也就是看的赋值语句的次数(因为赋值语句里面同时包含表达式计算和变量存储,是一个好的衡量运行时间的标准,当然,操作次数具体是T(n),O()是T(n)的主导部分)。大O是主导部分的原因是因为它是算法运行时间随着问题规模n增大时的参与贡献最大的部分,也就是主要靠着它在拉动增长,那么它就是O()的括号里面填的内容,它甚至不需要系数,因为加上系数的增长也不及随着n的增大它本身的增大,而且它是最糟情况的下限(还有别的表示法:大欧米伽,大seita)。常见的几种运行时间有:对数时间(O(logn))、线性时间O(n),O(nlog(n))、O(n!)等。其中我们熟悉的排序算法,例如快速排序就是O(nlog(n)),选择排序就是O()。如果能用O(n!)衡量,那么是很耗时间的算法,因为n!的增速比
还要快,所谓n的阶乘,就是全排列问题,n=20时,时间消耗用你的一生衡量都太短,等结果出来了,太阳都没了。
(2)经典代码
二分查找实现(Python):
def binary_search(num_list,number):
low=0
high=len(num_list)-1
while low<=high:
mid=(low+high)//2 #python里面地板除是//
if num_list[mid]==number:
return mid
else if num_list[mid]<number: #用中值去猜,猜的数是小了,那么我就要刷新下限,上限不变,每次只刷新一边。
low=mid+1
else:
high=mid-1
return None
(3)小结感悟
开设“经典代码”模块是因为过去我很抵触这个,导致相关的,我就很抵触科研,但是其实代码写起来很有意思,尤其是当你慢慢地信手拈来,实现了一些比较酷炫的功能之后。所以,不要停止在想象的印象里,而要动手操作起来感受智趣,值得一提,代码是没看自己写的,一遍成功,但是只是鼓励下,因为这不是什么值得高兴的事,这是应该的,在内行看来这简直就是1+1=2。还好这本是python版本,不然真的这本书我直接就会以语言原因不看了,那样我会很心疼,心疼的是我的钱。说起来,数据结构和算法和语言密切相关,因为对同一算法的实现的性能不仅和算法本身相关,也和语言密切相关,当然算法本身是本质区别,之前看到那本紫色封面的清华出版社的严老师的教材,有个括号:C语言版,我当时还觉得干嘛标注语言,现在明白了,用啥实现也很有关系,必须要有针对性。至于为啥和语言相关,是因为现在接触到的编程语言基本都是高级语言,都是在机器语言上的演绎,而演绎方式各有不同,导致操作相同的话也会有不同的运行时间,而不像机器语言是统一标准的。
4.4 周六 第四天
第二天就凭拖延实力说话,连续两天都没有看一页,第四天了,今天一天要看三章,真的有点呜呜呜,谁让我懒懒两天的,拖延的我的眼泪不值钱。(一段想要划掉的回忆,拖延加后悔无限循环,我什么时候有长进5555)
第二章 :选择排序
(1)主要知识:数组和链表、选择查找
数组和链表:这两种数据结构主要是存储方式上的区别,数组是连续存储,链表是非连续存储,一个数组或者链表里面的元素数据类型需要一致。存储方式上的区别导致优势劣势的区分:数组的元素都在一块,相对固定,利于随机访问,不利于插入和删除元素;链表由于非连续存储,前一元素的存储除了值之外还要存储下一元素的地址值,在访问方式上就只能从第一个开始访问,是顺序访问,访问方式上占下风,但是由于自由散漫,因此利于插入和删除。由于各有千秋,因此最好的方式就是各取所长的链表数组,数组的每一个元素都指向的是一个链表,这样既可以随机访问,又可以随时插入和删除。例如facebook存储用户名,按照首字母存储的链表数组,查找的时候首先查找首字母,再在对应字母的链表里面添加。
选择查找ÿ