算法
isSiYua
这个作者很懒,什么都没留下…
展开
-
并查集
并查集通过一个一维数组实现其本质是维护一个森林开始时,森林中每个点都是孤立的,每个点就是一棵只有一个结点的树之后通过一些条件,逐渐将这个树合并为一棵大树。合并的过程就是“认爹”过程在“认爹”过程中需要遵循“靠左原则”和“擒贼先擒王”,在每次判断两个结点是否已经在同一棵树的时候,也要注意必须求其根源,中间的父亲结点是不能说明什么的,必须要找到祖宗结点,判断两个结点的祖宗是否是同一根结点才行...原创 2019-11-10 21:49:09 · 178 阅读 · 0 评论 -
树和堆
树不包含回路一棵树中的任意两个结点有且仅有唯一的一条路径联通一棵树如果有n个结点,那么它一定恰好有n-1条边在一棵树中加一条边会构成一个回路完全二叉树和满二叉树满二叉树完全二叉树我们用一个一维数组存储完全二叉树如果完全二叉树的一个父结点编号为k,那么他的左儿子的编号就是2k,右儿子的编号就是2k+1如果已知儿子的编号是x,那么它的父节点的编号就是x/2(取整)如果一棵完全...原创 2019-11-10 21:18:17 · 138 阅读 · 0 评论 -
链表
对于链表头指针的作用是便于插入与删除(头结点不记录data)如果没有头指针,那么插入第一个点和删除第一个点会变成一个麻烦的操作,需要特殊考虑插入需要在第一个点时进行特殊考虑int insert_index(node*& head, int index, node* p){ int i = 1; if (head == NULL) //对于链表如果为空时的特殊考虑 {...原创 2019-11-08 20:30:48 · 113 阅读 · 0 评论 -
最短路径算法的对比
原创 2019-11-07 23:58:57 · 302 阅读 · 0 评论 -
最短路径(Bellman-Ford的优化)
每次选取队首顶点u,对顶点u的所有出边进行松弛操作例如有一条u→v的边,如果通过u→v这条边使得源点到顶点v的最短路径变短,且顶点v不在当前的队列中,就将顶点v放入队尾。同一个顶点同时在队列中出现多次是毫无意义的,因此需要一个数组来判重在对顶点u的所有边松弛完毕后,酒店顶点v出队接下来不断从队列中取出新的队首顶点再进行如上操作,直到队列空为止...原创 2019-11-07 22:16:44 · 260 阅读 · 0 评论 -
最短路径(Bellman-Ford)
Bellman-Ford算法解决了负权边的问题Bellman-Ford核心思想:对所有的边最多进行n-1次松弛操作核心语句:for (k = 1; k <= n - 1; k++) //进行n-1次松弛{ for (i = 1; i <= m; i++) //枚举每条边 { if (dis[v[i]] > dis[u[i]] + w[i]) //尝试对每条边进行松...原创 2019-11-07 22:11:38 · 250 阅读 · 1 评论 -
最短路径(Dijkstra算法)
Dijkstra算法一个点到其余个点的算法仍用邻接矩阵的方法存储图使用dis[]初始化为:存储1号顶点到其余顶点的初始路径此时dis数组的值被称为最短路径的估计值松弛算法的基本思想:每次找到离源点最近的一个顶点,然后以该顶点为中心开始扩展,最终得到源点到其余所有点的最短路径。基本步骤如下:算法核心代码:for (i = 1; i <= n; i++){ dis[i...原创 2019-11-07 21:36:52 · 682 阅读 · 0 评论 -
动态规划(最大子矩阵)
在DP问题中有一种叫最大子矩阵问题,刚好碰到了这一题,于是学习分享之。让我们先来看一下题目:ZOJ Problem Set - 1074最大子矩阵题目分类:动态规划题目大意:就是输入一个N*N的矩阵,找出在矩阵中,所有元素加起来之和最大的子矩阵。例如在 这样一个4*4的矩阵中,元素之和最大的子矩阵为 ,它们之和为15。这是一个最大子矩阵问题,我们怎么来解决这个问题呢?任何问...转载 2019-11-07 09:07:26 · 1016 阅读 · 1 评论 -
多源最短路径问题(Floyd-Warshall)
为了求任意两个点之间的最短路径照旧,利用矩阵来存储图的信息自身到自身,设置为0无法到达设置为无穷可以到达的 i 到 j ,就记为a[i][j]=路径长度思路一:对所有的两个点动用一次dfs或bfs,也就是n2次DFS或BFS上述是个啥子方法,只是看看思路二:如果,要使得从 i 到 j,就必须经过中转点,i→k→j,那么我们从所有的点中,找到这个k,使得i→j的路径变短或许,经...原创 2019-11-06 15:13:01 · 639 阅读 · 1 评论 -
最短路径(广度优先搜索)
广度优先搜索适用于所有边的权值相同的情况当所有边的权值相同,采用BFS时,当找到终点,直接退出。这时,得到的便是最短路径一个案例:各边权值均为1,找到1到5距离最小值#include<stdio.h>struct note{ int x; //城市编号 int s; //转机次数};int main(){ struct note que[2501]; //...原创 2019-11-05 22:29:08 · 2583 阅读 · 0 评论 -
最短路径(图的深度优先遍历)
图的基本概念:图就是N个顶点,M条边组成的集合图有有向图和无向图如果给图中每条边规定一个方向,则得到的图是有向图,其边为有向边。在有向图中,与一个点相关联的边有出边和入边之分,而与一个有向边关联的两个点也有始点和终点之分边没有方向的图称为无向图我们采用图的邻接矩阵来存储图(当然还有其他方法)在存储无向图时,需要注意的是:存储的边,需要有两个,例如:存储(a,b)边时,需要在图的邻接矩...原创 2019-11-05 22:12:55 · 1231 阅读 · 0 评论 -
qsort的用法
qsort()的用法:qsort()是在stdlib.h中的使用库函数排序的代码量并不比冒泡排序少,但速度更快void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));调用格式:qsort(s, strlen(s), sizeof(char), cmp_char);...原创 2019-11-04 20:39:46 · 117 阅读 · 0 评论 -
散列表
散列表散列函数:即无论你给它什么数据,它都还给你一个数字。将输入映射到数字需满足:输入映射到的数字是一致的将不同的输入映射到不同的数字散列函数总是将同样的输入映射到相同的索引。散列函数将不同的输入映射到不同的索引散列函数知道数组有多大,只返回有效的索引。散列表就是依据散列函数和数组利用散列函数,来得到数组中的索引直接利用所得到的索引,访问数组中位置在python中,提供的...原创 2019-11-04 15:38:15 · 227 阅读 · 0 评论 -
分而治之
分而治之D&Cdivide and conquerD&C的工作原理:找出简单的基线条件确定如何缩小问题规模,使其符合基线条件基线条件是指函数不再调用自己,从而避免形成无限循环D&C并非可用于解决问题的算法,而是解决问题的思路编写涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素。陷入困境时, 请检查基线条件是不是这样的。分而治之最为具体的样例...原创 2019-11-04 14:48:47 · 152 阅读 · 0 评论 -
一些简单的算法
二分查找二分查找是一种算法,其输入是一个有序的元素列表如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null仅当列表是有序的时候,二分查找才管用。一般而言,对于包含n个元素的列表,用二分查 找最多需要log2n步,而简单查找最多需要n步。def binary_search(list, item): low = 0 high = len(list)—1 w...原创 2019-11-04 14:46:32 · 253 阅读 · 0 评论 -
图的遍历
深度优先遍历的思想:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问的顶点:当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直到所有的顶点都被访问过。深度优先遍历时沿着图的某一条分支遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的点都被遍历过为止这是遍历,而不是走一个通路需要把所有的点都进行访问#include<stdio.h>...原创 2019-11-03 22:20:27 · 132 阅读 · 0 评论 -
埃氏筛法生成质数表
埃氏筛法生成质数表不多逼逼这个用于制作素数表,比起简单的判断是不是素数,再加入表快多了// 用埃氏筛法生成质数表void prime(int b){ //初始化,默认全部都是质数 memset(book, true, sizeof(book)); book[1] = false;//1不是质数 int n = sqrt(b); for (int i = 2; i <= n...原创 2019-11-02 19:25:13 · 253 阅读 · 0 评论 -
枚举算法
枚举算法的基本思想:有序地去尝试每一种可能炸弹人基本就是把每一个点都遍历一遍然后判断就是最简单的枚举全部枚举//炸弹人的策略#include<stdio.h>int main(){ char a[20][21]; int i, j, sum, map = 0, p, q, x, y, n, m; scanf("%d%d", &n, &m);...原创 2019-10-31 21:51:13 · 304 阅读 · 0 评论 -
搜索算法
DFS为对一组数进行 全排列深度优先搜索#include<stdio.h>int a[10], book[10],n;void dfs(int step){ int i; if (step == n + 1) //如果已经选择完毕 { //则打印,所选数据 for (i = 1; i <= n; i++) printf("%d ", a[i]); ...原创 2019-10-31 18:59:30 · 166 阅读 · 0 评论 -
栈、队列和链表
队列head记录的是队首位置tail记录的是队尾的下一个位置tail为什么不记录队尾,而是记录队尾的下一个位置?因为当队列只剩一个元素的时候,队头和队尾重合回答带来一些麻烦。因此,规定队首和队尾重合时,队列为空当出队,则head++当入队,则q[tail++]=入队数这样保证了head和tail之间的为队列中的有效数代码实现:#include<stdio.h>in...原创 2019-10-31 14:54:01 · 221 阅读 · 0 评论 -
排序算法
桶排序(简化)桶排序的适用范围,是要看数组有没有办法申请。因此,桶排序一般适用于有限的,而且范围较小的。如果连数组都没有办法申请,那么桶排序就是个笑话桶排序的时间复杂度O(m+n)#include<stdio.h>int main(){ int book[1001], i, j, t, n; for (i = 0; i <= 1000; i++) book[...原创 2019-10-30 14:51:01 · 84 阅读 · 0 评论