随笔分类 - 算法
摘要:递推递归与排列组合 说明 排列组合 排列组合问题在暴力枚举的情况一般有3种情况 我们在此记个数为N 情况一:打印n个数的全排列: 情况二:打印n个数中任意m个数的全排列 情况三:打印n个数中任意
阅读全文
摘要:欧几里得算法 介绍 概念 欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。 公式 计算公式gcd(a,b) = gcd(b,a mod b) GCD、LCM 注:最大公因数求法还有辗转相减法等方法 GCD(最大公约数) //求a,b最大公约数
阅读全文
摘要:二叉树及其遍历 二叉树概念定义 什么是二叉树 二叉树特点是每个节点最多只能有两棵子树,且有左右之分的树。 注:关于数据结构——树的一些基本概念可以参考《树的概念及基本术语》 - CairBin's Blog 二叉树的基本性质 关于二叉树的基本性质前面已经写的很详细了,可以回顾文章《二叉树》 - Ca
阅读全文
摘要:DFS与N皇后问题 DFS 什么是DFS DFS是指深度优先遍历也叫深度优先搜索。 它是一种用来遍历或搜索树和图数据结构的算法 注:关于树的一些知识可以去看《树的概念及基本术语》这篇文章 它会不断地沿着节点的深度方向(该深度方向为其邻接点的方向)进行遍历 DFS如何实现 DFS主要步骤有以下几步 访
阅读全文
摘要:哈希排序算法 说明 哈希算法是一种以空间换取时间的算法。 下面以一个例题的方式来进一步说明这个算法。 时间复杂度 O(n) 例题 问题描述 HDU 1425 “Sort” 给你n个整数,请按从大到小的顺序输出其中前m大的数。 输入:每组数据有两行,第一行有两个数n和m(0<n,m<1000000),
阅读全文
摘要:归并排序 定义 归并排序是一种采用分治法,即先使每个子序列有序,再使子序列段间有序,然后合成一个完整的有序表的有效排序方法。 主要步骤 划分 排序 合并 实际过程 实际过程如下图(图片来自百度) 代码 核心代码 merge() 因为我们在此使用了递归的方式,对于临时数组temp在此函数内不好写,所以
阅读全文
摘要:高精度减法 简介 用于计算含有超过一般变量存放不下的非负整数 高精度加法这个过程是模拟的小学竖式减法计算 注:在本文中,我们默认输入的第一个数为被减数,且被减数大于减数 原理基本上与高精度加法相同,仅在核心代码处有些区别,因此本文较为简略,建议先阅读文章《高精度加法(C++实现)》 主要步骤 清零
阅读全文
摘要:高精度加法 简介 用于计算含有超过一般变量存放不下的非负整数 高精度加法这个过程是模拟的小学竖式加法计算 步骤 以下有顺序之分 数组清零 输入 获取长度 逆置 字符型数字转成对应的整型数字 计算并输出 简单来看重要的步骤也就以下几步 清零 逆置 转换 相加计算(包含进位) 代码实现 逆置 因为数组存
阅读全文
摘要:快速幂及其模 前提 typedef long long int ll; 快速幂 时间复杂度 O(log2(N)) 原理 幂指数以二进制的形式参与计算 然后把ab转化为 通项为 **a( 2^n(0或1))** 求0到n项和的多项式 代码 ll quick_pow(ll a, ll b) { ll r
阅读全文
摘要:选择排序 代码 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
阅读全文
摘要:找素数 暴力求解 时间复杂度: O(n*sqrt(n)) 原理 暴力求解是对[m,n]的每一个整数都判断是否为素数,由数学可知,一个数i的因数关于sqrt(i)对称分布,故我们只需判断[2,sqrt(i)]的整数中有没有i的因数即可 代码 vector<int> fuckingFindPrime(i
阅读全文
摘要:代码 /* 快速排序 对low至high的位置进行排序 */ void QuickSort(int R[], int low, int high) { int temp, i = low, j = high; if(i<j) { temp = R[low]; //下面将小于temp的数放置在temp
阅读全文
摘要:代码 /* * 冒泡排序 * 参数: 参与排序的数组, 数组元素个数 */ void BubbleSort(int R[], int n) { int i, j; bool flag; for(i = n-1; i>=1; i--) { flag = false; //用于标记本次循环是否发生交换
阅读全文
摘要:本文为了方便理解,先上代码再做解释 插入排序代码 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]) {
阅读全文
摘要:顺序表应用——逆置问题 问题描述 给定一个顺序表,将其中的元素逆置 例子 给定一个顺序表,其中有0至10共11个元素从小至大排列,请将这11个元素逆置使其从大到小排列 以下是解题代码 代码 #include <iostream> #define MAXSIZE 100 typedef struct{
阅读全文
摘要:约瑟夫问题 介绍 约瑟夫问题,又称约瑟夫置换、丢手绢问题。 一般形式 (本部分内容来自百度百科) 约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。 代码 问题描述 本文以以下问题为例
阅读全文
摘要:题目介绍 描述 现代数学的著名证明之一是 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, …
阅读全文