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