![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
lukeyyanghang
这个作者很懒,什么都没留下…
展开
-
归并排序和快速排序
归并排序归并排序采用了一种思想,就是分治思想。分治思想,顾名思义,分而治之。最典型的应用就是归并排序和mapReduce框架。 在归并排序中,一个数组取下标中点的数字对应的值。将数组分成两部分。重复上述这个动作,直到每一小块至多只有2个数字。然后再做对比。以上称为分解过程。下述为合并merge过程。合并的过程呢就是两个小的数据集。依次比较。第1位比较另一个数...原创 2019-01-24 13:52:44 · 2324 阅读 · 0 评论 -
链表
什么是链表?链表是在内存上不连续的,通过另外保存指针来描述结点地址的,以空间换时间的一种数据结构。这种内存上不连续的数据结构对缓存不友好。大体可以分为3种类型:单链表,循环链表和双向链表。 单链表单链表,顾名思义,只有一条链。以头结点和尾节点特殊。头结点记录链表的基地址,尾节点的指针指向空地址NULL。由于并没有连续地址的特性,不能够按照寻址公式的方式进行随机读取,只能...原创 2019-01-22 23:05:34 · 144 阅读 · 0 评论 -
队列
什么是队列?我们把“先进先出,后进后出的”线性表称为队列。 顺序队列和链式队列队列是一种抽象数据结构。根据底层数据结构可以把他分成顺序队列(数组)和链式队列(链表)两类。根据数组和链表的特性,我们可以得到如下结论:1.顺序队列的大小一开始写死了,如果超出的,需要动态扩容,就是数组里的copy操作。2.链式队列没有长度限制,但是太多的请求会导致响应时间太长,不适合响应时间...原创 2019-01-22 22:45:58 · 195 阅读 · 0 评论 -
分治算法
什么是分治算法?顾名思义,分治算法就是分而治之,也就是将原问题划分成n个规模较小的,并且结构与原问题相似的子问题,递归的解决这些子问题,然后再合并其结果,就得到原问题的解。 分治算法是一种处理问题的思想,递归是一种编程技巧。 分治算法的递归操作1.分解2.解决3.合并 举个例子,归并排序 分治算法的条件1.原问题与分解成的小问题具有相同的模式...原创 2019-01-28 14:55:41 · 348 阅读 · 0 评论 -
动态规划
什么是动态规划?动态规划的本质,是对问题状态的定义和状态转移方程的定义。动态规划是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推的方式去解决 如何理解动态规划?还是以0-1背包为例,假设有5个物品,物品重量分别为2,2,4,6,3我们约定,有函数f(i,cw),i表示将要决策第几个物品是否装入背包,cw表示当前背包中物品的总重量。比如,f(2,2)表示我们将...原创 2019-01-28 14:53:55 · 653 阅读 · 0 评论 -
深度优先搜索和广度优先搜索
图的搜索算法图的搜索算法是基于数据以图为存储结构的搜索算法,有很多。比如说,深度优先搜索算法和广度优先搜索算法,还有A*、IDA*等启发式搜索算法。广度优先搜索(Breadth-First-Search)简单来说就是地毯式搜索。专业一点,就是以一个顶点出发,以度为1遍历他连接的所有顶点。然后度依次增加,直到终止顶点。以下图为例,起始顶点为S,终止顶点为t,度从1开始依次增加...原创 2019-02-01 11:05:41 · 554 阅读 · 0 评论 -
字符串匹配算法
引入概念主串和模式串 假设主串长度为n,模式串长度为m BF算法(Brute Force)就是遍历,时间复杂度O(n*m) RK算法哈希之后遍历,比数字比比字符串要快。时间复杂度是O(n)。比完数字之后再比一下字符串可以避免散列冲突。(极端情况下是O(n*m),哈希值全部都一样) BM算法通过上面的算法,我们知道字符串匹配,其实就是模式串在主串上...原创 2019-02-01 11:03:20 · 522 阅读 · 0 评论 -
二分查找
什么是二分查找?二分查找是一种快速查找算法。时间复杂度为O(logn)。他要求数据集为一个有序数据集。 二分查找应用场景的局限性依赖顺序表(必须有序)结构,简单来说就是数组。其次由二分查找的查找方式(随即查找)可以得出,链表并不能作为二分查找的数据结构。数据量不能太小。当数据量太小的时候,二分查找还不如遍历。数据量不能太大。由于数组的缘故,由数组的特性可知,他需要内存中...原创 2019-01-27 09:18:01 · 507 阅读 · 0 评论 -
跳表
什么是跳表?跳表是一个相对于链表来说的高级动态数据结构。在一个有序的链表当中,以一定的规则(比如说3个数字建立一个索引)建立索引,依次建立。最高的索引层只有2个索引。时间复杂度是O(logn),十分高效。基本思想就是以空间换时间,建立索引。在大规模软件开发中,这个额外的空间相对于数据的大小可以忽略。 如何插入?插入跳表一个比较恶心的东西就是需要更新索引。更新索引的方...原创 2019-01-27 09:16:56 · 157 阅读 · 0 评论 -
红黑树
什么是红黑树?为了解决二叉查找树多次插入新节点而导致的不平衡,我们发明了红黑树(Red-Black Tree,R-B Tree)。红黑树是一种自平衡的二叉查找树。 时间复杂度O(logn) 红黑树的特性(根据特性来进行自平衡,其实就是规则)1.每个节点或者是黑色,或者是红色2.根节点是黑色3.每个叶子节点(NIL)是黑色。(这里叶子节点,是指为空的叶子节点)...原创 2019-01-27 09:16:12 · 151 阅读 · 0 评论 -
数组
什么是数组?数组是一种线性表。他用一组连续的内存空间,来存储一组具有相同类型的数据。借助CPU的缓存机制,数组中的数据被预读。CPU每次从内存中读取数据的时候不是按照内存地址,还是读取一个数据块并保存到缓存当中。所以读取数组某个下标数据的时候也会将下标附近的数据读到缓存当中。这样就实现了比内存访问速度更快的机制。 数组的查询和存储?数组可以通过下标进行随机读取。数据根据二分...原创 2019-01-22 09:53:06 · 116 阅读 · 0 评论 -
栈
什么是栈?栈是一个“后进先出,先进后出”的线性表。如果某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。 栈的类型栈并不是一个底层的数据结构,它是一个抽象的数据结构。根据构成栈的数据结构可以把栈分为顺序栈(数组构成)和链式栈(链表)。在初始化栈的时候必须指定栈的大小。以此我们可以得出栈的空间复杂度是O(1),根据定义,可...原创 2019-01-21 21:48:48 · 114 阅读 · 0 评论 -
数据结构与算法
数据结构解决存储数据的问题,算法解决如何使用数据的问题。本人博客数据结构与算法的文章均来自于极客时间上数据结构与算法的专栏课的总结,如果想要更加详细的学习可以去那儿(非广告)。...转载 2019-01-21 21:46:49 · 81 阅读 · 0 评论 -
时间复杂度
基础:所有代码的执行时间与每行代码的执行次数n成正比。 大O时间复杂度表示代码执行时间随数据规模增长的变化趋势。 1.关注时间复杂度只需要关注循环次数最多的那一段代码。 2.总复杂度等于量级最大的那段代码的复杂度。 3.嵌套代码的复杂度等于嵌套内外代码复杂度的乘积。 最好时间复杂度,最坏时间复杂度,平均时间复杂度,均摊时间复杂度 ...原创 2019-01-21 21:46:23 · 93 阅读 · 0 评论 -
哈希算法
什么是哈希算法?将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。而通过原始数据映射之后得到的二进制串就是哈希值。 哈希算法的要求1.单向。不能从哈希值反推原始数据2.对输入数据敏感。哪怕是一个bit,输出也要不一样3.散列冲突概率小 ----- 鸽巢问题引起的4.高效 哈希算法的应用安全加密、数据校验、唯一标识、散列函...原创 2019-01-24 18:25:43 · 185 阅读 · 0 评论 -
散列表
什么是散列表?散列表也被称“Hash Table”,我们称之为“哈希表”或者“Hash表”。散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,没有数组,就没有散列表。 最简单的散列表最简单的散列表就是key对应数组的下标,value就是数组下标内的元素值。 我们把key到value的这个过程赋予一个函数,称为散列函数。...原创 2019-01-24 18:21:51 · 529 阅读 · 0 评论 -
桶排序、计数排序和基数排序
什么是线性排序?我们把时间复杂度为O(n)的排序算法,称为线性排序。意思是,排序时间和排序个数成正比。 桶排序桶排序就是说,我把n个数,分为m个桶,每个桶里k个数,k = n/m。桶的大小顺序已经定义好了。然后把桶区间里的数字扔到桶里。最后进行桶内快速排序。所以桶的时间复杂度是O(m*k*log(n/m)),又因为k = n/m,所以O(n*log(n/m))所以当n无限接...原创 2019-01-24 13:56:10 · 186 阅读 · 0 评论 -
冒泡排序、插入排序、选择排序
什么是排序?这个就不说了如何评价排序?我们规定下定义一个排序算法好坏的维度。1.执行效率这里对于效率的概念可以分为两部分,一部分是执行时间,另一部分就是比较和交换的次数(也可以归结到时间里去)。时间其实就是时间复杂度,很好理解,就是时间复杂度越小的算法,我们认为越好。 比较和交换的次数我们后续会引入一个概念叫做有序度和逆序度。这个有序度逆序度是一个对的概念。...原创 2019-01-23 15:45:02 · 96 阅读 · 0 评论