算法与数据结构
文章平均质量分 83
今朝一九九三
这个作者很懒,什么都没留下…
展开
-
搜索引擎:倒排索引
搜索引擎通常检索的场景是:给定几个关键词,找出包含关键词的文档。那么如何快速找到包含某个关键词的文档就成为搜索的关键。这里我们借助单词-文档矩阵模型,通过这个模型我们可以很方便知道某篇文档包含哪些关键词,某个关键词被哪些文档所包含。 单词-文档矩阵的具体数据结构可以是倒排索引、签名文件、后缀树等。单词-文档矩阵单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,下图展示了其含义。下图的每列转载 2017-05-15 19:22:15 · 693 阅读 · 0 评论 -
分布式存储和一致性哈希
关于分布式存储如果单台机子的hashmap存储已经不能满足我们的key-value需求,我们就需要把存储内容分布到不同的实体机上。这时需要一种把key映射到不同机器的方法,我们想起了hash,可以把实体机当做是桶,采用和hashmap实现一样的思路,通过和实体机的数量取模,自然映射到不同的机器。 但现在问题来了,如果其中一台机子挂了,或者又加了一台机子怎么办,这时出现两种情况:不做任何改变,那么转载 2017-04-18 18:49:12 · 848 阅读 · 0 评论 -
字符串算法:KMP算法
KMP 算法,俗称“看毛片”算法,是字符串匹配中的很强大的一个算法,不过,对于初学者来说,要弄懂它确实不易。整个寒假,因为家里没有网,为了理解这个算法,那可是花了九牛二虎之力!不过,现在我基本上对这个算法理解算是比较透彻了!特写此文与大家分享分享!我个人总结了, KMP 算法之所以难懂,很大一部分原因是很多实现的方法在一些细节的差异。怎么说呢,举我寒假学习的例子吧,我是看了一种方法后,似懂非懂,然后转载 2016-10-29 22:11:52 · 378 阅读 · 0 评论 -
查找:平衡2-3-4树、AVL树(平衡二叉树)、(左倾)红黑树
1. 平衡2-3-4树 一棵2-3-4树是这样一棵树:它或者为空,或者是由以下三类节点组成的树:2-节点,有1个关键字和由关键字划分的2个区间链接;3-节点,有2个关键字和由关键字划分的3个区间链接;4-节点,有3个关键字和4个区间链接。 一棵平衡2-3-4树是一棵2-3-4搜索树,其中所有指向空树的链接到树根的距离都相同。插入操作在平衡2-3-4树中,每次进行插入仍然能在树中保持完美的原创 2016-01-15 12:43:49 · 2857 阅读 · 1 评论 -
树状数组和线段树
树状数组的概念树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,怎样才能快速地获取连续几个数的和?树状数组的基本操作传统数组(共n个元素)的元素修改和连续元素求和的复杂度分别为O(1)和O(n)。树状数组通过将线性结构转换成伪树状结构(线性结构只能逐个扫描元素,转载 2016-09-11 10:17:59 · 1881 阅读 · 1 评论 -
字符串算法:Trie树(前缀树)、后缀树
Trie树Trie树,又称字典树、前缀树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构。 典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。 Trie树也有它的缺点,转载 2016-10-29 22:08:17 · 16240 阅读 · 4 评论 -
有向图的拓扑排序
1. 拓扑排序的概念 定义:将有向图中的顶点以线性方式进行排序。即对于任何连接自顶点u到顶点v的有向边u->v,在最后的排序结果中,顶点u总是在顶点v的前面。考虑一个非常非常经典的例子——选课。假设我非常想学习一门机器学习的课程,但是在修这么课程之前,我们必须要先学习一些基础课程,比如计算机科学概论,C语言程序设计,数据结构,算法等等。那么这个制定选修课程顺序的过程,实际上就是一个拓扑排序的过转载 2016-06-29 11:07:22 · 12109 阅读 · 0 评论 -
图中连通块的个数:并查集
1. 图的连通性问题在地图上有若干城镇(点),已知所有有道路直接相连的城镇对。要解决整幅图的连通性问题。比如,随意给你两个点,让你判断它们是否连通;或者问你整幅图一共有几个连通块,也就是被分成了几个互相独立的块。 修路工程问题会问还需要修几条路才能将所有城镇连通起来,实质就是求有几个连通块。如果只有1个连通块,说明整幅图上的点都连起来了,不用再修路了;如果是2个连通块,则只要再修1条路,从两个分支转载 2016-06-28 20:00:28 · 17551 阅读 · 0 评论 -
图的最短路径:Dijkstra、Bellman-Ford、SPFA、Floyd、A*算法
Dijkstra算法1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。注意该算法要求图中不存在负权边。问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)2.算法描述求下图中的1号顶点到2、3、转载 2016-04-15 21:34:12 · 10575 阅读 · 1 评论 -
最长公共子串(子序列)、最长递增子序列、最长回文子串等问题
最长公共子序列最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法。定义一个序列S,如果分别是两个或多个已知序列的子序列,且是符合此条件的子序列中最长的,则称S为已知序列的最长公共子序列。 子序列不要求连续,可以是原序列中删除若干元素后得到的序列。 求解子序列是非连续的最长公共子序列问题是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭转载 2016-09-06 16:57:21 · 582 阅读 · 0 评论 -
海量数据排序:外部排序、位图排序、基数排序、桶排序
基数排序又称桶排序,它不直接比较关键字的大小,而是比较关键字中各位的值来实现排序的。 假设关键字从高位到低位可以由k1、k2、……、kd构成。 最高位优先(MSD)法:先按k1排序分组,再对各组按k2排序分组,直到按最次位kd分组后,再将各组连接起来,便得到一个有序序列。 最低位优先(LSD)法:先从kd开始分组,再对kd-1进行排序,直到对k1分组后得到一个有序序列。二进制快速排序原创 2016-01-02 22:14:50 · 2950 阅读 · 0 评论 -
查找:哈希表和布隆过滤器
1. 哈希函数哈希函数能将关键字映射成小于M的表内地址。 如果关键字是在区间[s,t]中的浮点数,则直接实现:#define hash(v,M) (((v-s)/(t-s))*M)对于整数关键字,可以使用:#define hash(v,M) (v%M)如果M不是素数,可以用下面的哈希函数:#define hash(v,M) ((int)(.616161*(float)v)%M)或这样的类似方法:#原创 2016-01-17 21:39:53 · 1635 阅读 · 0 评论 -
查找:跳表
跳跃表定义: 一个有序列表,其中每个节点包含不定数量的链接,节点中的第i个链接构成的单向链表跳过含有少于i个链接的节点。原创 2016-01-16 22:51:56 · 1112 阅读 · 0 评论 -
二分图的最大匹配:匈牙利算法
1. 二分图的匹配问题1.1 二分图简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。 准确地说:把一个图的顶点划分为两个不相交集 U 和 V ,使得每一条边都分别连接U 、 V 中的顶点。如果存在这样的划分,则此图为一个二分图。 二分图的一个等价定义是:不含有「含奇数条边的环」的图。图 1 是一个二分图。为了清晰,我们以后都把它画成图 2 的形式。原创 2016-04-29 00:56:39 · 4703 阅读 · 0 评论 -
图的遍历:DFS和BFS算法
DFS(深度优先算法)1. 原理概述最基本的DFS是用来解决无向图的遍历问题的。无向图用沿主对角线对称的邻接矩阵存储。DFS算法最基本的代码实现如下:void dfs(int cur)//cur是当前所在的顶点编号{ sum++;//每访问一个顶点,sum+1 if(sum==n) return; for(i=1;i//从1号顶点到n号顶点依次尝试,看哪些原创 2016-04-16 12:44:58 · 3437 阅读 · 0 评论 -
基本排序算法(选择、插入、冒泡)和希尔排序
插入排序 (insertion sort)原理:从序列中第二个数A[1]开始,每一步都将一个待排数据A[i]按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。void insertion_sort(int A[]){ int i,j; for(i=1;ilength[A];i++)//从第二个元素开始,到最后一个元素结束 { int ke原创 2015-12-28 20:46:58 · 1160 阅读 · 0 评论 -
图的最小生成树:Prim算法和Kruskal算法
1. 图的最小生成树生成树的定义:如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的包含图中的所有顶点的极小连通子图。它并不唯一,从不同的顶点出发进行遍历,可以得到不同的生成树。其中,权值最小的树就是最小生成树。关于最小生成树最经典的应用模型就是城市通信线路网最小造价的问题:网络G表示n个城市之间的通信线路(其中顶点表示城市,边表示两个城市之原创 2016-04-29 00:33:01 · 15151 阅读 · 1 评论 -
B树、B+树和R树
前言动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率。 但是咱们有面对这样一个实际转载 2017-06-06 11:35:54 · 1762 阅读 · 0 评论 -
分治与动态规划(3种背包问题)
递归与树原创 2015-12-26 21:35:05 · 3894 阅读 · 0 评论 -
二分查找、二叉搜索树
符号表:是一种数据结构,其中数据项含有关键字。它支持两个基本的操作:插入新的数据项、返回给定关键字的数据项。1. 关键字索引搜索假定关键字的值是不同的小整数。在这种情况下,最简单的搜索算法是对存储在数组中的数据项进行排序,并按关键字进行索引。 基本的操作包括: 初始化、插入、搜索 。static Item *st;static int maxKey;void STinit(int maxN)原创 2016-01-10 16:21:16 · 1451 阅读 · 0 评论 -
其他排序算法:快速、归并、堆排序(top N)
4. 希尔排序 希尔排序是插入排序的改进版本,实质就是分组插入排序,也叫作缩小步长排序。 原理:先将整个文件分割成若干个子文件(由相隔某个步长的元素组成),分别进行直接插入排序,然后依次缩减步长再进行排序,待整个序列中的元素基本有序(步长足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况)效率是很高的,因此希尔排序在时间效率上比插入排序原创 2015-12-29 10:44:38 · 1870 阅读 · 0 评论