![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
naturerun
将编程视为一种乐趣,将代码作为一种艺术
展开
-
k个一组反转链表
k个一组反转链表原创 2024-02-13 22:11:40 · 126 阅读 · 0 评论 -
C++实现链表自底向上的归并排序
C++实现list的自底向上归并排序原创 2024-02-13 22:00:56 · 233 阅读 · 0 评论 -
对求有向图强连通分量的tarjan算法原理的一点理解
Tarjan算法正确性的详细证明原创 2021-12-21 18:01:13 · 751 阅读 · 0 评论 -
编程分拆正整数
先求正整数J拆分为K个正整数的所有分拆方案#include <iostream>using namespace std;int main(){ const int K = 2; const int J = 4; int a[K] = { 0 }; int i, j, t; bool TF = true; t = 0; i = 0; while (1) { if (i == 0)原创 2021-12-19 19:51:49 · 627 阅读 · 0 评论 -
提取相同字符组成的子串
给定一个字符串和子串特征标记,要求从源字符串中提取特征标记代表的所有子串,如:给定源字符串:AaaBbb,和子串特征标记ab,要求提取出符合特征标记的所有相同字符组成的子串aa和bbJAVA代码如下:import java.util.ArrayList;import java.util.Scanner;import static java.lang.System.*;import java.lang.String;public class FindSub{ public s原创 2021-12-19 19:46:36 · 549 阅读 · 0 评论 -
线性方程组求解
经典问题用高斯约当算法求解线性方程组。这里要求对任意形式的线性方程组都能够妥善处理,不能只适用于方程个数和未知量数目相等的特殊情形。先用循环结构将增广矩阵转换为阶梯形矩阵,循环结束时得到阶梯型矩阵非零行行数,同时得到一个链表其中存放有各非零行主元的列标,列标在链表中按从左到右的顺序依次递减。然后根据线性代数中线性方程组的解的情况及判别准则判断方程是否有解,有多少个解。当线性方程组有解时,需要用convert函数将其转换为简化行阶梯型矩阵,然后输出唯一解或一般解C语言代码如下:#includ..原创 2021-12-19 19:45:07 · 1096 阅读 · 0 评论 -
构造组合公式C(n,m)对应的所有组合方案 用回溯法构造所有全排列
构造从n个数中选取k个数的所有组合方案 一共提供递归非递归两种方法另外一个程序用回溯法构造所有全排列方案数原创 2021-12-19 19:44:01 · 265 阅读 · 0 评论 -
求不定方程整数解
求不定方程x1+—xk=J的非负整数解#include <stdio.h>#define K 3#define J 5void main(){ int a[K] = { 0 }; bool TF; int i, j, t; TF = false; t = 0; i = 0; while (1) { if (i == 0) { if (TF)原创 2021-12-19 19:35:16 · 787 阅读 · 0 评论 -
N皇后问题非递归求解(利用对称性优化)
N皇后问题是一个老掉牙的问题了,随便翻一本算法书籍都能看到对它的介绍,其实N皇后问题可以用非递归方法解决,有效避免N过大时的递归工作栈溢出,且占用的存储空间较小,运行速度也较快,达到运行速度和空间合理利用的两全,代码很简单,并不复杂,有时简单也是一种美,意味着可靠和高效。追求程序的复杂和难以理解的编程者不会认同这一点,但对用简单的设计就可以解决的问题用复杂的数据表示加以描述是没有必要的。我们可以利用对称性解决N皇后问题:对于n皇后问题的任意解,把它相对于棋盘中线做对称变换,即让N皇后解中任意一个皇后原创 2021-12-19 19:07:04 · 3484 阅读 · 1 评论 -
蚂蚁问题的一个小扩展
之前的博文谈到了蚂蚁问题,现在考虑其变形,要求输出从开始到所有蚂蚁离杆这段时间内的各时间段内的碰撞情况,有碰撞输出所有碰撞,没有则提示未发生碰撞,最后输出碰撞总次数,若整个过程没有发生任何碰撞则提示没有发生碰撞。代码如下(C语言):#include <stdio.h>#include <malloc.h>#include <stdlib.h>void main(){ int t, i, flag; int number, sign;..原创 2021-12-19 18:59:50 · 843 阅读 · 0 评论 -
蚂蚁问题探讨
有一根27厘米的细木杆,在杆上某些位置上各有一只蚂蚁。木杆很细,不能同时通过一只以上蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,输出各时刻杆上蚂蚁的位置和方向,每个时刻离杆的蚂蚁的编号,所有蚂蚁的离杆时间。最后输出各蚂蚁离杆时间。代码如下(C语言):#include <stdio.h>#include <malloc.h>#include原创 2021-12-19 18:57:41 · 973 阅读 · 1 评论 -
遍历递归树求递推数列通项
考虑K阶变系数线性递推方程:现给定初值a1,a2,—,ak和n>k,要求编程打印an,an-1,—,ak+1的值该问题用常规的迭代法非常容易解决,现在要考虑的是用遍历递归调用树的方法求解。n=7,k=3时,递归调用树为package programm; //遍历递归树中所有节点,相同值会重复计算import java.util.*;public class RecursionTree { public static void ..原创 2021-12-19 18:53:04 · 350 阅读 · 0 评论 -
用回溯法和栈解决阿里面试题排队问题
最近在网上搜索有关Catalan number的资料时发现了一道有关Catalan number的很有趣的问题。题目为有12位高矮不同的人,将他们排成两排,每排六人,要求每排六人均从矮到高排列且第二排每个人的身高均大于第一排对应的人的身高,问满足要求的排列方法有多少种。关于这个问题,不妨直接考虑一般情形,12人为2n人,网上对此的分析已经铺天盖地,答案就是Catalan number n+1/C(n,2n),具体的分析过程这里就不再重复赘述了,这里我们主要考虑用计算机解决排队问题,不仅要用高效的算法求出排法原创 2021-12-18 22:24:20 · 628 阅读 · 0 评论 -
试解2014ACM大赛赛题守望者逃离荒岛问题
题目如下:恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵,率深藏在海底的那加企图叛变:守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去,到那时,刀上的所有人都会遇难:守望者的跑步速度,为17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。现在已知守望者的魔法初值M,他所在的初始位置与岛的.原创 2021-12-18 21:28:35 · 567 阅读 · 0 评论 -
生成所有错位排列的算法
所谓N元错位排列,就是指对应于1,2,–,N的N元排列Im(m=1,2,—,N),满足Im!=m,算法的目的是构造出所有这样的错位排列,依据的基本思想是回溯法,在沿栈向下试探的过程中逐步扩大部分错位排列的规模,当发现无法找到下一个部分错位排列的元素时就向上回溯,继续试探,当当回溯至栈空间首元素且栈空间首元素stack[0]==N+1时,表明首元素为2,–,N的所有错位排列已全部试探得到,错位排列生成完毕,退出循环。这里给出算法,该算法生成对应于1,2,—,N的所有N元错位排列代码(C++)#inc原创 2021-12-18 21:24:25 · 477 阅读 · 0 评论 -
多重全排列的生成与构造算法
设有a1+a2+—+aK=N,a1,a2,—,aK为正整数(K>=2),将a[1],a[2],—,a[K]K个数排列至1,2,—N这N个排列位置上,使得a[1],a[2],—,a[K]所占据的排列位置数恰好分别为a1,a2,—,aK,这样占据1,2,—NN个排列位置的a[1],a[2],—,a[K]构成的排列为一个排列位置数为N,排列数数目为K的多重全排列。现在介绍算法,该算法能够生成符合上述要求的所有多重全排列说明:以下二种算法仅适用于k>=2的情形,k=1为特殊情形我没有专门处理,不原创 2021-12-18 21:22:56 · 899 阅读 · 0 评论 -
构造N个节点的所有HB(k)树(广义AVL树)实现
回顾一下HB(k)树的定义:HB(k)树要么是空树要么是满足如下条件的二叉搜索树:其左右子树均为HB(k)树,且右子树高度和左子树高度差的绝对值小于等于k.现在给定从小到大排序的N个关键码,现要构造出这些关键码对应的所有HB(k)树,算法如下(C++实现)#include <iostream>#include <vector>#include <utility>#include <algorithm>#include <memo原创 2021-12-17 21:28:40 · 393 阅读 · 0 评论 -
阿拉伯数字和中文大写形式的相互转换
将阿拉伯数字转化为中文大写是很简单很实用的功能,但由于0这个特殊数字的存在使得实现起来并非那么容易,实现这一功能的关键就是对0的正确处理。该程序是我几个月之前写成的,当时没有加注释,现在程序的实现细节基本忘光了,难以写出注释。只能凭自己模糊的印象大致部分地介绍一下思路和方法,当初思路中的细节已经无法回忆了,没有注释的代码大家只能将就看一下,能看懂最好看不懂也没办法我当初的想法是现将输入的阿拉伯数字的每一位单独分离出来,按从低位到高位的顺序存放在线性链表里,然后从低位到高位扫描链表。将数字从低位至高位每四原创 2021-12-11 01:49:49 · 1544 阅读 · 0 评论 -
构造拉丁方阵和正交拉丁方阵组
将1,2,–,n这n个数填入n*n矩阵,使得每行每列的数两两不同(都是1,2,–,n的全排列),这样的n阶方阵是拉丁方阵。如果一对n阶拉丁方阵对应的元素构成的有序对两两不同,则称这一对n阶拉丁方阵是正交的。现要编程用计算机构造出所有的n阶拉丁方阵和n阶正交拉丁方阵组,该怎么做? 一个显然的事实是,n阶拉丁方阵中各行i元素(i=1,2—n)是两两不同列的。所以按a1,—,an(为1,2–n的置换)顺序向各行填入ai(i=1,2,–,n),使其两两不同列,就能得到一个正交拉丁方阵。我们可以按1,2,—,..原创 2021-12-11 01:42:32 · 1913 阅读 · 0 评论 -
回溯算法经典问题-迷宫问题
迷宫问题是一道经典的回溯算法问题,给定一个迷宫矩阵,矩阵中的1表示障碍,0表示可走通路,给定迷宫入口出口,要求寻找从入口穿过迷宫到达出口的所有路径,有则输出,无则给出提示。一本合格的数据结构教科书一般都会介绍迷宫问题,网上的分析也是铺天盖地,这里就不再赘述重复的内容了。废话不多说,简单介绍一下程序,然后上代码。 该程序用二维数组表示迷宫,用另一个二维数组记录迷宫中的位置是否已经走过,同时用一个链式栈存放搜索出的临时路径。程序从迷宫入口开始试探,随着回溯试探过程的进行,链式栈的长度不断变化,当试探到...原创 2021-12-11 01:37:28 · 1942 阅读 · 0 评论 -
01序列最少交换次数
输入一个由男女程序员组成的序列FFMMFMMMFF,现要通过适当的交换操作让女程序员全部排在男程序员前面,即使原序列变成FFFFFMMMMM,问至少需要交换多少次,交换次数最少的交换操作是什么?以下程序效率不高,但使用该程序在每次都将被交换的女程序员放在已得到的从序列头开始连续排列的女程序员序列的最后一个女程序员的后一位置的情况下可找出所有可能的交换操作序列,所以还是有一定的价值.至于最小交换次数,假设女程序员有F个,我们只需得到序列从头部算起连续F个程序员中男程序员的数目,即为最小交换次数,至于为原创 2021-12-11 01:16:11 · 1151 阅读 · 0 评论 -
DFS非递归实现搜索图中两顶点间的所有路径
搜索无向图或有向图中两顶点间的所有最短路径应当使用DFS,配以适当的回溯操作即可实现路径搜索,具体代码如下,完全使用非递归方法实现#include <iostream>#include <vector>#include <stdio.h>#include <malloc.h>#define N 6 //无环单边非负权重无向图顶点数using namespace std;struct Path //路径节点结构体类型{ in原创 2021-12-11 01:04:59 · 1619 阅读 · 0 评论 -
带附加头节点的广义表运算c++源码分享
之前文章里给出的基于广义表链表表示的运算中用链表表示的广义表除广义表本身外的其他所有子表都是没有附加头节点的,即utype==1的节点(在同一层子表中表示为该子表的子表的表元素)的hlink指针直接指向下一层子表的表头,而不是附加头节点,这是一个疏忽。所以我把所有适用于广义表没有附加头节点的链表表示的相关运算的c++实现进行了修改,修改后的源码可以适用于有附加头节点的情形,完成的功能保持不变。找出所有子表及相关属性#include "stdafx.h"#include <iostream&原创 2021-12-06 21:48:10 · 891 阅读 · 0 评论 -
根据广义表建立对应二叉树(子女兄弟链表表示)并由二叉树输出对应广义表(子女兄弟链表表示)的C++非递归算法
根据输入的广义表建立子女右兄弟链的二叉树表示,该二叉树对应于广义表对应的普通树。先考虑更复杂的情形,如果广义表中存在共享表,则将其转换为带共享子树的二叉树表示,每一共享子树带有附加头节点,其左链指针指向共享子树,最后输出带共享子树的子女右兄弟链表示(广义表形式)C++代码:#include "stdafx.h"#include <iostream>#include <stack>#include <string>#include <map>原创 2021-12-06 21:44:23 · 1024 阅读 · 0 评论 -
将二叉树(子女兄弟链表)调整为树然后将树转换为二叉树(直接修改) 非递归算法
将子女兄弟链表调整为普通树然后将普通树调整为子女兄弟链表,注意是在原树上直接进行调整,不是根据原树创建转换后的新树,为了操作方便,树指针域用vector表示C++代码:子女兄弟链表存在共享子树情形:#include "stdafx.h"#include <iostream>#include <stack>#include <vector>#include <string>#include <map>using namesp原创 2021-12-06 21:41:12 · 349 阅读 · 0 评论 -
字符串广义表和多叉树、普通树以及多叉树、普通树和广义表链表表示的相互转换(非共享表情形)
程序用string对象接受广义表字符串的输入并将其转换为多叉树,然后将该多叉树转换为字符串广义表输出#include "stdafx.h"#include <iostream>#include <string>#include <vector>using namespace std;class Knode //k叉树节点{public: char data; //节点数据域 Knode **p; //指向各子节点指针数组原创 2021-12-06 21:37:53 · 441 阅读 · 0 评论 -
多叉树和普通树的复制,删除和比较的非递归实现(深度优先遍历)
多叉树的复制很简单深度优先遍历要拷贝的树,要拷贝的树的遍历指针刚好比目标树拷贝指针快一步,这样就能实现要拷贝的树的子节点副本和拷入的目标树的父节点的连接代码:(所有运算均用c++实现) 程序接受广义表字符串输入,将其转化为多叉树,然后复制多叉树并转换为广义表输出#include "stdafx.h"#include <iostream>#include <vector>#include <string>using namespace std;c.原创 2021-12-06 21:34:47 · 806 阅读 · 0 评论 -
字符串模式匹配的KMP算法中next数组计算方法详解
使用KMP算法匹配字符串的关键就是正确计算出next数组(不清楚何为模式匹配,何为KMP算法,什么是next数组可以自行百度或参考数据结构教科书)。next数组的计算是一大难点,殷人昆的数据结构教科书中对此问题的论述不够清晰,所列代码和说明部分关联性不强,看了让人似懂非懂。自己花了很长时间琢磨next数组计算的问题,现在总算从头到尾弄明白了,于是就在这里将自己的思考所得与大家分享。 现有长为M的模式串P=a0 a1 —– aM-1,记P在索引i,j之间的部分(包括i,j)为P[i,j],...原创 2021-12-06 20:54:25 · 5928 阅读 · 0 评论 -
Dijkstra调度场算法
Dijkstra发明的调度场算法用于将中缀表达式转为前缀或后缀表达式,本文目的是简要介绍调度场算法并给出分析和说明网上众多作者采用自然语言描述转换算法,因此对转换算法的描述不够清晰直观。这里花费了一点时间绘制了中缀转后缀前缀的算法流程图,用流程图描述转换算法更直观易懂,便于读者学习,绘制的流程图如下。为简化问题,假设要处理的中缀表达式只由算术运算符+-*/和圆括号()组合而成。中缀转前缀算法和中缀转后缀完全类似,只不过转后缀需要从左至右扫描表达式,转前缀正好相反,此外后缀算法中左右括号为前缀算法的右左括原创 2021-12-06 20:26:31 · 586 阅读 · 0 评论 -
LALR(1)分析实现一个简易的正则表达式引擎
首先给出博主自己编写的正则表达式文法(在编译器构造中自底向上的LALR(1)语法分析的语法分析表生成的实现这篇文章里已经出现过):#1b S’ S preSurvey E T M F G outSquare B V C B’ inSquare inSquareRange #1e#2b \ SPECTRANMETA POSITIVE-SURE-PRE POSITIVE-NEGA-PRE NEGATIVE-SURE-PRE NEGATIVE-NEGA-PRE ) | CLOSURE ? GIVEN LBO原创 2021-12-03 01:14:08 · 528 阅读 · 1 评论 -
编译器构造中自底向上的LALR(1)语法分析的语法分析表生成的实现
提示:阅读本文需掌握编译原理的相关基础知识本文中使用C++语言系统地实现了龙书中LALR(1)语法分析表的构造算法,首先计算增广文法的LR(0)项集族,每一个项集只包含内核项,计算过程中自动生成了LR(0)自动机,该自动机使用基于十字链表存储结构的有向图表示。然后通过确定自发生成和传播的向前看符号算法计算各LR(0)内核项集自发生成的向前看符号(增广文法新增产生式的向前看符号不包括在内)并确定LR(0)内核项集之间向前看符号的传播关系。最后一遍扫描前将为增广文法新增产生式添加向前看符号即输入结束符$,然原创 2021-12-03 01:07:04 · 1542 阅读 · 1 评论