随笔分类 - 基础算法
经常使用的一些知识
摘要:例题链接 ##Kruskal算法的对比prim的区别是,前者使用了并查集的思路,而后者类似于Dijkskal算法。操作策略是,对所有边权进行从小到大的排序,然后从小到大遍历所有边权去选择,一个边被选择的条件是,这条边的两个端点位于不同的集合,即二者的find函数得到的值不同,然后将两个点加到同一个集
阅读全文
摘要:例题链接 ##最小生成树的含义是,假设给定n个点,m条边(m > n - 1),在m条边中选择n - 1条边将n个点连接成一个连通图,即一棵生成树。因为每个边都有一个权重,当选择的边权和最小时产生的生成树被称为最小生成树,边权和就是这棵最小生成树对应的权值 ##求最小生成树的策略为:每次从所有没选中
阅读全文
摘要:例题链接 ##并查集是一个集合操作,将一个集合与另一个集合合并或者查询两个元素是否属于同一个集合。具体操作是先创建一个数组存放各个元素的父亲,初始给每个元素指定父亲是它自己。在合并操作时,先看看两个元素的父亲是否相同,如果相同就不变,否则就让一个的父亲等于另一个的父亲。在查询操作时,就查询两个元素的
阅读全文
摘要:例题链接 ##Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。其主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止 ##具体流程: ##代码实现: #include<iostream> #incl
阅读全文
摘要:##宽度优先搜索和深度优先搜索的区别是,宽度优先要先让当前点横向到达所有可以一步到达的点,判断在这些点中是否有自己需要的终点(注意别重复走,要去重),如果有就停下来,这样可以找出最短路径,如果没有就将这些点放入队列中用于下一次的更新,也就是说每一次都是从一个点开始走到尽可能多的点上去 例题链接 ##
阅读全文
摘要:##栈是一种数据结构,先进后出,只支持一端进行插入和弹出操作,可以用数组进行模拟实现,现在编程语言中都进行了封装,可以直接调用 ###插入:插入时就是栈顶指针指向的内存区域存放当前要插入的元素,然后栈顶指针自增即可 ###弹出:弹出就是栈顶指针自减,原来栈顶元素溢出相当于弹出 ###查询栈顶是否为空
阅读全文
摘要:##前缀和用于在O(1)的时间内求某一给定的数组的其中任意长度的和,它其实就是对一给定了的数组计算得出一个前缀和数组,再利用这个计算出来的数组去求某一段的和 例题链接 #include <iostream> using namespace std; int n, m; const int N = 1
阅读全文
摘要:跳转地址 ##归并排序的重点是合并,利用双指针算法,排序的是否稳定是指如果两个数的大小相同,在经过排序后相对位置不变,那么这个排序就是稳定的,否则就是不稳定的 ##归并排序的思路是将数组按照mid分开成为两部分,然后先进行递归再排序,排序时按照双指针算法进行排序,用temp存放结果最后将temp中的
阅读全文
摘要:题目链接 ##快速排序板子题,练习快速排序的代码,下面是排序算法的一些对比 ##快速排序的思路图 ##快速排序的代码 #include <iostream> using namespace std; const int N = 1e5 + 10; int q[N]; int quick_sort(i
阅读全文
摘要:#数字的全排列 跳转链接 ##深度优先搜索就是先走到底走到无路可走然后再进行回溯的算法,用于全排列打表操作,数字的全排列操作就是每一个序列需要包含从1到n所有的数字,但是数字不能重复,不能和原来有过的序列相同 ###思路:开一个bool数组用于记录当前下标的数字是否被使用过,同时开一个path数组用
阅读全文
摘要:#桶排序 题目地址 ##数据范围是1到1000的随机数,每个出现的次数小于100次,且重复的数字只保留一个,所以很显然利用桶排序的知识即可轻松ac ###桶排序就是开一个比给定数据范围略大的一个数组(防止数组越界),且数组内存放的数字全部为0,然后对题目输入的数据进行遍历,也可以在读入时就进行处理这
阅读全文

浙公网安备 33010602011771号