
算法与数据结构
kikajack
这个作者很懒,什么都没留下…
展开
-
【算法和数据结构】字符串
字符集 charset 和字符编码 character encoding参考:https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html字符集是个集合,指明了其支持的所有字符有哪些。字符编码则为字符集中的每个字符指定了一个数字代号,解析的时候把代号替换为具体图形展示给用户。常用的字符集有:ASCII:包含控制字符,英文,数字等。单字节字符编码,对应的字符编码就是 ASCII 码GB2312Unicode:对应的字符编码有:U原创 2020-10-08 14:24:42 · 213 阅读 · 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 · 355 阅读 · 0 评论 -
【动态规划】基本概念
动态规划是解决问题的一种思想,而不是一个具体算法。此类问题的重点是:状态划分状态转移方程常见的动态规划类型线性模型:每个状态都是一个点树状 DP:在树上进行动态规划背包 DP:背包体积有限,每个物品有价值,求能装下的最大价值区间 DP:每个状态都是一个区间数位 DP:区间里有多少数字包含某个性质状态压缩 DP:把状态用二进制表示常见的动态规划优化滚动数组优化:节省空间矩阵乘法优化:斜率优化:四边形不等式优化:决策单调性优化:数据结构优化:优化时空能用动态规划解决原创 2020-09-06 21:55:45 · 587 阅读 · 0 评论 -
【算法与数据结构】字符串模式匹配 KMP 算法
语义在一个很长的字符串 T 中,查找是否存在子字符串 P。例如搜索引擎收录的大量网站数据,当用户输入关键字后,就会在这些数据中进行匹配,并返回合适的网站。语义:假定字符串长度为 j,则所有字符串都在 [0, j) 这样的集合中。返回首次匹配的字符的位置。注意这里调用方需要判断位置是否正确,例如对于长度为 i 的字符串,要查找是否有长度为 j 的字符串,如果返回值在 [0, i - j) 则为...原创 2019-10-20 22:45:13 · 370 阅读 · 0 评论 -
【算法与数据结构】查找算法语义约定及二分查找
对于有序数组,通常用二分查找(包括改进型的 Fibonacci 查找和插值查找)。查找算法语义约定一般简单的查找算法,可以在查找失败时直接返回 -1。但为了让函数更具有通用性(例如对于插入操作,需要定位到精确的位置),通常约定的语义为(假设数组 A[lo,hi),要查找元素 e):返回不大于 e 的最大的下标,几种特殊情况:如果数组中有多个等于 e 的元素,返回最大下标如果 e 比所有元...原创 2019-10-07 17:23:35 · 207 阅读 · 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 · 254 阅读 · 0 评论 -
【算法与数据结构】分治策略与归并排序
分治策略对于所求的问题域,每次将其分为大小相似的两部分,然后再把每一部分当作最初的问题域再次分割,依次递归,直到得到基本问题(递归基),求解。然后,再逐步合并直到完成最初的问题域。通常用递归的方式分割问题,例如这里的归并排序,每次将数组一分为二,然后分别判断分割动作是否到不可再分割了(数组中仅剩最后一个元素),否则继续对左右两个子数组进行分割:void merge_sort(int arr[...原创 2019-09-28 15:15:18 · 190 阅读 · 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 · 279 阅读 · 0 评论 -
【算法与数据结构】图的最小生成树 MST - Prim 算法
Prim 算法属于贪心算法。#include <stdio.h>#define VERTEXNUM 7#define INF 10000typedef struct Graph { int vertex[VERTEXNUM]; int edge[VERTEXNUM][VERTEXNUM];} Graph;void initGraph(Graph* G) { int...原创 2019-05-06 22:52:01 · 205 阅读 · 0 评论 -
【算法与数据结构】并查集 Disjoint Set
并查集(Disjoint Set)用来判断已有的数据是否构成环。在构造图的最小生成树(Minimum Spanning Tree)时,如果采用 Kruskal 算法,每次添加最短路径前,需要先用并查集来判断一下这个路径是否会构成环。思路遍历图的每一条边,按照下面的原则将对应的两个顶点添加到集合中:如果两个顶点都不属于任一集合,则创建新的集合,并将这两个顶点放入如果两个顶点都已经属于某个...原创 2019-04-30 13:25:04 · 500 阅读 · 0 评论 -
【算法与数据结构】二叉堆和堆排序
构建堆堆本身也是个二叉树,有两个限制:堆必须是完全二叉树堆中任一父结点的值大于其左右两子节点的值因为完全二叉树中,数据排列顺序是从上而下,从左至右,所以可以用数组的形式保存数据。通常根结点作为数组的 0 号元素,其左右孩子分别是 2 号、3 号元素,以此类推。保证一个元素符合要求保证一个元素符合要求的过程,可以叫做 heapify。其顺序是:如果元素超限,退出比较元素值及其左...原创 2019-04-29 13:30:29 · 382 阅读 · 0 评论 -
【算法与数据结构】二叉堆和优先队列 Priority Queue
优先队列的特点普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同:最大优先队列:优先级最高的元素先出队最小优先队列:优先级最低的元素先出队优先队列可以用下面几种数据结构来实现:基于堆 heap,包括下面几种堆:二叉堆多项式堆Fibonacci 堆基于二叉搜索树 BST如果用线性数据结构来实现优先级队列,则时间复杂度均为 O(n)。而如果用...原创 2019-05-03 22:16:33 · 466 阅读 · 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 · 235 阅读 · 0 评论