
算法与数据结构
kikajack
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【算法和数据结构】字符串
字符集 charset 和字符编码 character encoding 参考:https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html 字符集是个集合,指明了其支持的所有字符有哪些。字符编码则为字符集中的每个字符指定了一个数字代号,解析的时候把代号替换为具体图形展示给用户。 常用的字符集有: ASCII:包含控制字符,英文,数字等。单字节字符编码,对应的字符编码就是 ASCII 码 GB2312 Unicode:对应的字符编码有: U原创 2020-10-08 14:24:42 · 241 阅读 · 0 评论 -
【算法和数据结构】模拟和暴力
模拟 有些问题的解题步骤,就是我们思考的步骤。这时可以模拟我们的思考,一步步解决问题。 约瑟夫环 问题:N个人围成一圈,从 1 开始报数,第M个出列,然后下一个人继续从 1 开始报数,直到最后剩下一个。 题目已经很清楚的给出了解题步骤,我们只需要构造一个循环链表(或者用数组,但需要注意越界时跳到数组的第一个元素来实现循环效果)。 数组 #include <stdio.h> void mov(int arr[], int n, int cur) { for (int i = cur;原创 2020-10-07 22:29:22 · 372 阅读 · 0 评论 -
【动态规划】基本概念
动态规划是解决问题的一种思想,而不是一个具体算法。此类问题的重点是: 状态划分 状态转移方程 常见的动态规划类型 线性模型:每个状态都是一个点 树状 DP:在树上进行动态规划 背包 DP:背包体积有限,每个物品有价值,求能装下的最大价值 区间 DP:每个状态都是一个区间 数位 DP:区间里有多少数字包含某个性质 状态压缩 DP:把状态用二进制表示 常见的动态规划优化 滚动数组优化:节省空间 矩阵乘法优化: 斜率优化: 四边形不等式优化: 决策单调性优化: 数据结构优化:优化时空 能用动态规划解决原创 2020-09-06 21:55:45 · 629 阅读 · 0 评论 -
【算法与数据结构】字符串模式匹配 KMP 算法
语义 在一个很长的字符串 T 中,查找是否存在子字符串 P。例如搜索引擎收录的大量网站数据,当用户输入关键字后,就会在这些数据中进行匹配,并返回合适的网站。 语义:假定字符串长度为 j,则所有字符串都在 [0, j) 这样的集合中。 返回首次匹配的字符的位置。注意这里调用方需要判断位置是否正确,例如对于长度为 i 的字符串,要查找是否有长度为 j 的字符串,如果返回值在 [0, i - j) 则为...原创 2019-10-20 22:45:13 · 382 阅读 · 0 评论 -
【算法与数据结构】查找算法语义约定及二分查找
对于有序数组,通常用二分查找(包括改进型的 Fibonacci 查找和插值查找)。 查找算法语义约定 一般简单的查找算法,可以在查找失败时直接返回 -1。但为了让函数更具有通用性(例如对于插入操作,需要定位到精确的位置),通常约定的语义为(假设数组 A[lo,hi),要查找元素 e):返回不大于 e 的最大的下标,几种特殊情况: 如果数组中有多个等于 e 的元素,返回最大下标 如果 e 比所有元...原创 2019-10-07 17:23:35 · 219 阅读 · 0 评论 -
【算法与数据结构】分治法和快速排序
快排思想: 从待排序数据中,选取一个数字做基准 pivot 把所有比 pivot 小的数据放在 pivot 左边,大的放在右边 对左右两个子序列递归使用上面两个步骤 子序列中仅有一个元素时,退出 C 代码: #include <stdio.h> void quickSort(int arr[], int lo, int hi) { int beg = lo, end = ...原创 2019-10-06 13:38:56 · 271 阅读 · 0 评论 -
【算法与数据结构】分治策略与归并排序
分治策略 对于所求的问题域,每次将其分为大小相似的两部分,然后再把每一部分当作最初的问题域再次分割,依次递归,直到得到基本问题(递归基),求解。然后,再逐步合并直到完成最初的问题域。 通常用递归的方式分割问题,例如这里的归并排序,每次将数组一分为二,然后分别判断分割动作是否到不可再分割了(数组中仅剩最后一个元素),否则继续对左右两个子数组进行分割: void merge_sort(int arr[...原创 2019-09-28 15:15:18 · 205 阅读 · 0 评论 -
【算法与数据结构】动态规划
用递归求解问题时,反复的嵌套会浪费内存。而且更重要的一点是,之前计算的结果无法有效存储,下一次碰到同一个问题时还需要再计算一次。例如递归求解 Fibonacci 数列,假设求第 n 位(从 1 开始)的值,C 代码如下: #include <stdio.h> int fib(int n) { if (n < 3) { return 1; } return fib(n ...原创 2019-05-10 22:13:10 · 291 阅读 · 0 评论 -
【算法与数据结构】图的最小生成树 MST - Prim 算法
Prim 算法属于贪心算法。 #include <stdio.h> #define VERTEXNUM 7 #define INF 10000 typedef struct Graph { int vertex[VERTEXNUM]; int edge[VERTEXNUM][VERTEXNUM]; } Graph; void initGraph(Graph* G) { int...原创 2019-05-06 22:52:01 · 212 阅读 · 0 评论 -
【算法与数据结构】并查集 Disjoint Set
并查集(Disjoint Set)用来判断已有的数据是否构成环。 在构造图的最小生成树(Minimum Spanning Tree)时,如果采用 Kruskal 算法,每次添加最短路径前,需要先用并查集来判断一下这个路径是否会构成环。 思路 遍历图的每一条边,按照下面的原则将对应的两个顶点添加到集合中: 如果两个顶点都不属于任一集合,则创建新的集合,并将这两个顶点放入 如果两个顶点都已经属于某个...原创 2019-04-30 13:25:04 · 519 阅读 · 0 评论 -
【算法与数据结构】二叉堆和堆排序
构建堆 堆本身也是个二叉树,有两个限制: 堆必须是完全二叉树 堆中任一父结点的值大于其左右两子节点的值 因为完全二叉树中,数据排列顺序是从上而下,从左至右,所以可以用数组的形式保存数据。通常根结点作为数组的 0 号元素,其左右孩子分别是 2 号、3 号元素,以此类推。 保证一个元素符合要求 保证一个元素符合要求的过程,可以叫做 heapify。其顺序是: 如果元素超限,退出 比较元素值及其左...原创 2019-04-29 13:30:29 · 393 阅读 · 0 评论 -
【算法与数据结构】二叉堆和优先队列 Priority Queue
优先队列的特点 普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同: 最大优先队列:优先级最高的元素先出队 最小优先队列:优先级最低的元素先出队 优先队列可以用下面几种数据结构来实现: 基于堆 heap,包括下面几种堆: 二叉堆 多项式堆 Fibonacci 堆 基于二叉搜索树 BST 如果用线性数据结构来实现优先级队列,则时间复杂度均为 O(n)。而如果用...原创 2019-05-03 22:16:33 · 494 阅读 · 0 评论 -
【算法与数据结构】三种简单排序 - 冒泡排序、选择排序、插入排序
冒泡排序 逐个比较相邻元素,如果逆序则交换。每一趟都会让一个元素就位,总共比较 n-1 趟。 n 个元素,需要进行 n - 1 轮冒泡,每次冒泡都会有一个元素就位,所以每轮冒泡的循环次数都会减一。时间复杂度为: 1 + 2 + … + n-1 = n(n-1)/2 = O(n^2) 初始值: 5 4 3 2 1 首轮冒泡: 4 3 2 1 5 最后一个元素就位 第二轮: 3 2 1 4 5...原创 2019-05-02 12:33:23 · 247 阅读 · 0 评论