数据结构
文章平均质量分 92
lwj~
这个作者很懒,什么都没留下…
展开
-
数据结构--排序
冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序排序的三大指标1.排序算法的执行效率 - 最好情况、最坏情况、平均情况时间复杂度 - 时间复杂度的系数、常数 、低阶 - 比较次数和交换(或移动)次数2.排序算法的内存消耗原地排序(Sorted in place)。原地排序算法,就是特指空间复杂度是 O(1) 的排序算法3.排序算法的稳定性...原创 2019-10-25 21:03:51 · 172 阅读 · 0 评论 -
数据结构--递归
递归需要满足的3个条件一个问题的解可以分解成几个子问题的解这个问题的分解之后的子问题,除了数据规模不同,求解思路完全一样存在递归终止条件如何编写递推代码大问题分解小问题,写递推公式,找到终止条件警惕堆栈溢出,每次调用函数,都会将临时变量封装成栈帧压入内存栈,等函数执行完成返回,出栈。如果递归数据规模大,调用层次很深,一直压栈,就会有堆栈溢出的风险。优、缺点相比非递归,递归...原创 2019-10-14 11:40:06 · 95 阅读 · 0 评论 -
数据结构 -- 栈
栈,一种先进后出,后进先出,只允许头结点一端插入和删除的数据结构复杂度O(1)空间复杂度:入栈和出栈只需一两个临时变量存储空间,所以空间复杂度O(1)存储数据需要一个大小为n的数组,并不是说空间复杂度就是O(n),因为n个空间是必须的,无法省掉。所以空间复杂度,是指除了原本的数据存储空间外,算法运行还需要的额外的存储空间时间复杂度:只在栈顶操作,出栈不会涉及内存的重新申请和数据搬移...原创 2019-10-07 15:38:50 · 1459 阅读 · 0 评论 -
数据结构——链表
链表是一种线性表数据结构,它用一组不需要连续的内存空间;三种常见的链表结构单链表、双向链表、循环链表单链表链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的"结点"。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点地址 next指针。头结点用来记录链表的基地址,可以用来遍历整条链表尾指针:不是指向下一个结点,而是指向一个空地址...原创 2019-10-06 17:06:11 · 246 阅读 · 0 评论 -
数据结构--数组
数组数组是一种线性表数据结构,它用一组连续的内存空间存储相同类型的数据;三种常见的链表结构 :随机访问。数组数组是一种线性表数据结构,它用一组连续的内存空间存储相同类型的数据;特性:随机访问缺点:插入和删除,需要做大量的数据搬移工作;优点:查找序吕高效时间复杂度:查找:根据小标随机访问,时间复杂度为O(1)插入和删除:在数组末尾操作时,时间复杂度为O(1),在数组开...原创 2019-10-04 14:29:03 · 170 阅读 · 0 评论 -
AC自动机算法
AC自动机算法,全称是Aho-Corasick算法。Trie树跟AC自动机之间的关系,就像单串匹配中朴素的串匹配算法,跟KMP算法之间的关系一样,只不过前者针对的是多模式串而已。AC自动机实际上就是Trie树之上,加了类似KMP的next数组,只不过此处多的next数组是构建在树上罢了。AC自动机的构建,包含两个操作:(1):将多个模式串构建成Trie树;(2):在Trie树上构建失败指针...原创 2020-02-02 22:59:07 · 489 阅读 · 0 评论 -
Trie树
Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。通过一个下标与字符一一映射的数组,来存储子节点的指针构建好 Trie 树后,在其中查找字符串的时间复杂度是 O(k),k 表示要查找的字符串的长度。...原创 2020-01-30 23:30:30 · 99 阅读 · 0 评论 -
字符串匹配,BM 算法
BM 算法包含两部分,分别是坏字符规则(bad character rule)和好后缀规则(good suffix shift)。1.坏字符规则按照模式串下标从大到小的顺序,倒着匹配的。没有匹配的字符叫作坏字符(主串中的字符)。拿坏字符 c 在模式串中查找,发现模式串中并不存在这个字符,可以将模式串直接往后滑动三位,再从模式串的末尾字符开始比较。这个时候,坏字符 a 在模式串中是存在...原创 2020-01-28 20:26:59 · 229 阅读 · 0 评论 -
字符串匹配 — BF,RK算法
BF 算法,暴力匹配算法,每次往后移一位RK 算法,通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了(这里先不考虑哈希冲突的问题)。因为哈希值是一个数字,数字之间比较是否相等是非常快速的。但是需要遍历子串中的每个字符,算法整体的效率并没有提高提高哈希算法二十六进制来表示一个字符串:把...原创 2020-01-28 16:42:20 · 209 阅读 · 0 评论 -
深搜和广搜
图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,最“暴力”的深度优先、广度优先搜索,还有 A*、IDA* 等启发式搜索算法。图有两种主要存储方法,邻接表和邻接矩阵。今天我会用邻接表来存储图。...原创 2020-01-27 18:15:54 · 155 阅读 · 0 评论 -
堆的应用
堆的应用一:优先队列有点队列具体使用:1. 合并有序小文件1).假设我们有 100 个小文件,每个文件的大小是 100MB,每个文件中存储的都是有序的字符串。我们希望将这些 100 个小文件合并成一个有序的大文件。这里就会用到优先级队列。2).整体思路有点像归并排序中的合并函数。我们从这 100 个文件中,各取第一个字符串,放入数组中,然后比较大小,把最小的那个字符串放入合并后的大文件中,...原创 2019-12-04 17:13:42 · 1075 阅读 · 0 评论 -
堆和堆排序
堆排序是原地排序、时间复杂度O(nlogn)、不稳定1.性质:堆是一个完全二叉树任何节点的值都大于等于(或小于等于)子树节点的值2.特点每个节点的值都大于等于(或小于等于)其子树节点的值。因此,堆被分成了两类,大顶堆和小顶堆。3.大顶堆的操作1.插入一个元素把新插入的数据放到数组的最后,从下往上的堆化方法,让新插入的节点与父节点对比大小。如果不满足子节点小于等于父节点的大小关系...原创 2019-12-03 15:51:24 · 413 阅读 · 0 评论 -
红黑树的特点
平衡二叉查找是解决普通二叉查找树在频繁的插入、删除等动态更新的情况下,出现时间复杂度退化的问题。红黑树是一颗平衡二叉查找树(高度差不能大于1),通过旋转和染色满足平衡性质:每个节点非黑即红根节点是黑色叶子节点黑色(NIL),叶子节点不存储数据红色节点2个子节点为黑色每个节点的节点到达其叶子节点黑色节点数相等红黑树的高度分析首先把红色节点都去掉,二叉树变成了四叉树。红黑树种黑色...原创 2019-11-30 17:33:24 · 599 阅读 · 0 评论 -
二叉树
非线性排序完全二叉树 - 二叉树2种存储方法:基于链式,数组链式存储法:三个节点,一个存储数据,另外2个存储左右节点指针,基于数组的顺序存储法,根节点存储在下标 i = 1 的位置,那左子节点 2 * i = 2 的,右子节点存储在 2 * i + 1 = 3 。以此类推完全二叉树,仅仅“浪费”了一个下标为 0 的存储位置。如果是非完全二叉树,其实会浪费比较多的数组存储空间。例...原创 2019-11-30 13:55:04 · 373 阅读 · 0 评论 -
哈希算法
哈希算法(上):如何防止数据库中的用户信息被脱库?1.什么是哈希算法1).任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。2).设计哈希算法满足的几点要求:从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同;散列冲...原创 2019-11-10 19:00:50 · 1679 阅读 · 0 评论 -
散列表
散列表用的是数组支持按照下标随机访问数据的特征,所以散列表其实就是数组一种扩展,。通过散列函数吧元素的键值映射为下标。散列函数散列函数设计的基本要求:1.散列函数计算得到的散列值是一个非负数2.如果key1 = key2,那hash(key1) == hash(key2)3.如果key1 != key2,那hash(key1) != hash(key2)第三点在真实的情况下,要想找...原创 2019-11-02 16:22:32 · 293 阅读 · 0 评论 -
跳表
跳表是。链表加多级索引的结构,动态数据结构,可以支持快速的插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树Redis 中的有序集合(Sorted Set)就是用跳表来实现的每两个结点就抽出一个结点到第二级索引。现在我们再来查找 16,只需要遍历 6 个结点了调表查询效率那第一级索引的结点个数大约就是 n/2,第二级索引的结点个数大约就是 n/4,第三级索引的结点个数大约就是 ...原创 2019-10-31 22:41:47 · 198 阅读 · 0 评论 -
二分查找
二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。时间复杂度:O(log(n))假设数据大小为n,每次查找数据范围缩小一半,最坏情况缩小到空才停止。得出等比数列:n/2^k = 1, k就是缩小的次数,时间复杂度O(k),通过n/2^ k = 1,得k = log2n,所以...原创 2019-10-30 23:46:39 · 179 阅读 · 0 评论 -
qsort()高性能排序函数
qsort() 函数举例qsort() 会优先使用归并排序来排序输入数据,因为归并排序的空间复杂度是 O(n),所以对于小数据量的排序,比如 1KB、2KB 等,归并排序额外需要 1KB、2KB 的内存空间,这个问题不大。用空间换时间的技巧。但如果数据量太大,排序 100MB 的数据,这个时候我们再用归并排序就不合适了。所以,要排序的数据量比较大的时候,qsort() 会改为用快速排序算法来排...原创 2019-10-30 21:27:13 · 2175 阅读 · 0 评论 -
数据结构--队列
具有先进先出的特性,只支持入队和出队操作的数据结构顺序队列,链式队列,循环队列,阻塞队列和并发队列顺序队列需要一个head指向队头的指针和tail指向队尾的指针,随着不停地进行入队、出队操作,head 和 tail 都会持续往后移动队满的判断条件是 tail == n,队空的判断条件是head == tail当 tail 移动到最右边,即使数组中还有空闲空间(数据的删除导致数组数...原创 2019-10-13 23:48:12 · 218 阅读 · 0 评论