数据结构与算法
文章平均质量分 92
Grace、
这个作者很懒,什么都没留下…
展开
-
Tire树(字典树)
1.1、什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。从根节点到某一节点,路径上经过的字符连接起来,为该节点对应原创 2021-02-04 15:04:52 · 1895 阅读 · 1 评论 -
KMP算法
有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍。但KMP算法真的不适合这样去学。最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉。我试着从这个思路再介绍一下。大家只需要记住一点,PMT是什么东西。然后自己临时推这个算法也是能推出来的,完全不需要死记硬背。KMP算法的核心,是一个被称为部分匹配表(Partial Match Table)的数组。我觉得理解KMP的最大障碍就是很多人在看了很多关于KMP的文章之后,仍然搞不懂PMT中的值代表了什么意转载 2021-02-04 14:49:21 · 411 阅读 · 0 评论 -
Aho-Corasick 多模式匹配算法(AC自动机)
一、概述Aho-Corasick算法是多模式匹配中的经典算法,目前在实际应用中较多。Aho-Corasick算法对应的数据结构是Aho-Corasick自动机,简称AC自动机。搞编程的一般都应该知道自动机FA吧,具体细分为:确定性有限状态自动机(DFA)和非确定性有限状态自动机NFA。普通的自动机不能进行多模式匹配,AC自动机增加了失败转移,转移到已经输入成功的文本的后缀,来实现。在学习AC自动机之前我们必须要学习一下KMP算法和Trie树(字典树)KMP算法:http://www.active原创 2021-02-04 14:34:29 · 2197 阅读 · 0 评论 -
Murmurhash 哈希算法 介绍与实现
最近在项目代码中看到了一种hash算法,以前没有遇见过,在此记录下来。 一、介绍 MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。 由Austin Appleby在2008年发明, 并出现了多个变种,都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。—摘自w...原创 2019-10-31 15:47:05 · 25209 阅读 · 3 评论 -
哈希表
文章目录一、哈希表二、代码实现 一、哈希表 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 记录的存储位置=f(关键字) 这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列...原创 2019-10-31 15:33:47 · 125 阅读 · 0 评论 -
hash函数总结
文章目录一、性能分析二、各类hash函数代码 一、性能分析 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。 常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RS...转载 2019-10-31 15:13:37 · 506 阅读 · 0 评论 -
数据结构及算法基础 之图 (六) 最小生成树
文章目录一、什么是最小生成树二、普里姆算法—Prim算法三、代码实现四、示例测试 一、什么是最小生成树 现在假设有一个很实际的问题:我们要在n个城市中建立一个通信网络,则连通这n个城市需要布置n-1一条通信线路,这个时候我们需要考虑如何在成本最低的情况下建立这个通信网? 于是我们就可以引入连通图来解决我们遇到的问题,n个城市就是图上的n个顶点,然后,边表示两个城...原创 2019-10-31 14:35:39 · 282 阅读 · 0 评论 -
数据结构及算法基础 之图(五) 图的广度优先遍历
文章目录一、广度优先遍历定义二、基本实现思想三、代码实现(以图的存储结构邻接表为例)四、示例测试 一、广度优先遍历定义 图的广度优先遍历BFS算法是一个分层搜索的过程,和树的层序遍历算法类同,它也需要一个队列以保持遍历过的顶点顺序,以便按出队的顺序再去访问这些顶点的邻接顶点。 二、基本实现思想顶点v入队列。当队列非空时则继续执行,否则算法结束。...原创 2019-10-31 14:22:28 · 1903 阅读 · 0 评论 -
数据结构及算法基础 之图(四) 图的深度优先遍历
文章目录一、深度优先遍历的递归定义二、基本实现思想三、示例测试 一、深度优先遍历的递归定义 假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的...原创 2019-10-31 14:07:02 · 900 阅读 · 0 评论 -
数据结构及算法基础 之图(三)十字链表
文章目录一、十字链表二、代码示例 一、十字链表 邻接表在某种程度上是有缺陷的,它表示了出度就表示不了入度。所以出现了十字链表,它既能表示入度也能表示出度。 说通俗点,十字链表也就是邻接表的改进,顶点集包含两个指针,firstIn和firstOut, firstIn指向入边表(逆邻接表), firstOut表示出边表(也就是邻接表)。(需要先理解上面代码中顶点集...原创 2019-10-31 11:32:13 · 486 阅读 · 0 评论 -
数据结构及算法基础 之图(二)邻接表
文章目录一、邻接表二、代码实现 一、邻接表 邻接矩阵看上去是个不错的选择,首先是容易理解,第二是索引和编排都很舒服~但是我们也发现,对于边数相对顶点较少的图,这种结构无疑是存在对存储空间的极大浪费。因此我们可以考虑另外一种存储结构方式,例如把数组与链表结合一起来存储,这种方式在图结构也适用,我们称为邻接表(AdjacencyList)。邻接表的处理方法是这样:...原创 2019-10-31 11:23:24 · 706 阅读 · 0 评论 -
数据结构及算法基础 之图(一)邻接矩阵
文章目录一、图结构介绍二、邻接矩阵三、代码实现 一、图结构介绍图的定义与术语:http://www.360doc.com/content/17/0714/10/17799864_671231489.shtml 二、邻接矩阵 简单理解就是用一个二维矩阵(二维数组)来存储。按照标记来查看此边是否存在。邻接矩阵为每一种情况都做好了空间预存。 适用场景:...原创 2019-10-31 10:24:57 · 531 阅读 · 0 评论 -
二叉搜索树(排序二叉树)
文章目录一、排序二叉树性质二、代码实例三、测试结果 一、排序二叉树性质就是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于其根节点的值。换句话说就是:任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。 二、代码实例tree.h#ifndef __...原创 2019-10-31 10:14:43 · 210 阅读 · 0 评论 -
排序(六) 之堆排序
文章目录一、堆的基本性质二、堆的分类1. 最小堆2. 最大堆3. 堆三、维护堆的性质四、堆排序1. 建堆2. 堆排序操作五、代码示例六、实例测试 一、堆的基本性质 堆也可以说是一个完全二叉树,就是除了最底层的,其它层是满的,既然我们可以用完全二叉树来表示一个堆,那么我们这里就采用数组结构的二叉树来阐述堆的性质。 假设在这里我们用数组A表示堆,A[i]表示堆里面的第...原创 2019-10-30 19:51:58 · 128 阅读 · 0 评论 -
排序(五) 之归并排序
文章目录一、归并排序(Merge Sort)二、算法原理三、代码示例四、实例测试 一、归并排序(Merge Sort) 归并排序是一个相当“稳定”的算法对于其它排序算法,比如希尔排序,快速排序和堆排序而言,这些算法有所谓的最好与最坏情况。而归并排序的时间复杂度是固定的,它是怎么做到的? 二、算法原理 首先来看归并排序要解决的第一个问题:两个有序的数...原创 2019-10-30 19:32:05 · 523 阅读 · 0 评论 -
排序(四) 之快速排序
文章目录一、快速排序二、排序原理三、代码示例四、算法分析五、测试 一、快速排序 快速排序应该时排序算法中最好的一种,看看它的命名都显得那么诚实。快速排序也是我们必须掌握的一种排序算法,因为面试的时候绝大概率是要出现的。 二、排序原理这里假如数据array[10]进行排序首先找个基准元素tmp,一般为第一个数据(tmp = array[0], 最左边 left ...原创 2019-10-30 17:03:16 · 129 阅读 · 0 评论 -
排序(三) 之希尔排序
文章目录一、希尔排序二、代码示例 一、希尔排序 插入排序一个很明显的缺点是插入元素时需要与已经排序的元素进行对比,对比的次数可能会比较多,考虑最坏的情况,如果原始的数组是倒序的,每插入一个元素时都要跟所有已经排好序的元素进行对比,算法的效率很低。 但是如果插入元素时对比的次数较少,能够大大提高算法的效率,希尔排序就是通过将元素数组划分为若干小组,然后对各个小组进行插入排序来减...原创 2019-10-30 16:01:58 · 159 阅读 · 0 评论 -
排序(二) 之直接插入排序
文章目录一、直接插入排序二、代码示例 一、直接插入排序插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素...原创 2019-10-30 14:47:14 · 137 阅读 · 0 评论 -
排序(一) 之冒泡排序
文章目录一、排序的重要性二、冒泡排序 一、排序的重要性 在实际的工作中,我们经常会遇到从大量数据中查找数据的例子。为什么要用排序呢,那肯定是排序给我们带来了极大的好处。 如果数据量只有100条、1000条,那么或许有没有排序感觉不出来,但若是10万条、100条数据,那么你还是用普通查找的话,可能你就得卷铺盖走人了。例如你从十万条数据中找一个数据,你使用普通查找,就必须得从头遍...原创 2019-10-30 14:31:35 · 193 阅读 · 0 评论 -
链表逆转
今天实现了单链表逆转的递归和非递归实现方法,把代码贴出来。代码:#include <stdio.h>#include <stdlib.h>#include <unistd.h> struct node { int v; struct node *next;}; /*非递归逆转*/int reverse(struct nod...原创 2019-10-30 10:50:46 · 127 阅读 · 0 评论 -
数据结构及算法基础 之栈与队列(二)
文章目录一、队列定义二、环形队列代码实例:(也适用于多线程) 一、队列定义 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。与栈相反,队列是一种先进先出(First In First Out, FIFO)的线性表。与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础。 此前我们用浏览器的历史记录作为栈的...原创 2019-10-30 10:43:07 · 144 阅读 · 0 评论 -
数据结构及算法基础 之栈与队列(一)
文章目录一、栈的定义二、代码实例 一、栈的定义 栈是一种重要的线性结构,可以这样讲,栈是前面讲过的线性表的一种具体形式。 就像我们刚才的例子,栈这种后进先出的数据结构应用是非常广泛的。在生活中,例如我们的浏览器,每点击一次“后退”都是退回到最近的一次浏览网页。 例如我们Word,Photoshop等的“撤销”功能也是如此。再例如我们C语言的函数,也是利用栈的基本原理...原创 2019-10-30 10:38:18 · 102 阅读 · 0 评论 -
数据结构与算法基础 之线性表(二)
文章目录前言一、链式线性表二、代码示例三、分析四、对比五、总结 前言 前面我们讲的线性表的顺序存储结构,它最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间。那我们能不能针对这个缺陷或者说遗憾提出解决的方法呢?要解决这个问题,我们就得考虑一下导致这个问题的原因! 为什么当插入和删除时,就要移动大量的元素?原因就在于相邻两元素的存储位置也具有邻居关系...原创 2019-10-30 10:29:42 · 123 阅读 · 0 评论 -
数据结构与算法基础 之线性表(一)
文章目录前言一、顺序线性表二、代码实例三、分析四、总结 前言 线性表有两种物理存储结构:顺序存储结构和链式存储结构,现在了解一下顺序存储结构。 一、顺序线性表线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。顺序存储结构封装需要三个属性:存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置。线性...原创 2019-10-30 10:14:54 · 393 阅读 · 0 评论