
数据结构和算法
数据结构
車輪の唄
atarik@163.com
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
堆排序
堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:同时,我们对堆中的结点按层进行编号,将这种逻辑结...原创 2018-06-10 19:06:03 · 274 阅读 · 0 评论 -
234树到红黑树
2-3-4 树1. 2-3-4树的定义2-3-4树是一种阶为4的B树。它是一种自平衡的数据结构,可以保证在O(lgn)的时间内完成查找、插入和删除操作。它主要满足以下性质:(1)每个节点每个节点有1、2或3个key,分别称为2(孩子)节点,3(孩子)节点,4(孩子)节点。(2)所有叶子节点到根节点的长度一致(也就是说叶子节点都在同一层)。(3)每个节点的key从左到右保持了从小...原创 2019-01-15 22:51:56 · 7400 阅读 · 4 评论 -
b树与b+树
https://blog.youkuaiyun.com/z_ryan/article/details/79685072引言 我们都知道二叉查找树的查找的时间复杂度是O(log N),其查找效率已经足够高了,那为什么还有B树和B+树的出现呢?难道它两的时间复杂度比二叉查找树还小吗? 答案当然不是,B树和B+树的出现是因为另外一个问题,那就是磁盘IO;众所周知,IO操作的效率很低,那么,当在大量数据...原创 2019-01-15 23:05:58 · 187 阅读 · 0 评论 -
b树与b+树--2
维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文...原创 2019-01-15 23:14:57 · 453 阅读 · 0 评论 -
有向图中的可达性(深度优先)
单点可达:给定一副有向图和一个起点s,求是否存在一条从s到v的路径。 多点可达:给定一幅有向图和一个节点的集合,求是否存在一条从集合中的任意顶点到给定顶点的有向路径。 有向图的可达性API: public class DirectedDFS DirectedDFS(Digraph G,int s) 在G中找到从s可到达的所有顶点 DirectedDFS(Digraph G,Iterabl...原创 2019-01-22 17:00:12 · 917 阅读 · 0 评论 -
有向图及拓扑排序
有向图在无向图中,边没有方向,两条边之间的顶点是单向可达的,而有向图的边是单向的。虽然边的性质不同,但我们仍然可以用邻接表来表示有向图。对有向图的结构定义如下:#include <map>#include <forward_list> using namespace std; struct DirectedGraph{ size_t V, E; ...原创 2019-01-22 18:21:29 · 553 阅读 · 0 评论 -
最短路径算法--Dijkstra
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止Dijkstra最短路径算法是一种单源最短路径,针对的是非负权边。所谓单源最短路径就是指定一个出发顶点,计算从该源顶点出发到其他所有顶点的最短路径。基本思想 通过Dijkstra计算图G中的最短路径时,需要指...原创 2018-06-23 23:09:08 · 929 阅读 · 0 评论 -
LZ4编码
LZ4LZ4是一种无损数据压缩算法,着重于压缩和解压的速度,并且应用广泛。在Hadoop、Linux内核、文件系统都有应用,而在Lucene中,则是使用LZ4对倒排表的数据以及词向量(termVector)进行压缩存储。在本篇文章中,介绍LZ4Fast的压缩逻辑在Lucene中的Java实现。两种实现Lucene中提供了两种LZ4的算法实现,分别是LZ4Fast跟LZ4High:L...原创 2019-03-20 14:33:55 · 1777 阅读 · 1 评论 -
去重编码
去重编码(dedupAndEncode)去重编码是Lucene中对int类型数据的一种压缩存储方式,在FacetsConfig类中用到此方法来处理int类型数据。其优点在于,存储一个原本需要固定4个字节空间大小的int类型的数据,最好的情况下只要1个字节,最差的情况下需要5个字节。处理过程去重编码的过程主要分三步: 排序 去重 差值存储 关系图根据in...原创 2019-03-20 15:05:24 · 520 阅读 · 0 评论 -
BulkOperationPacked编码
BulkOperationPackedBulkOperation类的子类BulkOperationPacked,他提供了很多对整数(integers)的压缩存储方法,其压缩存储过程其实就是对数据进行编码,将每一个整数(long或者int)编码为固定大小进行存储,大小取决于最大的那个值所需要的bit位个数。优点是极大的减少了存储空间,并且对编码后的数据能够提供随机访问的功能。例如有以下的数...原创 2019-03-20 15:07:37 · 455 阅读 · 0 评论 -
BitMap算法及其在lucene中的应用
bitmap应用场景有一个无序有界int数组{1,2,5,7},初步估计占用内存44=16字节,这倒是没什么奇怪的;但是假如有10亿个这样的数呢,10亿4/(102410241024)=3.72G左右。如果这样的一个大的数据做查找和排序,那估计内存也崩溃了,有人说,这些数据可以不用一次性加载,那就是要存盘了,存盘必然消耗IO。如果用BitMap思想来解决的话,就好很多。一个byte是占8个...原创 2019-03-31 16:08:42 · 694 阅读 · 1 评论 -
hanlp中的AhoCorasickDoubleArrayTrie
点击打开链接原创 2018-06-27 14:02:49 · 1885 阅读 · 0 评论 -
理解Aho-Corasick自动机算法
1.版权说明商业转载请联系作者获得授权,非商业转载请注明出处。本文作者:Q-WHai发表日期: 2015年10月24日本文链接:http://blog.youkuaiyun.com/lemon_tree12138/article/details/49335051来源:优快云更多内容:分类 >> 算法与数学2.概述Aho-Corasick automaton(后面心均以A...原创 2018-06-25 11:14:58 · 420 阅读 · 0 评论 -
算法的时间复杂度
用O( )来体现算法时间复杂度的记法,我们称之为大O表示法。算法复杂度可以从最理想情况、平均情况和最坏情况三个角度来评估,由于平均情况大多和最坏情况持平,而且评估最坏情况也可以避免后顾之忧,因此一般情况下,我们设计算法时都要直接估算最坏情况的复杂度。大O表示法O(f(n)中的f(n)的值可以为1、n、logn、n²等,因此我们可以将O(1)、O(n)、O(logn)、O(n²)分别可以称为常数...原创 2018-10-23 12:24:49 · 283 阅读 · 0 评论 -
Double Array Trie(一)
DoubleArrayTrie实现 Tire树终究是一颗树形结构,树形结构的两个重要要素便是前驱和后继,把Tire树压缩到双数组中,只需要保持能查询到每个节点的前驱和后继即可。Tire树中几个重要的概念。STATE:状态,实际为在数组中的下标CODE : 状态转移值,实际为转移字符的 ASCII码, java中使用(int)(char c)和(char)(int i)互相转BASE ...原创 2018-10-17 15:32:31 · 724 阅读 · 0 评论 -
Double Array Trie(二)
https://segmentfault.com/a/1190000008877595https://blog.youkuaiyun.com/sinat_35261315/article/details/72510252Trie 树是一种以信息换时间的数据结构,其查询的复杂度为O(m)Trie可以实现状态转移和输出的功能, 和fst有何区别???Trie 的单数组实现能够达到最佳的性能,...原创 2018-10-16 22:07:45 · 443 阅读 · 0 评论 -
hashmap实现原理
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存、取value。下面就来分析HashMap的存取。一、定义 HashMap实现了Map接口,继承Ab...原创 2017-01-09 11:38:03 · 447 阅读 · 0 评论 -
排序算法
0、算法概述 0.1 算法分类十种常见排序算法可以分为两大类:非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。 0.2 算法复杂度 ...原创 2018-10-11 09:24:39 · 161 阅读 · 0 评论 -
快速排序基本思路
快速排序的基本思想是 1、先从数列中取出一个数作为基准数 2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边 3、再对左右区间重复第二步,直到各区间只有一个数概括来说为 挖坑填数+分治法下面举例来进行说明,主要有三个参数,i为区间的开始地址,j为区间的结束地址,X为当前的开始的值第一步,i=0,j=9,X=210 1...原创 2018-10-11 11:24:45 · 3143 阅读 · 1 评论 -
kmp算法
一:背景 给定一个主字符串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,即串的模式匹配问题。今天来介绍解决这一问题的常用算法之一,Knuth-Morris-Pratt 算法(简称 KMP),这个算法是由高德纳(Donald Ervin Knuth)和沃恩·普拉特在1974年构思,同年詹姆斯·H·莫里斯也独立地设计出该算法,最终由三人于1977年联合发表。 ...原创 2018-06-27 13:36:08 · 291 阅读 · 0 评论 -
AC自动机
kmp+trie = ac自动机Aho-Corasick算法是多模式匹配中的经典算法,目前在实际应用中较多。Aho-Corasick算法对应的数据结构是Aho-Corasick自动机,简称AC自动机。搞编程的一般都应该知道自动机FA吧,具体细分为:确定性有限状态自动机(DFA)和非确定性有限状态自动机NFA。普通的自动机不能进行多模式匹配,AC自动机增加了失败转移,转移到已经输入成功的...原创 2018-10-22 11:27:04 · 355 阅读 · 0 评论 -
布隆过滤器
问题假设你现在要处理这样一个问题,你有一个网站并且拥有很多访客,每当有用户访问时,你想知道这个ip是不是第一次访问你的网站。这是一个很常见的场景,为了完成这个功能,你很容易就会想到下面这个解决方案:把访客的ip存进一个hash表中,每当有新的访客到来时,先检查哈希表中是否有改访客的ip,如果有则说明该访客在黑名单中。你还知道,hash表的存取时间复杂度都是O(1),效率很高,因此你对你的方案...原创 2019-07-26 12:05:09 · 707 阅读 · 0 评论