《数据结构与算法之美》学习笔记
文章平均质量分 74
ppingfann
这个作者很懒,什么都没留下…
展开
-
数据结构之数组
数组的三种操作时间复杂度按下标随机查找时间复杂度:O(1)插入时间复杂度:O(n)删除时间复杂度:O(n)查找操作因为数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。所以,我们在通过下标i查找某个元素的时候,通过计算a[i]_address = base_address + i * data_type_size就可以查到该元素的偏移地址了。因为只需要经过有...原创 2018-10-29 11:19:11 · 655 阅读 · 0 评论 -
数据结构之红黑树
红黑树的由来红黑树的引入是用来解决二叉查找树在频繁的插入、删除操作的情况下,可能会出现的性能快速退化的问题。二叉查找树最坏的情况下可能退化为链表,成为O(n)O(n)O(n)的时间复杂度。用来解决这种问题的二叉查找树叫做平衡二叉查找树,平衡二叉查找树可以保持二叉查找树的高度尽可能的小,以此来使二叉查找树的操作时间复杂度稳定在O(logn)O(logn)O(logn)。接下来看一下平衡二叉查找...原创 2018-11-21 14:53:52 · 270 阅读 · 0 评论 -
数据结构之二叉树基础
树是什么计算机中的树是一种数据结构,它是由n个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根在上而叶子在下。树的特点每个节点有零个或多个子节点没有父节点的节点称为根结点每一个非根节点有且只有一个父节点除了根结点外,每个子节点可以分为多个不相交的子树树的术语节点:树中的每一个元素父节点:生出该节点的节点,每一个节点只能有一个父节点...原创 2018-11-16 11:33:59 · 1080 阅读 · 0 评论 -
算法之递归
何时用递归需满足三个条件:一个问题的解可以分解为几个子问题的解这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样存在递归终止条件使用递归时注意要点要注意避免堆栈溢出要注意不要过量的重复性计算(可以利用map存储计算值)递归与迭代的区别递归是函数调用函数自身迭代是变量自身的数值变化简单例子问题:假如现在有 n 个台阶,每次你可以跨 1 个台阶或者 2 ...原创 2018-11-08 09:34:33 · 180 阅读 · 0 评论 -
算法之哈希算法
哈希算法定义将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。哈希算法实现的要求从哈希出来的值不能反向推导出原始数据。也就是说,哈希算法是单向的。对原始数据十分敏感,输入数据改变一点,输出的数据就会大不相同。散列冲突的概率要非常小。哈希算法的执行效率要十分高。哈希算法的应用安全加密安全加密主要利用哈希算法单向的特点。我们可以对要存储的密码进行哈希...原创 2018-11-13 10:35:25 · 993 阅读 · 0 评论 -
数据结构之队列
概念可以把队列想象成排队买票,先来的人先买,后来的人站在队尾排队后买,不允许插队,先进者先出,这就是典型的“队列”。特点先进者先出,后进者后出,不允许在中间进行插入、删除操作。基本操作入队:在队列的末尾插入元素出队:在队列的头部取出元素常见队列普通队列、循环队列、阻塞队列、并发队列队列的实现数组实现:要注意选择数组的长度链表实现:无限长队列,可能会出现过长等待时间循环队列的...原创 2018-11-05 13:11:11 · 202 阅读 · 0 评论 -
算法之二分查找
概念二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到想要查找的元素,或是区间被缩小为0。时间复杂度二分查找的时间复杂度为O(logn)O(logn)O(logn)lognlognlogn是一个非常恐怖的数量级,即使n非常大,对应的lognlognlogn也很小。比如n等于2的32次方,这个数很大,大约42...原创 2018-11-12 22:30:25 · 255 阅读 · 0 评论 -
数据结构之散列表
概述散列表的英文名叫“Hash Table”,所以,我们也叫它为哈希表。散列表利用数组支持下标随机访问数据的特性,是数组的一种扩展,由数组演化而来。散列函数我们需要把键值key映射为数组的下标。所以需要一个映射的函数,这个映射的函数就是散列函数。散列函数有三个基本要求:散列函数计算得到的散列值是一个非负整数如果key1=key2key1=key2key1=key2,那么hash(k...原创 2018-11-07 09:14:15 · 398 阅读 · 0 评论 -
算法之排序
排序算法是一种非常基础也非常重要的算法。要选择合适的排序算法为自己的程序做优化,那么就需要了解不同算法优劣的衡量依据。衡量排序算法的依据执行效率1.1 最好时间复杂度、最坏时间复杂度、平均时间复杂度1.2 在数据规模不大时,低阶、系数、常量也需要考虑1.3 时间复杂度相同,需要考虑比较与交换次数空间消耗使用空间复杂度判断,原位排序的时间复杂度为O(1)稳定性排序算法的稳定性:...原创 2018-11-09 17:13:21 · 160 阅读 · 0 评论 -
数据结构之跳表
跳表是什么跳表是一种经过改进的链表。是一种查找效率要比链表更高的带有索引的链表。跳表是怎么出现的我们都知道链表相比于数组在存储上很占优势。不过查询时的时间复杂度为O(n),相比于下标随机查找下的数组的时间复杂度O(1)要逊色很多。所以大家都希望可以对链表的查询时间复杂度做一些提高,就算是要牺牲一些存储空间。跳表是在原始链表的基础上,设置了几层索引链表。通过索引链表进行查询。这样可以计算得...原创 2018-11-06 08:27:27 · 1509 阅读 · 0 评论 -
算法的复杂度分析
复杂度分析是什么代码的复杂度分为时间复杂度与空间复杂度。数据结构与算法解决的核心问题就是让代码更“快”、更“省”。具体来说,就是执行的时间尽可能的短,占用的空间尽可能的少。而代码到底有多“快”、有多“省”,需要对应的衡量标准,时间复杂度就作为代码有多“快”的衡量标准,空间复杂度就作为有多“省”的衡量标准。对时间复杂度与空间复杂度的计算分析就是复杂度分析了。为什么需要复杂度分析我记得我刚...原创 2018-10-27 10:06:03 · 655 阅读 · 0 评论 -
数据结构之链表
数组和链表对比数组是连续的内存区域、链表不是连续的内存区域。因此,数组在通过下标查询时的时间复杂度低,而链表在查询时需要遍历链表,所以时间复杂度较高。对于插入和删除,因为数组是连续的内存区域,所以每次插入和删除都需要做数据的迁移,因此时间复杂度较高。而链表因为在内存区域本身就不是连续的,所以时间复杂度比数组低。链表分类常见的有:单向链表、循环链表、双向链表、双向循环链表。链表时间复杂度...原创 2018-10-30 08:09:24 · 233 阅读 · 0 评论 -
数据结构与算法学习背景概述
为什么要学习数据结构与算法?1. 面试必备站在一个比较现实且功利的角度来看,做计算机技术的大公司,如BAT、Google、Facebook,它们在招聘技术人员时,数据结构与算法是必考查的知识点。如果想要进入这样的大公司,那么掌握数据结构与算法就是必不可少的。这点作为正在秋招时期的我深有感触。完全不问数据结构与算法的技术面试是非常少的,基本上每个公司在技术面都会考查数据结构与算法(就算是小公司...原创 2018-10-26 22:41:00 · 2284 阅读 · 1 评论 -
数据结构之栈
什么是栈从栈的操作特性上来看,栈是一种 “操作受限”的线性表,只允许在一端插入和删除数据,且满足先进后出、后进先出的特性。实现一个栈栈可以用数组或链表来实现,数组实现的叫顺序栈,链表实现的叫链式栈。栈的时间复杂度入栈与出栈的时间复杂度均为O(1)动态扩容的顺序栈与数组动态扩容类似,用数组实现的栈也可以动态扩容。申请一个扩容后的内存区域将数组迁移过去。栈的应用函数调用存储局部变量...原创 2018-10-31 10:19:15 · 273 阅读 · 0 评论 -
数据结构之堆
什么是堆堆是一种特殊的树,需要满足两点要求:是完全二叉树每个节点都大于等于(或小于等于)其左右子节点注:每个节点都大于等于其左右子节点的叫做大顶堆,每个节点都小于等于其左右子节点的叫做小顶堆。堆的操作往堆中插入一个元素实现:插入堆的末尾后进行从下往上的堆化删除堆顶元素实现:删除堆顶元素后,将末尾元素放至堆顶,然后进行从上往下的堆化基于堆实现排序建堆建立堆时间复杂度...原创 2018-11-28 09:37:28 · 198 阅读 · 0 评论