数据结构和算法学习总结
代品品
这个作者很懒,什么都没留下…
展开
-
数据结构与算法学习总结--回溯算法
文章目录回溯算法的思想回溯算法的基本步骤回溯算法适用场景常见面试考题 回溯算法的思想 回溯算法实际上类似枚举的搜索尝试过程,在搜索尝试过程中寻找问题的解,当发现已经不满足条件时,就回溯返回,尝试别的途径 回溯法是一种优选搜索法,按照优选条件向前搜索,以达到目的 回溯算法的基本步骤 1、针对所给问题,定义问题的解空间,它至少包含问题的一个解(最优解) 2、确定易于搜索的解空间结构,使得能够使用回溯法方便地搜索整个解空间 3、以深度优先的方式搜索解空间,并且在搜索的过程中,用剪枝来避免无效搜索 注意点:原创 2020-11-14 12:27:02 · 228 阅读 · 1 评论 -
数据结构与算法学习总结--分治算法
文章目录如何理解分治算法(分治算法的概念)分治算法与递归的关系分治算法的实现步骤使用分治算法的条件分治算法的应用常见面试考题 如何理解分治算法(分治算法的概念) 分治算法的核心思想:分而治之 将原问题划分成n个规模较小并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,从而得到原问题的解 分治算法与递归的关系 分治算法是一种处理问题的思想,而递归是一种编程技巧 分治算法一般都适合用递归来实现 分治算法的实现步骤 分治算法的递归实现中,每一层递归都会涉及以下三个操作 分解 将原原创 2020-11-14 11:46:10 · 192 阅读 · 0 评论 -
数据结构与算法学习总结--贪心算法
文章目录贪心算法解决问题的步骤贪心算法经典应用 贪心算法解决问题的步骤 首先要能想到贪心算法 什么样的问题才适合使用贪心算法? 针对一组数据,定义了限制值和期望值,希望从中选取几个数据,在满足限制条件的情况下,期望值最大。 尝试看用贪心算法能不能解决问题 每次都选择在当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据 举几个例子看贪心算法产生的结果是否是最优的 注:贪心算法不适用于前面的选择会影响后面的选择的情况 贪心算法经典应用 霍夫曼编码 (Huffman Codin原创 2020-11-14 11:05:24 · 206 阅读 · 0 评论 -
数据结构与算法学习总结--深度优先和广度优先搜索
文章目录什么是搜索算法广度优先搜索算法(BFS)深度优先搜索(DFS) 什么是搜索算法 图上的搜索算法就是从一个顶点出发找到到另一个顶点的路径 算法是作用于数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于图的 深度优先搜索算法和广度优先搜索算法既可以作用于有向图也可以作用于无向图 深度优先搜索算法和广度优先搜索算法是一种暴力搜索算法,仅适用于图不大的搜索 广度优先搜索算法(BFS) 算法思想 先查离顶点最近的,然后是次近的,依次往外搜索,需要借助队列来实现 算法实现一般要借助辅助变量vi原创 2020-10-31 22:22:03 · 407 阅读 · 0 评论 -
数据结构与算法学习总结--图的表示
文章目录图的相关概念图的存储 图的相关概念 顶点、边、度(入度/出度) 有向图、无向图、带权图 图的存储 邻接矩阵 优点:简单、直观;方便矩阵运算,查询效率高 缺点:浪费存储空间,尤其是稀疏图(顶点很多,但是每个顶点的边不多) 领接表 每个顶点都对应一个链表 有时为了便于操作,还会同时存储逆邻接表 优点:节省内存空间 缺点:有些查找相关的操作比较耗时,可以将每个顶点的链表改进为红黑树或者跳表、散列表等动态数据结构 ...原创 2020-10-31 20:47:39 · 112 阅读 · 0 评论 -
数据结构与算法学习总结--堆及其应用
文章目录什么是堆如何存储堆堆的常用操作(以大顶堆为例)如何基于堆,实现堆排序为什么快排比堆排序性能好堆的常见应用 什么是堆 堆是一个完全二叉树 堆的每个节点的值都大于等于(或者小于等于)它的子树中每个节点的值(实际上等价于堆的每个节点的值都大于等于(或者小于等于)它的左右子节点的值) 每个节点值都大于等于左右子树节点值的堆,称为大顶堆 每个节点值都小于等于左右子树节点值的堆,称为小顶堆 如何存储堆 堆是一个特殊的树,因此可以使用树的存储结构(数组,链表结构来存储)来存储 因为堆是完全二叉树,因此用原创 2020-10-24 17:51:47 · 113 阅读 · 0 评论 -
数据结构与算法学习总结--红黑树
文章目录什么是平衡二叉查找树为什么要有平衡二叉查找树常用的平衡二叉查找树--红黑树散列表、跳表、红黑树对比 什么是平衡二叉查找树 二叉查找树中任意一个节点的左右子树的高度相差不能超过1 上面是严格的平衡二叉查找树定义,很多平衡二叉查找树只是近似平衡,并未严格遵从以上定义 为什么要有平衡二叉查找树 为了解决普通二叉查找树在频繁插入、删除等动态更新的情况下,出现时间复杂度退化的问题 保持整棵树左右比较平衡,这样整棵树的高度就会相对低一些,相应的插入、删除、查找操作效率就会高一些 常用的平衡二叉查找树–红原创 2020-10-17 11:42:15 · 79 阅读 · 0 评论 -
数据结构与算法学习总结--树
文章目录树的相关概念最常用的树—二叉树如何存储二叉树二叉树的遍历二叉树中最常用的类型--二叉查找树 树的相关概念 父节点、子节点、兄弟节点、根节点、叶子结点 高度(从下往上,从0开始计数) 深度(从上往下,从0开始计数) 层(从上往下,从1开始计数) 层 = 深度+1 最常用的树—二叉树 每个节点最多有两个子节点(左子节点、右子节点) 满二叉树(满二叉树是完全二叉树的一种特殊情况) 完全二叉树 如何存储二叉树 使用链表–二叉链式存储法(大部分二叉树都使用这种存储方式) 使用数组–顺序存储法(适用于原创 2020-10-17 10:37:27 · 118 阅读 · 0 评论 -
数据结构与算法学习总结--散列表
文章目录散列表的由来散列表如何实现的O(1)时间复杂度散列函数的基本要求如何解决散列冲突装载因子有两个字符串数组,每个数组大约有10万条字符串,如何快速找出两个数组中相同的字符串?如何设计散列函数散列因子过大时,怎么办工业级散列表的要求如何实现工业级散列函数 散列表的由来 散列表其实是数组的一种扩展,由数组演化而来。散列表用的是数组支持按照下标随机访问数据,时间复杂度为O(1)的特性。 散列表如何实现的O(1)时间复杂度 通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当按照原创 2020-10-09 16:01:22 · 192 阅读 · 0 评论 -
数据结构与算法学习总结--二分查找
文章目录算法思想使用条件时间复杂度二分查找代码易错地方 算法思想 每次通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0。 使用条件 查找的数据集合要有序(如果数据是静态数据或者插入删除操作比较少,查找次数比较多,可以一次排序,多次查找;如果插入/删除操作比较频繁,维护数据的有序,代价就比较高,每次查找前需要先排序后查找,所以这种场景就不适合使用二分查找了),二分查找更适合处理静态数据。 要求数据的存储结构是顺序表(数组) 数据量太小/太大,都不适合使用原创 2020-10-09 12:13:13 · 295 阅读 · 0 评论 -
数据结构与算法学习总结--排序算法
文章目录常用排序算法对比如何分析一个排序算法排序算法适用场景 常用排序算法对比 排序算法 最好 最坏 平均 空间复杂度 是否基于比较 是否稳定 冒泡 O(n) O(n^2) O(n^2) O(1) 是 是 插入 O(n) O(n^2) O(n^2) O(1) 是 是 选择 O(n^2) O(n^2) O(n^2) O(1) 是 否 归并 O(nlogn) O(nlogn) O(nlogn) O(n) 是 是 快排 O(nlogn) O(n^2) O(nlogn) O(1) 是原创 2020-10-08 20:43:03 · 155 阅读 · 0 评论 -
数据结构与算法学习总结--递归
文章目录定义特点什么样的问题可以用递归来解决?如何编写递归代码递归代码注意事项递归代码的优缺点 定义 特点 去的过程叫递,回来的过程叫归 什么样的问题可以用递归来解决? 同时满足以下3个条件,就可以用递归来解决 一个问题的解可以分解为几个问题的解 如果问题A,可以分解为若干子问题B、C、D,则可以假设问题B、C、D已经解决,在此基础上思考如何解决A。并且只需要考虑问题A和子问题B、C、D之间的关系即可,不需要一层一层往下思考子子问题,屏蔽掉递归细节。 这个问题与分解之后的子问题,除了数据规原创 2020-10-08 11:25:54 · 404 阅读 · 0 评论 -
数据结构与算法学习总结--队列
文章目录定义特点实现方式常见操作性能应用场景 定义 队列是一种操作受限的线性表数据结构,具有先进先出的特性,支持在一端(队尾)插入元素,在另一端(队头)删除元素 特点 先进先出 实现方式 用数组实现的队列叫顺序队列 用链表实现的队列叫链式队列 常见操作性能 入队enqueue 时间复杂度O(1) 空间复杂度O(1) 出队dequeue 时间复杂度O(1) 空间复杂度O(1) 应用场景 循环队列 循环队列可以解决数组实现的队列的数据搬移问题,使用更为广泛 循环队列实现的关键是正确原创 2020-10-08 10:15:26 · 299 阅读 · 0 评论 -
数据结构与算法总结--栈
文章目录栈的定义栈的特点为什么需要栈如何实现一个栈基本操作的性能栈的应用场景 栈的定义 栈是一种操作受限的线性表,只允许在一端进行插入和删除操作。 栈的特点 先进后出 为什么需要栈 虽然数组和链表更加灵活,并且都可以满足只在一端进行插入和删除操作的需求,但是由于会暴露其他操作,存在引发错误操作的风险,所以,当某个数据集合只涉及在一端进行插入和删除数据,并且满足先进后出的操作特性时,应首先使用栈这种数据结构。 如何实现一个栈 栈既可以用数组来实现,也可以用链表来实现 用数组实现的栈,叫顺序栈;用原创 2020-10-07 21:53:02 · 427 阅读 · 0 评论 -
数据结构与算法总结--链表
文章目录链表定义链表的特点链表数组对比常用链表 链表定义 链表是一种线性表 链表的内存结构是不连续的 链表的每一块内存被称为节点(node),除了存储数据还要存储后继指针 链表的特点 插入\删除效率高 (时间复杂度O(1),需要已知要插入\删除位置之前的节点指针,插入\删除时,只需要操作相关指针) 如果是删除节点中值等于某个给定值的节点,时间复杂度为O(n),需要遍历链表 查找效率低 查找效率低,时间复杂度(O(n)),需要从头遍历链表 内存消耗高 和数组相比,内存消耗高,需要存储原创 2020-09-26 21:05:21 · 338 阅读 · 0 评论 -
数据结构与算法学习总结--数组
文章目录数组定义基本操作及实际复杂度特点注意事项容器和数组使用场景总结数组下标为什么是从0开始 数组定义 数组是一种线性表数据结构,用一块连续的内存空间,来存储相同类型的一组数据。 基本操作及实际复杂度 查找 时间复杂度O(1) 注:根据下标直接查找,时间复杂度O(1) 查找某元素是否在数组中(顺序查找时间复杂度O(n), 若数组有序,可使用二分查找O(logN)) 插入 时间复杂度 O(n) 注:若不要求数组有序,可直接在末尾插入,时间复杂度O(1) 若是要在指定位置插入(但不要求有序原创 2020-09-26 20:05:47 · 172 阅读 · 0 评论