![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法笔记
文章平均质量分 64
记录学习数据结构和算法时的笔记
慎铭
合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。
展开
-
求解皇后问题
问题描述:在一个在n×n的棋盘上放n个皇后,要求任意两个皇后都不在棋盘的同一行、列和对角线上(即按国际象棋规则,使得皇后间互不攻击),试给出一个递归算法求出n个皇后全部的放置方法。算法设计:给定n×n的棋盘(假定n=4),用递归算法求出n个皇后全部的放置方法。每个皇后的位置用(k,x(k))表示,k表示行号,x(k)表示列号。为方便起见,输出结果的行号和列号都从1开始。数据输入:无。结果输出:将计算出的n个皇后的全部放置方法分行输出。每种方法的输出形式是x(1)x(2)x(3)x(4原创 2021-12-03 18:05:03 · 125 阅读 · 0 评论 -
求集合所有子集问题
问题描述:试写一个递归算法实现求一个集合的所有子集。算法设计:给定一个非空的集合,用递归算法输出它的所有子集。数据输入:第1行是集合中的元素个数,第2行是集合的元素序列(元素之间用空格分隔)。结果输出:将计算出的所有子集分行输出输入文件示例:3123输出文件示例:(此空行表示空集)322311312123在这里,我们有两种接...原创 2021-12-03 17:53:02 · 838 阅读 · 0 评论 -
求n个数中r个数的组合问题
问题描述:给出n个自然数(1,2,3,…,n)中r个数的全部组合。算法设计:给定n值和r值,用递归算法输出n个自然数(1,2,3,…,n)中r个数的全部组合。数据输入:第一行是自然数的集合,中间用空格隔开。第行是n的值,第3行是r的值。结果输出:将计算出的所有组合分行输出输入文件示例:5 4 3 2 153输出文件示例(顺序不固定)543542541532531521432431421321#include<iostream>#include<原创 2021-12-01 20:58:43 · 1379 阅读 · 0 评论 -
有重复元素的排列问题
问题描述:设R={r1,r2,…,rn}是要进行排列的n个元素。其中元素r1,r2,…,rn可能相同。试设计一个算法,列出R的所有不同排列。算法设计:给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。数据输入:第1行是元素个数n,1≤n≤500。接下来的1行是待排列的n个元素。结果输出:将计算出的n个元素的所有不同排列及排列总数分行输出输入示例:4aacc输出示例:aaccacacaccacaaccacaccaa6#include<algorithm&原创 2021-12-01 14:53:09 · 1231 阅读 · 0 评论 -
整数因子分解问题
问题描述:大于1的正整数n可以分解为:n=x1x2…xm。算法设计:对于给定的正整数n,用递归法编程计算n共有多少种不同的分解式。例如,当n=12时,共有8种不同的分解式:12=12;12=62;12=43;12=34;12=322;12=26;12=232;12=22*3。数据输入:第一行有1个正整数n(1≤n≤2000000000)。结果输出:将计算出的不同的分解式总数输出输入文件示例:12输出文件示例:8#include<iostream>#in原创 2021-12-01 14:11:36 · 814 阅读 · 0 评论 -
求最小公因数算法
最小公因数和最大公约数是两个不同的概念,千万不要弄混淆了,但是在求解最小公因数的时候,又需要用到最大公约数。对于最大公约数,我认为欧几里得算法是非常不错的一个算法,因为他的时间复杂度很低。对于欧几里得算法的详细证明请浏览欧几里得算法实现及其证明这里不再过多的赘述。 求解最小公因数其实很简单,公式为mutiple(a,b)=a∗bgcd(a,b)其中,mutiple(a,b)表示a和b的最小公因数gcd(a,b)表示a和b的最大公约数mutiple(a, b) = \frac{a * b}{gcd原创 2021-11-27 13:47:46 · 4315 阅读 · 1 评论 -
递归学习笔记
递归函数的调用次数必须是有限的!!!! 递归函数的调用次数必须是有限的!!!! 递归函数的调用次数必须是有限的!!!! 重要的事情说三遍。编译器在编译程序的时候,对递归的调用都是有一定次数限制的。我们知道,对递归的调用其实就是一个一直压栈的过程,等递归到了递归出口的时候,再出栈回溯。对于整个递归的过程,编译器会分配一定的栈空间,如果栈空间满了而递归仍然在进行,程序就会终止,当我们去调试程序的时候,就会出现我们常说的“爆栈”。因此,递归函数必须有一个递归出口,递归函数的调用次数必须是有限的,否原创 2021-11-27 10:07:09 · 2514 阅读 · 0 评论 -
十字链表存储稀疏矩阵
对于矩阵的存储,如果矩阵的元素呈有明显规律的排列的话,我们一般用一个一维数组对矩阵进行压缩存储;若矩阵中的元素多数为0,只有少数的元素为非0元素时,我们成该矩阵为稀疏矩阵。我们有矩阵Aij,其中有非0元素m个,若mij≤0.05,则我们称矩阵Aij为稀疏矩阵我们有矩阵A_{ij},其中有非0元素m个,若\frac{m}{ij} \le 0.05,则我们称矩阵A_{ij}为稀疏矩阵我们有矩阵Aij,其中有非0元素m个,若ijm≤0.05,则我们称矩阵Aij为稀疏矩阵 对于稀疏矩阵,因为非零原创 2021-11-23 10:45:00 · 3274 阅读 · 0 评论 -
平衡二叉树的代码实现
平衡二叉树,即对于一颗二叉查找树,它的任意一个结点的左子树与右子树高度之差小于1,这样的树我们称之为平衡二叉树。当一个树为平衡二叉树时,对它进行插入运算或者删除运算,都有可能会造成树的失衡,这时,我们就要对其进行调整,使他重新成为一颗平衡二叉树。判断一颗树是否失衡 我们要判断一棵二叉查找树是否平衡,便要对其进行遍历,若存在结点,使得它的左子树高度和右子树高度之差大于1,则树不平衡。为了比较时方便,我们这样定义树的结构。struct AVLNode{ struct AVLNode *lchil原创 2021-11-02 19:39:24 · 659 阅读 · 0 评论 -
二分查找算法笔记
二分查找即从一个有序集合的两端开始查找,将target值和中间值比大小,由两端的变化来控制中间值的变化,逐渐的收缩查找空间,最终找到target值查找模板1:// 这里的nums是升序排列的有序集合intBinarySearch(vector<int> &nums, int target){ int left = 0; int right = nums.size() - 1; int mid = 0; while(left <= right) {原创 2021-10-31 16:09:47 · 55 阅读 · 0 评论 -
秦九昭算法(霍尔(Horner)法则)
求下面式子的和:a0x0+a1x1+...+anxna_0x^0+a_1x^1+...+a_nx^na0x0+a1x1+...+anxn 如果我们按部就班的算,那么我们需要n(n+1)2\frac{n(n+1)}{2}2n(n+1)次乘法运算和n次加法运算,时间复杂度为O(N2)O(N^2)O(N2)。而秦九韶算法(霍尔法则)只需要n次乘法和n次加法。只需要将它改成如下形式:(((……(((an+an−1)∗x+an−2)∗x+an−3)∗x)+……)∗x+a1)∗x+a0(((……(原创 2021-10-27 19:59:23 · 1021 阅读 · 0 评论 -
快速求幂算法
按照我们的惯性思维,如果求解XNX^NXN,那么我们会进行N-1次自乘,这种算法的时间复杂度为O(N),这样的效率未免有点底下,因此我们采用更好的算法来解决这一问题。递归long intPow(long int X, unsigned int N){ if(N == 0) return 1; if(N == 1) return X; if(N % 2 == 0) return Pow(X * X, N / 2); else return Pow(X * X, N / 2)原创 2021-10-27 19:37:27 · 115 阅读 · 0 评论 -
求最大公约数欧几里得算法原理证明
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。递归gcd代码unsigned int gcd(unsigned int a, unsigned int b){ unsigned return b == 0? a : gcd(b, a%原创 2021-10-27 18:31:34 · 3767 阅读 · 2 评论 -
KMP算法求next和nextval代码原理
如果没有了解过KMP算法的话推荐阅读KMP算法详解_yyzsir的博客-CSDN博客_kmp算法KMP算法是一种字符串模式匹配算法,不同的来源讲解方式也不一样,很容易混乱,在这里以一种特殊的方式来讲解KMP算法,希望大家不再被这个问题所困扰。一. 一些基础问题什么是字符串的模式匹配?给定两个串S=“s1s2s3 …sn”和T=“t1t2t3 …tn”,在主串S中寻找子串T的过程叫做模式匹配,T称为模式。如何寻找?我们先从比较好理解的暴力匹配(朴素模式匹配BF算法)开始,进而引出K...https://blo原创 2021-10-20 23:27:31 · 603 阅读 · 0 评论