2020.4.1-2020.4.7 魔笛手Pied pier周记

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(n^{2})。如果能用O(n!)衡量,那么是很耗时间的算法,因为n!的增速比2^{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存储用户名,按照首字母存储的链表数组,查找的时候首先查找首字母,再在对应字母的链表里面添加。

选择查找ÿ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值