算法
文章平均质量分 55
CairBin
这个作者很懒,什么都没留下…
展开
-
KMP算法与前缀函数
本文参考了 OI Wiki。KMP是一种高效的模式匹配的一种算法模式匹配。原创 2024-02-10 22:56:43 · 995 阅读 · 1 评论 -
C++ 高精度乘法运算
首先确定乘积的位数。n≤n1n2计算两个乘数每位数字的乘积,其中a[i]乘b[j]累加到c[i+j]上去在最后对累加结果数组c作一次性进位(判断是否大于等于10)原创 2023-01-10 19:37:28 · 1912 阅读 · 0 评论 -
Hash表(哈希表、散列表)
哈希表,也叫散列表,英文Hash table,是根据关键码值而直接进行访问的数据结构。原创 2022-11-22 18:39:43 · 4646 阅读 · 0 评论 -
有向无环图——AOV网及拓扑排序
public :aov() {public ://前驱结点 set < int > next;//后继结点 //备份 set < int > back_prev;};//邻接表 public :private :};原创 2022-11-08 15:53:09 · 713 阅读 · 0 评论 -
二分查找算法
二分查找顾名思义,就是把序列分成两半进行查找。另外,二分查找要求线性表必须使用顺序结构存储,并且容器内部元素排列。为了方便,本文的序列都是以升序为例(可有重复元素,返回第一个符合条件的索引值)假设任意递增有序序列 A,和要查询的值t首先找到中间值的索引mid,其中l为序列第一个元素的索引,r为最后一个元素的索引。之所以此处不给出⌊(r+l)/2⌋的形式,是因为在编写程序时这种算法可能会溢出。原创 2022-10-23 16:17:11 · 277 阅读 · 0 评论 -
递推递归与排列组合
排列组合问题在暴力枚举的情况一般有3种情况我们在此记个数为NN=n!n!N=Cnm=m!(n−m)!n!。原创 2022-08-17 00:08:58 · 363 阅读 · 0 评论 -
分离轴定理SAT凸多边形精确碰撞检测
SeparatingAxisTheorem,缩写SAT,中文为或,通过判断凸多边形在分离轴上的投影是否重叠来判断是否发生碰撞。所谓的分离轴实际上是一个方向轴,该轴的选取在二维平面情况下一般为。分离轴定理仅适用于凸多边形,不能用于凹多边形。但可以通过转化的方法,即将凹多边形转化为多个凸多边形,然后对多个凸多边形分别使用SAT,达到精确碰撞检测的目的。...原创 2022-07-31 22:28:38 · 1091 阅读 · 0 评论 -
欧几里得算法
欧几里得算法介绍概念欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。公式计算公式gcd(a,b) = gcd(b,a mod b)GCD、LCM注:最大公因数求法还有辗转相减法等方法GCD(最大公约数)//求a,b最大公约数int find_gcd(int a, int b){ return b==0?a:gcd(b,a%b);}LCM(最小公倍数)//求a,b的最小公倍数int find_lcm(int原创 2022-04-06 14:31:00 · 560 阅读 · 0 评论 -
二叉树及其遍历
二叉树及其遍历二叉树概念定义什么是二叉树二叉树特点是每个节点最多只能有两棵子树,且有左右之分的树。注:关于数据结构——树的一些基本概念可以参考《树的概念及基本术语》 - CairBin’s Blog二叉树的基本性质关于二叉树的基本性质前面已经写的很详细了,可以回顾文章《二叉树》 - CairBin’s Blog二叉树结构体定义结构体定义及其构造函数//链式二叉树结构体定义typedef struct _BinTree{ int data; //存放数据 struct _BinT原创 2022-03-07 01:28:51 · 721 阅读 · 0 评论 -
DFS与N皇后问题
DFS与N皇后问题DFS什么是DFSDFS是指深度优先遍历也叫深度优先搜索。它是一种用来遍历或搜索树和图数据结构的算法注:关于树的一些知识可以去看《树的概念及基本术语》这篇文章它会不断地沿着节点的深度方向(该深度方向为其邻接点的方向)进行遍历DFS如何实现DFS主要步骤有以下几步访问并从某节点向邻接点出发,访问路径向深处走若走到最深处还有节点没访问,则再回到该层访问该节点(回溯)依次重复上述步骤,直至所有路径都被访问(递归)DFS时空复杂度空间复杂度DFS算法实际上是一个递原创 2022-03-05 23:38:30 · 744 阅读 · 0 评论 -
哈希排序算法
哈希排序算法说明哈希算法是一种以空间换取时间的算法。下面以一个例题的方式来进一步说明这个算法。时间复杂度 O(n)例题问题描述HDU 1425 “Sort”给你n个整数,请按从大到小的顺序输出其中前m大的数。输入:每组数据有两行,第一行有两个数n和m(0<n,m<1000000),第2行包含n个各不相同,且都处于区间[-500000,500000]的整数输出:对每组测试数据从大到小的顺序排列并输出前m大的数输入样例:5 33 -35 92 213 -644原创 2022-03-04 21:55:49 · 2549 阅读 · 0 评论 -
排序之归并排序
归并排序定义归并排序是一种采用分治法,即先使每个子序列有序,再使子序列段间有序,然后合成一个完整的有序表的有效排序方法。主要步骤划分排序合并实际过程实际过程如下图(图片来自百度)代码核心代码merge()因为我们在此使用了递归的方式,对于临时数组temp在此函数内不好写,所以为了简洁我们不直接调用该函数,而是再次封装的mergeSort()//R为排序数组,l为左界,r为右界,temp为临时数组void merge(int R[],int l, int r,int te原创 2022-02-15 21:08:05 · 542 阅读 · 0 评论 -
高精度减法(C++实现)
高精度减法简介用于计算含有超过一般变量存放不下的非负整数高精度加法这个过程是模拟的小学竖式减法计算注:在本文中,我们默认输入的第一个数为被减数,且被减数大于减数原理基本上与高精度加法相同,仅在核心代码处有些区别,因此本文较为简略,建议先阅读文章《高精度加法(C++实现)》 主要步骤清零逆置转换相减计算(包含退位)代码实现逆置因为数组存放的元素顺序与我们计算的顺序是相反的,在竖式计算中我们是将其右对齐(个位对个位,十位对十位,以此类推),而读取数字后的两个数组是左对齐的,因此我们原创 2022-01-24 15:31:42 · 1185 阅读 · 0 评论 -
高精度加法(C++实现)
高精度加法简介用于计算含有超过一般变量存放不下的非负整数高精度加法这个过程是模拟的小学竖式加法计算步骤以下有顺序之分数组清零输入获取长度逆置字符型数字转成对应的整型数字计算并输出简单来看重要的步骤也就以下几步清零逆置转换相加计算(包含进位)代码实现逆置因为数组存放的元素顺序与我们计算的顺序是相反的,在竖式计算中我们是将其右对齐(个位对个位,十位对十位,以此类推),而读取数字后的两个数组是左对齐的,因此我们要将里面的元素逆置//参数:需要逆置的数组,数组长度v原创 2022-01-16 15:13:32 · 4499 阅读 · 0 评论 -
快速幂及其模
快速幂及其模快速幂时间复杂度O(log2(N))原理幂指数以二进制的形式参与计算然后把a^b转化为 通项为**a(2n(0或1))**求0到n项和的多项式代码ll quick_pow(ll a, ll b){ ll res = 1; while (b) { if (b & 1) res = res * a; a *= a; b /= 2; } return res;}快速幂的模原理由模运算a^b%p = ((a%p)^b)%p结合快速幂的原创 2022-01-05 13:20:09 · 104 阅读 · 0 评论 -
排序之选择排序
选择排序代码void selSort(int R[], int n){ for(int i=0; i<n; i++) { int temp = i; int j; for (j=i+1; j<n; j++) { if (R[j]<R[temp]) temp=j; } if ( temp!=i )原创 2021-11-05 13:36:04 · 87 阅读 · 0 评论 -
寻找素数算法
找素数暴力求解时间复杂度: O(n*sqrt(n))原理暴力求解是对[m,n]的每一个整数都判断是否为素数,由数学可知,一个数i的最大质因子不超过sqrt(i),故我们只需判断[2,sqrt(i)]的整数中有没有i的因数即可代码vector<int> fuckingFindPrime(int m,int n){ vector<int> prime; if(m<=n) { for(int i=m; i<=n; i++) { bo原创 2021-10-30 16:34:02 · 725 阅读 · 0 评论 -
排序之快速排序
代码/* 快速排序 对low至high的位置进行排序 */void QuickSort(int R[], int low, int high){ int temp, i = low, j = high; if(i<j) { temp = R[low]; //下面将小于temp的数放置在temp左面,否则放右面 while(j>i&&R[j]>=temp) j--; if(i&原创 2021-10-25 13:28:42 · 70 阅读 · 0 评论 -
冒泡排序的实现
代码/** 冒泡排序* 参数: 参与排序的数组, 数组元素个数*/void BubbleSort(int R[], int n){ int i, j; bool flag; for(i = n-1; i>=1; i--) { flag = false; //用于标记本次循环是否发生交换 for(j=1; j<=i; j++) if(R[j-1]>R[j]) {原创 2021-10-17 09:29:49 · 231 阅读 · 0 评论 -
排序算法之插入排序
本文为了方便理解,先上代码再做解释插入排序代码void InsertSort(int R[], int n){ int i,j, temp; for(i = 1; i<n; i++) { temp = R[i]; j = i-1; while(j >= 0 && temp < R[j]) { R[j+1] = R[j]; j--;原创 2021-10-13 23:59:03 · 308 阅读 · 0 评论 -
顺序表的应用——逆置问题
顺序表应用——逆置问题问题描述给定一个顺序表,将其中的元素逆置例子给定一个顺序表,其中有0至10共11个元素从小至大排列,请将这11个元素逆置使其从大到小排列以下是解题代码代码#include <iostream>#define MAXSIZE 100typedef struct{ int data[MAXSIZE]; int length;}Sqlist;//输出元素void printList(Sqlist L){ for(int n = 0;原创 2021-09-25 11:06:13 · 344 阅读 · 0 评论 -
循环链表应用——约瑟夫置换
约瑟夫问题介绍约瑟夫问题,又称约瑟夫置换、丢手绢问题。一般形式(本部分内容来自百度百科)约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。代码问题描述本文以以下问题为例编号为1-10的10 个人围成一圈,从第一个开始报数,第9个被淘汰出圈,剩下的组成新的圈。依次这样下去,求最后一个人的编号解决注意:该段代码与上篇文章——《 循环链表定义及操作 》相接//解答约瑟夫问题b原创 2021-09-18 23:16:59 · 235 阅读 · 0 评论 -
算法题——Cantor表
题目介绍描述现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:1/1, 1/2 , 1/3, 1/4, 1/5, …2/1, 2/2, 2/3, 2/4, …3/1, 3/2, 3/3, …4/1, 4/2, …5/1, ……我们以Z字形给表上每一项编号。第一项是1/1,然后是1/2, 2/1, 3/1, 2/2, …输入格式整数N(1<= N <=10^7)输出格式表中的第N项样例输入:7输出:原创 2021-09-03 17:08:01 · 2312 阅读 · 0 评论