
数据结构和算法
seniusen
一个乐观的终身学习者!
展开
-
动态规划之——最长公共子串和矩阵链乘法
1. 最长公共子串最长公共子串与最长公共子序列有一些类似,只不过这里子串要求是连续的。这里我们定义 lcs[i][j] 表示以 s[i] 与 t[j] 为末尾元素的最长公共子串长度,那么我们有:lcs[i][j]={lcs[i−1][j−1]+1如果 s[i]==t[j]0如果 s[i]!=t[j]lcs[i][j] = \begin{cases} lcs[i-1]...原创 2019-12-05 18:33:51 · 267 阅读 · 0 评论 -
动态规划之——莱文斯坦距离和最长公共子序列
1. 如何衡量字符串的相似性如何量化两个字符串之间的相似性呢?我们可以用编辑距离,也就是将一个字符串通过增、删、替换字符转化成另一个字符串需要的最少编辑次数。编辑距离越小,说明两个字符串越相似。其中,莱文斯坦距离允许增、删和替换操作,表示两个字符串差异的大小;最长公共子序列只允许增删操作,表示两个字符串相似程度的大小。下面的例子中莱文斯坦距离为 3,最长公共子序列为 4。2. 莱文斯坦距离...原创 2019-12-05 18:31:21 · 291 阅读 · 0 评论 -
动态规划之——01 背包和最短路径
1. 什么是动态规划动态规划一般用来求解最优问题,这些问题一般都可以分为若干个决策阶段,每次决策对应着一组状态。我们要做的就是寻找出一组决策序列,这组决策序列能产生我们期望的最优解。能用动态规划求解的问题有以下三个特征:最优子结构,当一个问题的优化解包含了子问题的优化解时,我们说这个问题具有最优子结构,也就是我们能通过前面阶段的状态得出后面阶段的状态。无后效性,一是表示前面状态不受...原创 2019-12-05 18:29:29 · 438 阅读 · 0 评论 -
分治算法
1. 分治算法分治算法的核心就是分而治之,也就是将原问题划分为若干个规模更小但结构与原问题相似的子问题,递归地解决这些子问题然后进行合并,就可以得到原问题的解。比如归并排序就是将原数据划分为左右两个部分,然后分别递归对左右两部分排序,排完序后再合并两个有序区间数据即可得到最终整体有序的数据。分治算法能解决的问题,一般需要满足以下几个条件:原问题与分解后的子问题求解方法相同各个子问题可以...原创 2019-12-03 22:19:03 · 1973 阅读 · 0 评论 -
回溯算法
1. 什么是回溯算法回溯可以看作是一个搜索问题解的过程,这个过程分为很多个阶段,每一个阶段我们都有很多个选择,但我们不知道选择哪一个,所以就随机选择一个继续进行下一个阶段,如果发现找不到解,就回退到上一个阶段采取另外的选择再继续搜索。比如之前图的深度搜索问题,我们就是沿着起始顶点一直向下搜索,发现走不下去了再选择另外一条边继续搜索。另一个经典的例子则是八皇后问题,我们有一个 8×8 的棋盘,...原创 2019-12-03 22:12:30 · 252 阅读 · 0 评论 -
线性时间求取第 K 大数
求 Top K 的算法主要有基于快速排序的和基于堆的这两种,它们的时间复杂度都为 O(nlogK)O(nlogK)O(nlogK)。借助于分治思想,以及快速排序的区间划分,我们可以做到 O(n)O(n)O(n) 时间复杂度。具体算法思路如下:第 1 步,我们将原数据 5 个一组划分为若干个组,最后余下的不足 5 个的额外作为一组,总组数为 g=⌈n/5⌉g=\lceil{n/5}\rceil...原创 2019-12-03 22:10:08 · 509 阅读 · 0 评论 -
深度和广度优先搜索算法
在社交网络中,有一个六度分割理论,具体是说,世界上任何互不相识的两人,平均只需要六步就能够建立起联系。一个用户的一度连接用户就是他的好友,二度连接用户就是他好友的好友,三度连接用户就是他好友好友的好友。给定一个用户,如何找出这个用户的所有三度(包括一度、二度和三度)好友关系呢?1. 什么是 “搜索” 算法我们知道,算法都是作用于某种具体的数据结构上的,而深度优先搜索算法和广度优先搜索算法就是...原创 2019-12-03 22:07:06 · 934 阅读 · 0 评论 -
排序优化——模拟栈及三路快排
几乎所有的编程语言都会提供排序函数,比如 C 语言的 qsort(), C++ STL 中的 sort(),这些排序函数是如何实现的呢?1. 如何选择合适的排序算法?如果要实现一个通用的高效率的排序函数,我们应该选择那种排序算法呢?各种排序算法的特点如下所示。线性排序算法的时间复杂度比较低,适用场景特殊,因此不适合作为通用的排序函数。小规模数据可以选择时间复杂度为 ...原创 2019-12-03 22:02:54 · 221 阅读 · 0 评论 -
排序算法之——归并排序和快速排序
冒泡排序、插入排序、选择排序这三种算法的时间复杂度都为 O(n2)O(n^2)O(n2),只适合小规模的数据。今天,我们来认识两种时间复杂度为 O(nlogn)O(nlogn)O(nlogn) 的排序算法——归并排序(Merge Sort)和快速排序(Quick Sort),他们都用到了分治思想,非常巧妙。1. 归并排序(Merge Sort)?1.1. 归并排序算法实现归并排序的核心...原创 2019-12-03 21:58:47 · 392 阅读 · 0 评论 -
数据结构和算法之——算法复杂度分析
1. 何为数据结构?何为算法?简单来说,数据结构就是数据的存储方式,比如数组就是把数据存在一段连续的内存上,而链表则是通过指针的关联将数据存在任意可用的内存上;栈是先进后出,队列是先进先出。而算法则是对这些数据的操作方法,比如数据的插入、查找、删除、排序等。二者相辅相成,互为一体,数据结构为算法服务,而算法要在指定数据结构上进行操作。2. 复杂度分析?学习数据结构和算...原创 2019-12-03 21:54:13 · 231 阅读 · 0 评论