读我的算法书总结

什么是算法在这里插入图片描述

  1. 算法是解决问题的步骤
  2. 算法和程序有些相似,区别在于程序是以计算机能够理解的编程语言编写而成的,可以在计算机上运行,而算法是以人类能够理解的方式描述的,用于编写程序之前。不过,在这个过程中到哪里为止是算法、从哪里开始是程序,并没有明确的界限。
  3. 计算机擅长高速执行一些基本命令,但无法执行复杂的命令。此处的“基本命令”指的是“做加法”或者“在指定的内存地址上保存数据”等。计算机是以这些基本命令的组合为基础运行的,面对复杂的操作,也是通过搭配组合这些基本命令来应对的。上文中提到的“对n个数字进行排序”对计算机来说就是复杂的操作。如何设计算法来解决这个排序问题,也就等同于构思如何搭配组合计算机可以执行的那些基本命令来实现这个操作。
  4. 选择算法的时间:算法的运行时间

运行时间的计算方法

1.输入数据的量与运行时间不一致
2.用“步数”来描述运行时间。“1步”就是计算的基本单位。通过测试“计算从开始到结束总共执行了多少步”来求得算法的运行时间。
①从数列中寻找最小值
②将最小值和数列最左边的数字进行交换,排序结束。回到①

如果数列中有n个数字,那么①中“寻找最小值”的步骤只需确认n个数字即可。这里,将“确认1个数字的大小”作为操作的基本单位,需要的时间设为T,那么步骤①的运行时间就是nxT1
接着,把“对两个数字进行交换”设为T2。那么,①和②总共重复n次,每经过“1轮”,需要查找的数字就减少1个,因此总的运行时间如下。
在这里插入图片描述
3.结果可简化,T1和 T2都是基本单位,与输入无关。会根据输入变化而变化的只有数列的长度 n,只考虑 n 变大的情况。n越大,上式中的n2也就越大,其他部分就相对变小了。也就是说,对式子影响最大的是n2。所以,删掉其他部分,将结果表示成下式右边的形式。
在这里插入图片描述
排序算法的运行时间与输入数据量n的平方成正比。
在这里插入图片描述
O这个符号的意思是“忽略重要项以外的内容”。O(n2)的含义就是“算法的运行时间最长也就是的常数倍”,通过这种表示方法,我们可以直观地了解算法的时间复杂度。

1. 数据结构

1-1什么是数据结构

  1. 决定了数据的顺序和位置关系
    数据存储于计算机的内存中。内存如右图所示,形似排成1列的箱子,1个箱子里存储1个数据。数据存储于内存时,决定了数据顺序和位置关系的便是 数据结构”

  2. 电话铺的数据结构:分别使用不同的表存储不同的拼音首字母,比如表L、表M、表N等,然后将同一张表中的数据按获取顺序进行排列。
    选择合适的数据结构以提高内存的利用率:数据结构方面的思路也和制作电话薄时的一样。将数据存储于内存时,根据使用目的选择合适的数据结构,可以提高内存的利用率。数据在内存中是呈线性排列的,但我们也可以使用指针等道具,构造出类似“树形”的复杂结构

1-2链表

呈现线性排列,添加就是将指针指向改一下,删除也是,都比较方便耗时O(1),访问耗时间,因为顺着指针往下访问需要从头查找,耗时O(n)
注意:还有循环列表就是保持数量固定,还有双向链表 可以从前或者从后访问,两个缺点:一是指针数的增加会导致存储空间需求增加;二是添加和删除数据时需要改变更多指针的指向。
在这里插入图片描述

1-3数组 与链表反着来

数组是按照顺序存放,可以通过下标直接访问O(1),但是添加和删除就比较麻烦,需要将其他数组挪位置O(N)
在这里插入图片描述
在这里插入图片描述

1-4栈

只能访问最新添加的数据,像堆书一样,放在上面的先拿出来看,执行先进后出。添加和删除数据只能在一端进行,访问也只能访问顶端的数据,若要是访问中间的就把其数据出栈到顶端。
在这里插入图片描述

1-5 队列

就是想排队一样,谁去就是第一个,后面加进去的只能在后面,实现的是先进先出。数据的添加和删除再两端进行,访问中间的数据也是只能将其他出队,数据到达顶部才能识别。
在这里插入图片描述

1-6 哈希函数

1.添加数据

使用哈希函数(Hash)计算Joe的键,也就是字符串“Joe”的哈希值。得到的结果为4928。将得到的哈希值除以数组的长度5,求得其余
数。这样的求余运算叫作“mod运算”。此处mod运算的结果为3。存进三号箱子
在这里插入图片描述
当有冲突的时候,继续以链表储存。
在这里插入图片描述

  1. 查询数据
    知道Dan存储在哪个箱子里,首先需要算出Dan键的哈希值,然后对其进行mod运算。最后得到的结果为4,于是我们知道了它存储在4号箱中。查看4号箱可知,其中的数据的键与Dan一致,于是取出对应的值。由此我们便知道了Dan的性别为男(M)
    如果找到的箱子里是冲突数据,就进行链表查询
    在这里插入图片描述dui

1-7堆 -取出最小值最方便

堆是一种图的树形结构,被用于实现“优先队列”(priorityqueues)(讲解在4-2节)。优先队列是一种数据结构,可以自由添加数据,但取出数据时要从最小值开始按顺取出。在堆的树形结构中,各个顶点被称为“结点”(node),数据就存储在这些结点中。
子节点大于父节点。顺序:从上到小,从左到右。

在这里插入图片描述
在这里插入图片描述

1-8 二叉查找树

每个节点只有两个子节点
两个性质。第一个是每个结点的值均大于其左子树上任意一个结点的值。比如结点9大于其左子树上的3和8。
在这里插入图片描述
第二个是每个结点的值均小于其右子树上任意一个结点的值。比如结点15小于其右子树上的23、17和28。
根据这两个性质可以得到以下结论。首先,二叉查找树的最小结点要从顶端开始,往其左下的末端寻找。此处最小值为3。
反过来,二叉查找树的最大结点要从顶端开始,往其右下的未端寻找。此处最大值为28

在这里插入图片描述
1.加入1
首先,从二叉查找树的顶端结点开始寻找添加数字的位置。将想要添加的1与该结点中的值进行比较,小于它则往左移,大于它则往右
一直将他与每个数进行对比。
在这里插入图片描述
2.加入4
在这里插入图片描述
3.删除节点
若是下面无节点直接删除,有一个将其提上来,若有几个就需要从左子节点中找做大的,将4提上9位置
在这里插入图片描述
在这里插入图片描述

2 排序

2.1什么是排序

数字从小到大排序

2.2 冒泡排序

重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置”这一操作的算法。数字会像泡泡一样,慢慢从右往左“浮”到序列的顶端。就是从右边一个一个比较每个数字比较,然后再拿右边倒数第二个与现有的数字一个一个比较,直到达到顺序
在这里插入图片描述
在冒泡排序中,第1轮需要比较n-1次,第2轮需要比较n-2次·第n-1轮需要比较1次。因此,总的比较次数为(n-1)+(n-2)+··+n²/2。这个比较次数恒定为该数值,和输入数据的排列顺序无关。
不过,交换数字的次数和输入数据的排列顺序有关。假设出现某种极端情况,如输入数据正好以从小到大的顺序排列,那么便不需要任何交换操作;反过来,输入数据要是以从大到小的顺序排列,那么每次比较数字后便都要进行交换。因此,冒泡排序的时
间复杂度为O(n²)

2.3插入排序

插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上
在这里插入图片描述
在插入排序中,需要将取出的数据与其左边的数字进行比较。左边的数字更小,不需要继续比较,操作到此结束,不需要交换数字的位置。取出的数字比左边已归位的数字都要小,不停地比较大小,交换数字,直到它到达整个序列的最左边为止。具体来说,**就是第k轮需要比较k-1次。因此,在最糕的情况下,第2轮需要操作1次,第3轮操作2次·第n轮操作n-1次,**所以时间复杂度和冒泡排序的一样,**时间复杂度为O(n²)**输入数据按从大到小的顺序排列时就是最糕的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值