
数据结构与算法
lianghe77
研二菜鸡的成长之路
展开
-
数据结构——动态规划
数据结构与算法(十九):动态规划最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。动态规划适合用于求解最优问题,比如求最大值、最小值等。它可以显著地降低时间复杂度,提高执行效率。0-1背包问题对于一组不同重量、不可分割的物品,需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值为多少?如果用回溯...原创 2019-12-19 10:14:28 · 1696 阅读 · 0 评论 -
数据结构——回溯算法
最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。回溯的处理思想,有点类似于枚举搜索——枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程分为多个阶段。每个阶段,我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通时,就回退到上一个岔路口,另选一种走法继续走。以八皇后...原创 2019-12-13 20:20:17 · 620 阅读 · 0 评论 -
数据结构——分治算法
最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。分治算法的核心是分而治之,将原问题划分为n个规模较小,且结构与原问题相似的子问题,递归地解决了这些子问题,然后合并其结果,得到原问题的解。分治算法一般都比较适合用递归来实现,每一层递归都会涉及这样三个操作:1、分解:将原问题分解成一系列子问题。2、解决:递归地求解各个子问题...原创 2019-12-13 11:20:03 · 1421 阅读 · 0 评论 -
数据结构——贪心算法
最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。首先来看一个例子,假设我们有一个可以容纳100kg物品的背包为了使背包中所装物体的总价值最大,如何选择在背包中装哪些豆子?这个问题的解决是将单价从高到低排列,它的本质借助的是贪心算法。总结一下贪心算法解决问题:第一步,当我们看到这类问题时,首先要联想到贪心算法。针对一组数...原创 2019-12-12 16:56:25 · 2318 阅读 · 0 评论 -
数据结构——字符串匹配基础
字符串匹配基础字符串匹配算法有很多,首先讲一下BF算法和RK算法。RK算法是BF算法的改进,借助了前面讲的哈希算法来实现高效字符串匹配。BF算法BF算法是Brute Force的缩写,中文叫作暴力匹配法,也叫朴素匹配算法。首先要了解主串和模式串的概念。比如我们在字符串A中查找字符串B,则A为主串,B为模式串。若主串长度为n,模式串长度为m,则n>m。BF算法作为最简单、最暴力的字符串...原创 2019-12-07 22:34:12 · 417 阅读 · 0 评论 -
数据结构——图
最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。涉及图的算法有很多,比如图的搜索、最短路径、最小生成树、二分图等。图是一种非线性数据结构。树的元素称为节点,图的元素称为顶点。图中的顶点可以与任何其他顶点建立连接关系。这种关系称为边。顶点相连接的边的条数称为顶点的度。实际上,边还有方向的概念。我们把有方向的图称为“有向图”...原创 2019-11-30 20:58:41 · 334 阅读 · 0 评论 -
数据结构——堆与堆排序
最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。堆是一种特殊的树,只要满足以下两点,它就是一个堆:一、堆是一个完全二叉树二、堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。对于每个节点的值都大于等于子树中每个节点值的堆,叫作“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,叫作“小顶堆”。...原创 2019-11-28 16:29:17 · 587 阅读 · 0 评论 -
数据结构——二叉树
数据结构与算法(十二):二叉树树是一种非线性表结构。树这种数据结构比线性表的数据结构要复杂得多。树中的每个元素叫做“节点”,用来连线相邻节点之间的关系,叫做“父子关系”。如上图,A节点是B节点的父节点,B节点是A节点的子节点。B、C、D这三个节点的父节点是同一个节点。因此,它们互称兄弟节点。把没有父节点的节点叫做根节点,也就是图中的节点E。将没有子节点的节点叫做叶子节点或叶节点,其中G、H、...原创 2019-11-18 11:27:40 · 299 阅读 · 0 评论 -
数据结构——哈希算法
哈希算法的定义是将任意长度的二进制值串映射为固定长度的二进制值串。这个映射规则就是哈希算法。通过原始数据映射后得到的二进制值串就是哈希值。设计一个优秀的哈希算法应满足几点要求:1.从哈希值不能反向推导出原始数据(因此哈希算法也叫单向哈希算法)。2.对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的哈希值也大不相同。3.散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非...原创 2019-11-13 20:53:24 · 1444 阅读 · 0 评论 -
数据结构——散列表(Hash Table)
散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。举个例子,运动员参加学校运动会,每个运动员有自己的编号。希望实现一个功能通过编号快速找到对应的选手信息,我们可以把这些运动员信息放在数组里,编号为k的选手放在数组中下标为k的位置。这个例子已经用到了散列表的思想。参赛编号与数组的下标形成一一映射,所以利用数值支持根据下标随机访问的时候,时间复杂度为O...原创 2019-11-12 14:58:41 · 745 阅读 · 0 评论 -
数据结构——跳表
最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。二分查找只适用于数组,但当数据存储在链表时,我们只需要对链表稍加修改就可以支持“二分”的查找算法。我们将改造后的数据结构称为跳表。跳表是一种各方面性能都比较优秀的动态数据结构,可以支持快速的插入,删除和查找操作,甚至可以代替红黑树。对于一个单链表而言,即使链表中存储的数据是有...原创 2019-11-08 16:06:34 · 474 阅读 · 0 评论 -
数据结构——二分查找(python实现)
最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。课前问题:假设有1000万个整数数据,每个数据占8个字节,如何设计数据结构与算法,快速判断某个整数是否出现在这1000万数据中,同时又希望这个功能内存不要超过100M?这个问题就引入了二分查找,举个例子来理解二分查找:假设一个数组为0-99,要查找元素23在数组中的位置...原创 2019-11-07 17:04:28 · 836 阅读 · 0 评论 -
数据结构——排序(python实现)
数据结构与算法(七):排序最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。最常见的排序方法有:冒泡排序、插入排序、选择排序、快速排序、计数排序、基数排序、桶排序等。按时间复杂度将其分为:排序算法时间复杂度是否基于比较冒泡、插入、选择O(n2n^2n2)√快排、归并O(nlognnlognn...原创 2019-10-31 15:36:40 · 955 阅读 · 0 评论 -
数据结构——递归
数据结构与算法(六):递归最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。基本上所有的递归问题都可以用递推公式来表示。以寻找电影排数为例,只需要问前一排人的排数,然后前一排的人再向前询问······用递推公式...原创 2019-10-26 19:57:47 · 567 阅读 · 0 评论 -
数据结构——队列
数据结构与算法(五):队列最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。队列跟栈一样,也是一种操作受限的线性表数据结构(如下图所示),其满足先进者先出。队列最基本的操作时入队enqueue(),即放一个数据到队列尾部;出队dequeue(),从队列头部取一个元素。和栈一样,队列可以用数组来实现,也可以通过链表来实现。用...原创 2019-10-25 15:37:56 · 348 阅读 · 0 评论 -
数据结构——栈
数据结构与算法(四):栈最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。栈可以看作是一种“操作受限”的线性表,当某个数据只涉及在一端插入和删除数据,并满足后进先出,先进后出的特性,应首选“栈”这种数据结构。如下图:**用数组实现的栈,叫做顺序栈,用链表实现的栈,叫做链式栈。**不管是顺序栈还是链式栈,存储数据只需要一个大...原创 2019-10-21 22:17:43 · 669 阅读 · 0 评论 -
数据结构——链表
数据结构与算法(三):链表最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。与数组需要一块连续的内存空间来存储不同,链表通过“指针”将一组零散的内存块串联起来。常见的链表结构有:单链表,双向链表以及循环链表。一、单链表链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的结点。为了将所有的结点串起来,每个链...原创 2019-10-19 10:45:59 · 533 阅读 · 0 评论 -
数据结构——数组
数据结构与算法(二):数组最近开始学习王争老师的《数据结构与算法之美》,通过总结再加上自己的思考的形式记录这门课程,文章主要作为学习历程的记录。一、如何实现随机访问数组是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。(对这句话进行解释,引出了以下几个概念)1.线性表:数组,队列,栈,链表 非线性表:数和图2.连续的内存空间和相同类型的数据 ...原创 2019-10-15 11:28:18 · 390 阅读 · 0 评论 -
数据结构——复杂度分析
数据结构与算法(一):复杂度分析最近开始学习王争老师的《数据结构与算法之美》,文章主要作为学习历程的记录。广义来说,数据结构是指一组数据的存储结构,算法则是操作数据的一组方法。算法复杂度分为时间复杂度和空间复杂度,在计算算法复杂度时一般用到大O符号。一、时间复杂度 所有代码执行时间T(n)=O(f(n)),其中f(n)表示每行代码执行的次数总和,O表示T(n)与f(n)表达式成正比,...原创 2019-10-14 11:16:01 · 657 阅读 · 0 评论