Algorithm
文章平均质量分 93
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
Roger_CoderLife
项目开发的六个阶段:1.充满热情2.醒悟3.痛苦4.找出罪魁祸首5.惩罚无辜6.褒奖闲人
展开
-
[算法系列之三十三]杨氏矩阵
即对于矩阵Table有Table[i][j] ≤Table[i][j + 1], Table[i][j] ≤ Table[i + 1][j],我们也称这样的矩阵为杨氏矩阵。给出判定某个数是否存在该矩阵中的高效算法。分析:为了便于复杂度分析,我们暂时假定该矩阵为大小n*n。如下图所示为一个杨氏矩阵。二分搜索解法:许多人都观察到了矩阵在二维上都是有序的,所...转载 2019-12-26 10:14:18 · 317 阅读 · 0 评论 -
[算法系列之三十一]最近公共祖先(LCA)
【简介】对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。另一种理解方式是把T理解为一个无向无环图,而LCA(T,u,v)即u到v的最短路上深度最小的点。例如,对于下面的树,结点4和结点6的最近公共祖先LCA(T,4,6)为结点2。求树中两个结点的最低公共祖先是面试中经常出现的一个问题。一般的做法,可能是针对是...转载 2019-12-24 10:20:33 · 202 阅读 · 0 评论 -
[算法系列之三十]Dijkstra单源最短路径算法
单源最短路径问题给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数。另外,还给定 V 中的一个顶点,称为源。现在我们要计算从源到所有其他各顶点的最短路径长度。这里的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。前面Bellman-Ford最短路径算法讲了单源最短路径的Bellman-Ford算法(动态规划算法)。这里介绍另外一个更常见的算法Dijkstra算法。...转载 2019-12-20 08:32:43 · 549 阅读 · 0 评论 -
[算法系列之二十九]Bellman-Ford最短路径算法
单源最短路径给定一个图,和一个源顶点src,找到从src到其它所有所有顶点的最短路径,图中可能含有负权值的边。Dijksra的算法是一个贪婪算法,时间复杂度是O(VLogV)(使用最小堆)。但是迪杰斯特拉算法在有负权值边的图中不适用,Bellman-Ford适合这样的图。在网络路由中,该算法会被用作距离向量路由算法。Bellman-Ford也比迪杰斯特拉算法更简单和同时也适用于分布式系...转载 2019-12-18 08:25:02 · 279 阅读 · 0 评论 -
[算法系列之二十八]并查集(不相交集合)
一 概述并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构:Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。 Union:将两个子集合并成同一个集合。...转载 2019-12-17 10:39:06 · 257 阅读 · 0 评论 -
[算法系列之二十七]Kruskal最小生成树算法
简介求最小生成树一共有两种算法,一个是就是本文所说的Kruskal算法,另一个就是Prime算法。在详细讲解Kruskal最小生成树算法之前,让我们先回顾一下什么是最小生成树。我们有一个带权值的图,我们要求找到一个所有生成树中具有最小权值的生成树。如下图所示,T是图G的生成树。但不是具有最小权值的生成树。我们可以把他们想象成一组岛屿和连接它们的可能的桥梁。当然修桥是非常昂贵和费时的...转载 2019-12-16 11:44:34 · 183 阅读 · 1 评论 -
[算法系列之二十六]字符串匹配之KMP算法
一 简介KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。二 基于部分匹配表的KMP算法举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面...转载 2019-12-13 11:16:05 · 144 阅读 · 0 评论 -
[算法系列之二十五]Ukkonen后缀树算法
所以我们从左边开始,第一次只插入单字符”a”,通过创建一个从根节点到一个叶节点的边(根节点左边),并且标记这条边[0,#],意思是说这条边代表了从0开始到当前末尾的子串。我使用#来表示当前末尾,当前末尾处在位置1(a的右边)。因此,我们拥有一棵起始树,图示如下:图示意思为:插入单字符”b”。当前末尾位置前进到位置2(b的右边)。 我们每步的目的是就是把所有的前缀都插入到当前位置...转载 2019-12-10 11:49:08 · 418 阅读 · 0 评论 -
[算法系列之二十四]后缀树(Suffix Tree)
之前有篇文章([算法系列之二十]字典树(Trie))我们详细的介绍了字典树。有了这些基础我们就能更好的理解后缀树了。一 引言 模式匹配问题给定一个文本text[0…n-1], 和一个模式串 pattern[0…m-1],写一个函数 search(char pattern[], char text[]), 打印出pattern在text中出现的所有位置(n > m)。这个问题已经有...转载 2019-12-06 09:31:16 · 1409 阅读 · 0 评论 -
[算法系列之二十三]线段树(Interval Tree)
一 背景在信息学竞赛中,我们经常会碰到一些跟区间有关的问题,比如给一些区间线段求并区间的长度,或者并区间的个数等等。这些问题的描述都非常简单,但是通常情况下数据范围会非常大,而朴素方法的时间复杂度过高,导致不能在规定时间内得到问题的解。这时,我们需要一种高效的数据结构来处理这样的问题,在本文中,我们介绍一种基于分治思想的数据结构—-线段树。二 简介线段树是一种二叉树形结构,属于平衡...转载 2019-12-05 08:59:54 · 858 阅读 · 0 评论 -
[算法系列之二十二]包含T全部元素的最小子窗口
题目描述给定一个包含一系列字符的集合T和字符串S,请在字符串S中找到一个最小的窗口,这个窗口中必须包含T中的所有字符。例如,S = “ADOBECODEBANC”T = “ABC”最小窗口是“BANC”分析这是一个有趣的问题,这个有趣的问题有多种方法来解决,最好的方法是非常简单,美丽的。在这篇文章中,我首先说明了一个方法,是我第一次遇见这个问题时想到的。我的第一个方...转载 2019-12-04 13:46:03 · 183 阅读 · 0 评论 -
[算法系列之二十一]最短摘要的生成
题目描述你我在百度或谷歌搜索框中敲入本博客名称的前4个字“结构之法”,便能在第一个选项看到本博客的链接,如下图2所示:图2 谷歌中搜索关键字“结构之法”在上面所示的图2中,搜索结果“结构之法算法之道-博客频道-CSDN.NET”下有一段说明性的文字:“程序员面试、算法研究、编程艺术、红黑树4大经典原创系列集锦与总结 作者:July–结构之法算法…”,我们把这段文字称为那个搜索结果的摘...转载 2019-11-29 17:01:00 · 494 阅读 · 1 评论 -
[算法系列之二十]字典树(Trie)
一 概述又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。二 优点利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。三 性质(1)根节点不包含字符,除根节点外每一个节点都只包含一个字符;(2)从根节点到某一节点,路径上经...转载 2019-11-29 08:30:14 · 200 阅读 · 0 评论 -
[算法系列之十九]最长公共子序列
题目最长公共子序列分析有两个字符串S1和S2,求一个最长公共子串,即求字符串S3,它们同时是S1和S2的子串,且要求它们的长度最长,并确定这个长度。这个问题我们称之为最长公共子序列问题。与求最长递增子序列一样,我们首先将原问题分割成一些子问题,我们用dp[i][j]表示S1中前i个字符和S2中前j个字符分别组成的两个前缀字符串的最长公共子串长度。显然的,当i,j较小时我们可以直接给...转载 2019-11-27 15:54:11 · 276 阅读 · 0 评论 -
[算法系列之十八]海量数据处理之BitMap
一:简介所谓的BitMap就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了bit为单位来存储数据,因此在存储空间方面,可以大大节省。二:基本思想我们用一个具体的例子来讲解,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用BitMap的方法来达到排序的目的。要表示8个数,我们就只需要8个bit(1B...转载 2019-11-25 13:30:36 · 224 阅读 · 0 评论 -
[算法系列之十七]数据压缩之位图
概述在之前的文章([算法系列之十六]数据压缩之游程编码)中,我们知道了如何压缩一段重复元素组成的数据。这种压缩称为“游程编码”,该算法在无损数据压缩传输时非常方便。但问题是数据必须遵循特定格式。比如,字符串“aaaaaaaabbbbbbbb”可以被压缩成“a8b8”。此时,16个字符的字符串被压缩成4个字符,没有丢失任何信息,而长度却只有原始长度的25%。但当字符(元素)以不同方式分散时,问题...转载 2019-11-21 08:39:15 · 1050 阅读 · 0 评论 -
[算法系列之十六]数据压缩之游程编码
简介无论现在计算机和网络的速度有多快,用户始终要求更快速的体验。为了降低传输数据的容量,我们通常会对数据进行压缩。这就是计算机科学领域一直是研究和发展的焦点的原因。数据压缩算法有很多,有些是无损的,有些是有损的,但是它们的主要目标都是降低存储空间和传输量。对于两个远距离节点之间的数据传输,这些压缩算法非常有用。也许最直观的例子就是web服务器和浏览器之间的数据传输。在过去的几年里做了很...转载 2019-11-13 14:15:15 · 1637 阅读 · 0 评论 -
[算法系列之十五]Strassen矩阵相乘算法
引言Strassen矩阵乘法是一种典型的分治算法。目前为止,我们已经见过一些分治策略的算法了,例如归并排序和Karatsuba大数快速乘法。现在,让我们看看分治策略的背后原理是什么。同动态规划不同,在动态规划中,为了得到最终的答案,我们需要把一个大的问题“展开”为几个子问题(“expand” the solutions of sub-problems),但是在这里,我们会更多的谈到如何把一...转载 2019-11-12 13:26:09 · 1823 阅读 · 0 评论 -
[算法系列之十四]字符串匹配之Morris-Pratt字符串搜索算法
前言我们前面已经看到,蛮力字符串匹配算法和Rabin-Karp字符串匹配算法均非有效算法。不过,为了改进某种算法,首先需要详细理解其基本原理。我们已经知道,暴力字符串匹配的速度缓慢,并已尝试使用Rabin-Karp中的一个散列函数对其进行改进。问题是,Rabin-Karp的复杂度与强力字符串匹配相同,均为O(mn)。我们显然需要采用一种不同方法,但为了提出这种不同方法,先来看看暴力字符串匹...转载 2019-11-05 11:18:22 · 202 阅读 · 0 评论 -
[算法系列之十三]Rabin-Karp字符串查找算法
简介蛮力匹配法(brute force string matching)是字符串匹配算法中最基本的一种,也是最简单的一种。它确实有自己的优点,比如它并不需要对文本串(text)或模式串(pattern)进行预处理。然而它最大的问题就是运行速度太慢,所以在很多场合下蛮力字符串匹配算法并不是那么有用。我们需要一些更快的方法来完成字符串的匹配工作,然而在此之前,我们还是回过头来再看一遍蛮力匹配法,以...转载 2019-11-04 10:52:29 · 232 阅读 · 0 评论 -
[算法系列之十二]字符串匹配之蛮力匹配
引言字符串匹配是数据库开发和文字处理软件的关键。幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作。不过理解他们的原理还是比较重要的。字符串算法主要可以分为几类。字符串匹配就是其中之一。当我们提到字符串匹配算法,最基本的方法就是所谓的蛮力解法,这意味着我们需要检查每一个文本串中的字符是否和匹配串相匹配。一般来说我们有文本串和一个匹配串(通常匹配串短于文本串)。我们需要做的就是回答这...转载 2019-11-01 08:28:10 · 533 阅读 · 0 评论 -
[算法系列之十一]荷兰国旗问题
【问题】现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。【分析】这个问题我们可以将这个问题视为一个数组排序问题。红白蓝分别对应数字0、1、2。红、白、蓝三色小球数量并不一定相同。【思路一】First, iterate the ...转载 2019-10-28 11:28:03 · 810 阅读 · 0 评论 -
[算法系列之十]大数据量处理利器:布隆过滤器
【引言】在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断 它是否在已知的字典中);在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新 元素时,将它和集合中的元素直接比较即可。一般来讲,计算机中的集合是用...转载 2019-10-25 11:31:06 · 274 阅读 · 0 评论 -
[算法系列之九]Karatsuba快速相乘算法
【概述】Karatsuba乘法是一种快速乘法。此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表。此算法主要用于两个大数相乘。普通乘法的复杂度是n2,而Karatsuba算法的复杂度仅为3nlog3≈3n1.585(log3是以2为底的)【步骤】Karatsuba算法主要应用于两个大数的相乘,原理是将大数分成两段后变成较小...转载 2019-10-24 17:07:03 · 333 阅读 · 0 评论 -
[算法系列之八]大数问题(高精度运算)
【大数相加】【代码一】/********************************** 日期:2015-01-28* 作者:SJF0115* 题目: 大数加法(高精度加法)* 博客:**********************************/#include <iostream>using namespace std;stri...转载 2019-10-23 13:38:37 · 226 阅读 · 0 评论 -
[算法系列之七]Manacher算法之最大回文子串
回文串定义:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。回文子串,顾名思义,即字符串中满足回文性质的子串。经常有一些题目围绕回文子串进行讨论,比如 HDOJ_3068_最长回文,求最长回文子串的长度。朴素算法是依次以每一个字符为中心向两侧进行扩展,显然这个复杂度是 O(N^2)的,关于字符串的题目常用的算法有 KMP、后缀数组、 AC 自...转载 2019-10-22 14:36:54 · 230 阅读 · 0 评论 -
[算法系列之六]二叉查找树
【简介】二叉查找树是一种数据结构,它支持多种动态集合操作。在二叉查找树上执行的基本操作的时间与树的高度成正比。对于一棵含有n个节点的完全二叉树,这些操作的最坏情况运行时间为O(n)。【结构体】一棵二叉查找树按二叉树结构来组织的。// 二叉查找树节点struct TreeNode { int val; TreeNode *left; Tree...转载 2019-10-21 11:28:10 · 166 阅读 · 0 评论 -
[算法系列之五]快速排序
【分析】【伪代码】【思路图】【运行过程】【代码】/********************************** 日期:2014-04-01* 作者:SJF0115* 题目:快速排序**********************************/#include <iostream&...转载 2019-10-18 10:11:26 · 116 阅读 · 0 评论 -
[算法系列之四]优先级队列
【概念】优先级队列,顾名思义,就是一种根据一定优先级存储和取出数据的队列。它可以说是队列和排序的完美结合体,不仅可以存储数据,还可以将这些数据按照我们设定的规则进行排序。优先级队列是堆的一种常见应用。有最大优先级队列(最大堆)和最小优先级队列(最小堆)。优先级队列是一种维护有一组元素构成的集合S的数据结构。【优先队列支持的基本运算】//建立一个保存元素为int的优先级队列,其实是...转载 2019-10-17 08:31:07 · 419 阅读 · 0 评论 -
[算法系列之三]二叉树前序中序序列(或后序)求解树
【思路】这种题一般有二种形式,共同点是都已知中序序列。如果没有中序序列,是无法唯一确定一棵树的。<1>已知二叉树的前序序列和中序序列,求解树。1、确定树的根节点。树根是当前树中所有元素在前序遍历中最先出现的元素。2、求解树的子树。找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树。若根节点左边或右边为空,则该方向子树为空;若根节点边和...转载 2019-10-16 10:07:00 · 679 阅读 · 0 评论 -
[算法系列之二]二叉树各种遍历
【简介】树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个...转载 2019-10-15 08:49:41 · 162 阅读 · 0 评论 -
[算法系列之一]堆排序
前序:(二叉)堆数据结构是一种数组对象,它可以被视为一棵完全二叉树。树中每个节点与数组中存放该节点值的那个元素对应。树的每一层都是填满的,最后一层除外。树的根为a[1] (在这里是从1开始的,也可以从0开始),给定了某个节点的下标i,其父节点为i/2,左二子为2*i,右儿子为2*i+1。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2...转载 2019-10-14 14:58:20 · 194 阅读 · 0 评论 -
java实现线性查找算法
有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提 示找到,并给出下标值代码实现:package search;/** * @program: text * @description: 线性查找算法 * @author: min * @create: 2019-08-01 11:19 **/p...转载 2019-08-19 21:40:57 · 384 阅读 · 0 评论 -
java实现基数排序
一、基数排序(桶排序)介绍基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucketsort)或binsort,顾 名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用 基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法 基数排序(RadixSort)是桶排序的扩展 基数排序是1887年赫...转载 2019-08-20 13:48:04 · 144 阅读 · 0 评论 -
java实现哈希表
一、介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通 过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组 叫做散列表。二、google 公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),...转载 2019-08-15 11:35:16 · 200 阅读 · 0 评论 -
java实现斐波那契(黄金分割法)查找算法
一、介绍黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位 数字的近似值是 0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神 奇的数字,会带来意向不大的效果。 斐波那契数列{1,1,2,3,5,8,13,21,34,55}发现斐波那契数列的两个相邻数的比例,无限接近黄金分割值 0.618二、原理斐波那契...转载 2019-08-15 15:32:51 · 592 阅读 · 0 评论 -
稀疏数组和队列
一、稀疏 sparsearray 数组1、先看一个实际的需求编写的五子棋程序中,有存盘退出和续上盘的功能。 分析问题: 因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组。2、基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值 把具...转载 2019-08-21 08:20:04 · 163 阅读 · 0 评论 -
java实现插值查找算法
一、介绍1、插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。2、将折半查找中的求mid索引的公式,low表示左边索引left,high表示右边索引right. key 就是前面我们讲的 findVal3、int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引...转载 2019-08-16 08:41:00 · 1285 阅读 · 2 评论 -
java实现二分查找算法
一、 要求:请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下 标,如果没有就提示"没有这个数"。二、思路:三、代码:package search;import java.util.ArrayList;import java.util.List;/** * @program: text...转载 2019-08-18 12:11:17 · 280 阅读 · 0 评论 -
程序员那些必须掌握的排序算法(上)
现在的IT行业并不像以前那么好混了,从业人员过多,导致初级程序员过剩,这也间接导致了公司的招聘门槛越来越高,要求程序员掌握的知识也越来越多。算法也是一个争论了很久的话题,程序员到底该不该掌握算法?不同的人有不同的答案,而事实上,很多公司都对算法有一定的要求,有些公司直接在面试的时候便会要求面试者手写算法题。这就对程序员的技术要求产生了很大的考验,所以面对如今的大环境,我们必须掌握算法,才能在今后...转载 2019-08-29 09:38:39 · 412 阅读 · 0 评论