算法及数据结构
ObsessionLife
这个作者很懒,什么都没留下…
展开
-
[算法与数据结构] - No.1 直接插入排序
插入排序的基本思想 每步将一个待排序的对象, 按其排序码大小, 插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止 当算法进行到第i遍时,对于下表为i的数组元素arr[i]: 判断arr[i] 与[0,i-1]内数组的关系; 找到下标j(j>=0 && jarr[j] 将[j+1,i-1]内的数向后移以为,将arr[i]插入到arr[j+1]上 算法描述为 Inser原创 2017-08-01 14:59:21 · 331 阅读 · 0 评论 -
[算法与数据结构] - No.13 动态规划之完全背包
动态规划之完全背包 一维数组实现原创 2017-08-14 21:36:27 · 288 阅读 · 0 评论 -
[算法与数据结构] - No.12 动态规划之01背包以及01背包一维数组优化
背包问题是我们使用动态规划的一个最常见的场景。所谓动态规划,就是基于一个递推公式及一个或多个初始状态,我们要找到某个状态的最优解,然后在它的帮助下,找到下一个状态的最优解。 当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法、暴力法等要快许多。 那么什么是背包问题呢?我们以最简单的01背包来描述以下场景:. 有 N 件物品和一个容量为 V 的...原创 2017-08-14 20:33:48 · 1180 阅读 · 2 评论 -
[算法与数据结构] - No.11 字符串匹配KMP算法
最近复习到字符串的地方,看到了字符串匹配的算法。学习了KMP算法,发觉KMP算法是一个设计非常巧妙同时特别美丽的算法。虽然很晦涩难懂,但是在理解以后越来越觉得这个算法很美。在这里记录一下。同时我借鉴了阮一峰老师的关于KMP算法的介绍以及图文,在最后补上我在网上学习的实现的比较的KMP算法 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串原创 2017-08-07 11:32:30 · 330 阅读 · 0 评论 -
[算法与数据结构] - No.10 图论(3)- 最短路Dijkstra算法、Bellman-Ford算法和Floyd算法
最短路径问题:如果从图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。 三种算法主要用途: 1. 边上权值非负情形的单源最短路径问题 — Dijkstra算法 2. 边上权值为任意值的单源最短路径问题 — Bellman和Ford算法 3. 所有顶点之间的最短路径 — Floyd算法 Dijkstra算法:贪原创 2017-08-04 23:06:12 · 423 阅读 · 0 评论 -
[算法与数据结构] - No.9 图论(2)- 最小生成树Prim算法与Kruskal算法
普里姆算法的基本思想: 从连通网络 N = { V, E }中的某一顶点 u0 出发, 选择与它关联的具有最小权值的边 ( u0, v ), 将其顶点加入到生成树顶点集合U中。以后每一步从一个顶点在 U 中,而另一个顶点不在 U 中的各条边中选择权值最小的边(u, v), 把它的顶点加入到集合 U 中。如此继续下去, 直到网络中的所有顶点都加入到生成树顶点集合 U 中为止。 如图所原创 2017-08-04 21:44:52 · 370 阅读 · 2 评论 -
[算法与数据结构] - No.8 图论(1)- 图的表示与遍历
在我们对图进行表示的时候,有两种邻接矩阵和邻接表两种表示: 1. 图的表示 邻接矩阵:在一个矩阵matrix中,matrix[i][j]表示边,在无权值的图中,其表示是i,j中是否有边;在有权值的图中,其表示i,j的权值 #include using namespace std; int main() { int matrix[100][100]; int n,原创 2017-08-04 17:47:18 · 437 阅读 · 0 评论 -
[算法与数据结构] - No.7 二叉树建立及其前序、中序、后序遍历
什么叫树? 树的定义 树是由 n (n 0) 个结点的有限集合。如果 n = 0,称为空树; 如果 n = 1,则有且仅有一个特定的称之为根(Root)的结点,它只有直接后继,但没有直接前驱; 如果 n > 1,除根以外的其它结点划分为 m (m >0) 个互不相交的有限集 T1, T2 ,…, Tm,其中每个集合本身又是一棵树,并且称为根的子树(SubTree)。 树的原创 2017-08-01 19:16:43 · 439 阅读 · 0 评论 -
[算法与数据结构] - No.6 堆排序
首先,什么叫堆呢? 堆 ( Heap )设有一个关键字集合,按完全二叉树的顺序存储方式存放在一个一维数组中。对它们从根开始,自顶向下,同一层自左向右从 1开始连续编号。若满足 Ki 或 Ki >= K2i && Ki >= K2i+1, 则称该关键字集合构成一个堆。 前者成为最小堆,后者称为最大堆。通俗来说,小顶堆就是堆顶元素是整个二叉树中最小的原创 2017-08-01 18:41:12 · 256 阅读 · 0 评论 -
[算法与数据结构] - No.5 归并排序
迭代的归并排序算法就是利用两路归并过程进行排序的。其基本思想是: 假设初始对象序列有 n 个对象,首先把它看成是 n 个长度为 1 的有序子序列 (归并项),先做两两归并,得到 n / 2(求天棚) 个长度为 2 的归并项 (如果 n 为奇数,则最后一个有序子序列的长度为1);再做两两归并,…,如此重复,最后得到一个长度为 n 的有序序列。 算法描述: MergeSort.cpp原创 2017-08-01 16:20:12 · 309 阅读 · 0 评论 -
[算法与数据结构] - No.4 选择排序
基本思想 每一趟 (例如第 i +1 趟, i = 0, 1, …, n-2) 在后面 n-i 个待排序记录中选出排序码最小的记录, 作为有序序列中的第 i 个记录。待到第n-1 趟作完, 待排序记录只剩下1个,就不用再选了。 算法描述: SelectSort.cpp #include using namespace std; int main() { int n;原创 2017-08-01 16:13:35 · 294 阅读 · 0 评论 -
[算法与数据结构] - No.3 快速排序
基本思想是任取待排序对象序列中的某个对象 (例如取第一个对象) 作为基准, 按照该对象的排序码大小,将整个对象序列划分为左右两个子序列: 左侧子序列中所有对象的排序码都小于或等于基准对象的排序码 右侧子序列中所有对象的排序码都大于基准对象的排序码 一趟快速排序的具体做法是: 设两个指针low和high,设枢轴记录的关键字为pivotkey。 首先从high所指位置起向前搜索找到第一个原创 2017-08-01 15:45:09 · 255 阅读 · 0 评论 -
[算法与数据结构] - No.2 折半插入排序
折半插入 基本思想 既然每个要插入记录之前的纪录已经按关键字有序排列,在查找插入位置时就没有必要逐个关键字比较,可以使用折半查找来实现。由此进行的插入排序称之为折半插入排序。思想和直接插入相同,只是从后向前的逐个比较替换为折半查找 当算法进行到第i遍时,对于下表为i的数组元素arr[i] 找到arr[i]应该插入的位置j 将[j+1,i-1]内的数向后移以为,将arr[i]插入到arr[j+原创 2017-08-01 15:07:15 · 237 阅读 · 0 评论 -
[算法与数据结构] - No.14 动态规划之多重背包
动态规划之多重背包原创 2017-08-14 22:33:52 · 246 阅读 · 0 评论