《算法》
算法手记
一个算法工程师的自我成长
展开
-
《算法》-字符串[数据压缩]
1、为什么要做数据压缩? 数据压缩的主要目的还是减少数据传输或者转移过程中的数据量。2、什么是数据压缩? 是指在不丢失信息的前提下,缩减数据量以减少存储空间,提高传输、存储和处理效率的一种技术方法。或者是按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间。3、常见的数据压缩算法LZW压缩LZW压缩是一种无损压缩,应用于gif图片。适用于数据中存在大量重固子串的情况。原理:LZW算法中,首先建立一个字符串表,把每一个第一次出现的字符串放入串表中,并用一个数字来表示,这个转载 2020-09-17 22:49:33 · 1751 阅读 · 0 评论 -
《算法》-字符串[正则表达式]
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式描述了一种字符串匹配的模式(pattern),可以用来检查一个字符串是否含有满足该pattern的子串,正则表达式典型应用如下图:常见的表示前面的符号重复0或多次,比如AB表示的字符串由一个A和0个或多个B组成。|表示或操作,如AB|CD,可以表示字符串AB或者CD()可以改变默认的优先级,举例如下:每个正则表达式都对应一个非确定有限状态自动机转载 2020-09-16 21:58:42 · 178 阅读 · 0 评论 -
《算法》-字符串[子字符串查找]
字符串的一种基本操作就是子字符串查找。比如在文本编辑器或是浏览器中查找某个单词时,就是在查找子字符串。子字符串的长度(可能为100或1000)相对于整个文本的长度(可能为100万甚至是10亿)来说一般是很短的,在如此多的字符中找到匹配的模式是一个很大的挑战,为此计算机科学家们发明了多种有趣、经典且高效的算法。暴力子字符串查找算法要解决这个问题,首先想到的是暴力查找的方法,在文本中模式可能出现匹配的任何地方检查是否匹配。隐式回退首先是隐式回退的实现方式,之所以叫隐式回退,在与显式回退的实现对比后就明白转载 2020-09-15 22:15:14 · 535 阅读 · 0 评论 -
《算法》-字符串[单词查找树]
查找所需要的单词的时间和键的长度成正比查找未命中只需检查若干个单词单词查找树单词查找树API基本性质每个链接对应一个字符每个结点可能有一个值有值,说明存在从根结点到这个结点的字符串。没有值,说明不存在从根结点到这个结点的字符串。没有对应的键值。它的存在是为了简化查询。查找命中: 对应结点有值(注意不单单是指向该对应结点d链接存在,并且该结点一定要有值!)未命中: 没有值 or 链接为空结点的表示每个结点下面有R个链接,一个链接对应一个字符键隐式..转载 2020-09-14 23:04:37 · 213 阅读 · 0 评论 -
《算法》-字符串[字符串排序]
引入字符串方便比较吗?不方便怎么办呢?把每一个字符对应成一个数字 toIndex(c)一共有多少个字符? R个数字R需要几个二进制位来表示? lgR个如扩展ASCII码共256个字符,需要8位二进数来表示。区别Alphabet.toChar(index) 把数字对应成字符。这个是字母表的第i位String.charAt(index) 字符串的第i位是什么字符。这个是字符串的第i位。 字符表API标准字符表键索引计数输入字符串和字符串对应的组别(组别也是转载 2020-09-14 01:17:28 · 276 阅读 · 0 评论 -
《算法》-图[最短路径]
最短路径地图或者导航系统是最短路径的典型应用,其中顶点对应交叉路口,边对应公路,边的权重对应经过一段路的成本(时间或距离)。在这个模型中,问题可以被归纳为:找出从一个顶点到达另一个顶点的成本最小的路径。此外,网络路由、任务调度等也属于同类问题。加权有向图加权有向图是研究最短路径问题的模型。在加权有向图中,每条有向边都有一个与之关联的权重,路径的权重指路径上所有边的权重之和,所以在加权有向图中,求顶点v到w的最短路径问题就成了求顶点v到w的所有路径中权重最小者。数据结构加权有向边加权有向边是构成加转载 2020-09-13 12:54:04 · 368 阅读 · 0 评论 -
《算法》-图[最小生成树]
最小生成树简单理解在前面我们了解到了无向图和加权有向图,类似的我们给无向图的每一条边加上权重,就得到了加权无向图最小生成树:图的生成树是它的一棵含有所有顶点的无环连通子图。加权图的最小生成树(MST)是它的一棵权值之和最小的生成树最小生成树算法有很多应用,比如顶点是城市,边是城市之间的航线,那么最小生成树可以看作覆盖这些城市做需要的最短总航线。下面我们先来看基本的实现原理。贪心算法首先我们先来介绍一个概念切分:切分就是将图的所有顶点分为两个非空且不重叠的两个集合,横切边是一条连接两个属于不同转载 2020-09-12 02:37:05 · 231 阅读 · 0 评论 -
《算法》-图[有向图]
有向图简单的来说有向图就是连接带方向的图。有向图的例子在现实生活中也很多,比如在一段时间内银行间的现金流动,或者在某些地方的一些道路是单向的啊,那么这些现金流以及单向的道路就要用带方向的边来描述,这时有向图就有了用武之地。一个有向图的例子如下:有向图该怎么实现呢?,对于无向图我们使用邻接表来实现,这种表达方式非常高效,并且略加思考就可以发现,邻接表完全可以直接套用在有向图上。假设要添加一条v->w的边,只要每次调用add()函数的时候只在adj[v]所指向的Bag添加w即可,这么看来无向图可以看转载 2020-09-10 23:53:51 · 886 阅读 · 0 评论 -
《算法》-图[无向图]
四种重要的图模型:无向图(简单连接)有向图(连接有方向性)加权图(连接带有权值)加权有向图(连接既有方向性又带有权值)无向图定义:由一组顶点和一组能够将两个顶点相连的边组成。特殊:自环(一条连接一个顶点和其自身的边);平行边(连接同一对顶点的两条边)数学家将含有平行边的图称为多重图;将没有平行边或自环的图称为简单图。现实当中,两点就可以指代一条边。术语表两个顶点通过一条边相连,称这两顶点相邻,并称该连接依附于这两个顶点。某个顶点的度数即为依附于它的边的总数。子图是由一幅图的所转载 2020-09-09 23:14:33 · 608 阅读 · 0 评论 -
《算法》-查找[散列表]
散列表也是一种符号表,主要特征是可以将键通过散列函数映射为一个数组索引,然后利用这个数组索引就可以做很多东西。散列函数当我们输入一个对象,不论这是个什么东西,经过散列函数处理之后输出一个0到M-1的范围之内的整数。对于散列函数有一些要求:相等的对象(使用equals()函数)的散列值是相同的2.同样的散列值不同的两个对象不相等3.在输出范围之内尽量均匀分布下面介绍两种实现散列表的方式,分别基于拉链发和线性探测法。基于拉链法的散列表(SeparateChaining)假设键的数目为N,转载 2020-09-09 00:38:42 · 164 阅读 · 0 评论 -
《算法》-查找[平衡查找树]
平衡树平衡树是一类改进的二叉查找树。一般的二又查找树的查询复杂度是跟目标结点到树根的距离(即深度)有关,因此当结点的深度普遍较大时,查询的均推复杂度会上升,为了更高效查询,平衡树应运而生了。在这里,平衡指所有叶子的深度趋于平衡,更广义的是指在树上所有可能查找的均复杂度偏低2-3查找树2-3 查找树是一种能够在动态插入当中保持完美平衡的数据结构,完美平衡即树中的所有空链接到根节点的距离都是相同的。在一棵大小为 N 的 2-3 树中,查找和插入操作访问的结点必然不超过logN个,为了保证查找树的平衡性,我转载 2020-09-08 01:37:00 · 276 阅读 · 0 评论 -
《算法》-查找[二叉查找树]
二叉查找树二叉查找树是具有有以下性质的二叉树:若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值。若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值。左、右子树也分别为二叉查找树。没有键值相等的节点。复杂度:算法平均平均空间O(n)O(n)搜索O(log n)O(n)插入O(log n)O(n)删除O(log n)O(n)定义节点class BinarySearchTree(object):转载 2020-09-06 13:43:18 · 453 阅读 · 0 评论 -
《算法》-排序[优先队列(堆排序)]
优先队列(堆排序)优先队列:最重要的操作就是删除最大元素和插入元素堆排序:堆排序对于记录较少的文件效果一般,对于文件较多还是比较有效的,最差的时间复杂度为nlog(n),属于不稳定排序堆排序可以被认为是一种改进的选择排序:就像选择算法一样,它将输入分成已排序的和还未排序的区域,它通过提取未排序的区域内最大的元素并将其移动到已排序的区域来迭代缩小未排序的区域。堆排序相对选择排序改进的部分包括使用堆数据结构而不是线性时间的搜索来找到最大值。摘于知乎:堆排序步骤:输入:一系列的无序元素(.原创 2020-09-04 02:02:48 · 593 阅读 · 0 评论 -
《算法》-排序[快速排序]
快速排序属于不稳定排序,最差为n^2,一般为nlog(n)快速排序是一种分治的排序算法,它将一个数组分成两个子数组,将两个部分独立排序。快速排序和归并排序是互补的:归并排序是将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了。归并排序,一个数组分为两半;快速排序,切分的位置取决于数组的内容。步骤:1、在待排序的元素任取一个元素作为基准(通常选第一个元素,称为基准元素)2、将待排序的元素进行.原创 2020-09-03 23:59:16 · 433 阅读 · 0 评论 -
《算法》-排序[归并排序]
归并排序属于稳定排序步骤:先(递归地)将数组分成两半,然后把结果归并起来。def merge(left,right): i,j = 0,0 result = [] while i < len(left) and j < len(right): if left[i] <= right[j]: result.append(left[i]) i += 1 else:.原创 2020-09-03 22:47:00 · 91 阅读 · 0 评论 -
《算法》-排序[初级排序算法]
《算法》系列,是面向《算法》第四版这本书进行学习,会去除繁琐的文字叙述,会从以下两个方面去理解一个算法:1、这个算法是什么?2、这个算法怎么用? 整个系列会使用python作为编程语言,避免看着文本抄袭的麻烦。一些关于《算法》这本书的学习方法可以参考:算法学习之路选择算法属于不稳定排序步骤:1、找到数组中最小的元素2、将它和第一个元素交换位置3、再从剩下的元素中找到最小的元素,将它和第二个元素进行交换,如此往复。def select(lists):...原创 2020-09-02 02:41:07 · 170 阅读 · 0 评论