算法
是牛大春呀
希望在学习生涯中多写一点博客,分享一下自己的拙见。我想,激情也许会随着岁月的流逝而逐渐褪去,但,热爱与信仰一定会一直陪伴着我们。
展开
-
递归+贪心+回溯解决TSP问题
旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。 ——————百度百科#include<iostream>#include<algorithm>#define MAX 20using namespace原创 2021-12-19 17:27:02 · 1526 阅读 · 0 评论 -
图的着色问题
问题1:图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。输入格式:输入在第一行给出3个整数V(0<V≤500)、E(≥0)和K(0<K≤V),分别是无向图的顶点数、边数、以及颜色数。顶点和颜色都从1到V编号。随后E行,每行给出一条边的两个端点的编号。在图的信息给出之后,给出了一个正整数N(≤20原创 2021-11-18 10:29:15 · 5784 阅读 · 0 评论 -
直接插入排序
直接插入排序的思想是:①将整个待排序的记录序列划分为有序区和无序区,初始时有序区为待排序记录中的第一个记录,无序区包括所有剩余的其他记录;②将无序区的第一个记录插入到有序区的合适位置中,从而使无序区减少一个记录,有序区增加一个记录;③重复执行②,直到无序区中没有记录为止。具体代码如下:void InsertSort(int array[],int n ){ int i , j ,temp; for(i = 1;i<n;i++)//执行的趟数:n-1次 { temp=array[原创 2021-01-03 16:52:58 · 150 阅读 · 0 评论 -
堆排序[算法]
堆排序的思想:先从无序的数组中,构建一个堆,可以是大根堆,大根堆的排序结果是从小到大的,小根堆的排序结果是从大到小的,为什么呢?因为大根堆生成后,接下来的操作是:堆顶和数组中最后的一个元素进行交换,交换后,堆顶数据的位置不再发生变化(位置不再发生变化的意思是:就是这个数已经是排好序的了,第一次是数组最后一个位置的数据,第二次就是倒数第二个,以此类推),也就是说,最大的,放在最后,然后进一步的操作就是:对剩下的数据(就是不包含刚才那个排好序的数) 生成一个次小的 大根堆,重复上述操作,堆排序如果构建的是一个小原创 2021-01-03 11:20:06 · 920 阅读 · 0 评论 -
【经典算法】 之 Dijkstra算法:求图中任意两顶点的最短路径
Dijkstra算法是图中找任意两点中最短路径的一种经典算法。重点的步骤总结如下:①:算法采用了并查集 (之后都叫它为 最短路径顶点集 ):即每次都找离开始顶点距离最短的顶点,然后把该顶点加入最短路径顶点集中(已经加入最短路径顶点集里的那些顶点 下一次就会跳过它了,并且,在顶点集里 任意两个顶点间的距离 都已经是最短)②:用来记录从源点(开始顶点) 到vi (0<=i<=numVertices) 的最短距离 的数组dist[numVertices] ,并且这个数组的元素值是会不断变化的,为原创 2020-12-19 12:13:05 · 4061 阅读 · 1 评论 -
两个经典的算法:图的深度优先搜索(DFS)、广度优先搜索(BFS)、和判断有向(或无向)图的连通分量个数并输出
什么是深度优先搜索呢?就是从一个切入点 切入,然后遇到符合条件的就进入递归,好比一个人走迷宫,找到路可以走就一直深入往下走,走啊走,走到死路的时候就回退到刚才的岔路口,走另外一条路,这样,人终会走出迷宫(不过走迷宫可以不走完,而这个图的遍历是要走完全部的)。图的深度优先搜索的方法和过程举例:比如说是下面这个图,如果从A开始出发的话那么过程就如图所示:A ->D ->F ->H ->I ->C ->B ->E ->G为什么会这样遍历呢? 这就和刚才的原创 2020-12-16 22:39:51 · 730 阅读 · 0 评论 -
哈夫曼(赫夫曼)树的生成、哈夫曼(赫夫曼)编码和对哈夫曼编码解码(译码)
“喂,兄弟,最近无聊透顶了,有没有什么书可看?”“我这有《三国演义》的电子书,你要不要?”“‘既生瑜,何生亮。’ 《三国演义》好呀,你邮件发给我!”“OK!,文件1M多大小,好像大了点。我打个包,稍等……哈哈,少了一半,压缩效果不错呀。”“太棒了,快点传给我把。” ——《大话数据结构》压缩和哈夫曼编码息息相关,压缩的原理简单点来说就是将要压缩的文本重新编码,减少不必要的空间,那哈夫曼编码要如何生成呢?哈夫曼编码的生成就得需要 哈夫曼树。那哈夫曼树是怎么生成的呢?假如,有 A(5) , B(原创 2020-12-03 21:44:48 · 517 阅读 · 0 评论 -
枚举法填运算符
输入五个运算数,A B C D E和 一个结果R,然后输出所有运算符能够使得等式 A?B?C?D?E=R成立的可能具体实现代码:#include<iostream>#include<cstring>#include<math.h>#include<stdio.h>#include<stdlib.h>#include<conio.h>using namespace std;int main(){ int j , i原创 2020-11-30 21:58:55 · 121 阅读 · 0 评论 -
1005 大数加法
输入第1行:大数A第2行:大数B(A,B的长度 <= 10000 需注意:A B有可能为负数)输出输出A + B输入样例68932147586468711654886输出样例537643802472这道题目一开始我以为就是简单的数相加,没想到是类似于“字符相加”就是说,这个 “数” 可能是10000 位的 这就是真的天文数字了啊如果用c++写的话,这个代码就会比较麻烦,要一位一位的处理不过如果用Java 写的话 ,因为 Java 里有完善的 类方法,就可以 使用Java提供原创 2020-11-15 23:20:59 · 85 阅读 · 0 评论 -
回文数[算法]
回文数 (20分)回文数是一种很有趣的数,正反读起来都一样,比如123321或者123454321,单个的数字还有0,都是回文数。但是我们熟悉的回文数都是十进制下的,现在我们加大难度,对一个给定的数,想知道它在其他进制下是不是回文数。输入格式:在一行中给出2的整数N和R,其中N是不超过10的9次方的正整数,是需要判断的数,R是基,R=10表示十进制,R=2表示是二进制,R是不小于2,不超过10的9次方的正整数。输出格式:对每一组输入,如果N在R进制下式回文数,那么就就第一行输出“Yes”,否则,输原创 2020-11-15 00:40:55 · 925 阅读 · 0 评论 -
快速排序[算法]
快速排序是我们经常用到的一种排序算法,它相比与 冒泡排序,时间的复杂度更小,速度更快,此排序采用了二分的思想,具体操作步骤如下:1:从左边随便找一个基数(为了方便,就找最左边的那个)2:然后最左边的那个下标记作i ,最右边的记作j ,然后,从右边找到一个比 之前那个基数小的数, 记录那个数的下标,然后,从左边找到一个比之前 那个基数大的数,同样的,记录它的下标。3:交换这两个数;4:重复2,和3 操作,直到i==j ,然后让第一个数 和 第i个数 交换;不断重复上述过程,直至最后 完成了两个数之原创 2020-10-04 18:52:06 · 253 阅读 · 0 评论 -
数塔问题(动态规划
从数塔的顶层出发,在每一个结点可以选择向左走或向右走,一直走到底层,要求找出一条路径,使得路径上的数值和最大解决这个问题,可以将这个大问题分为若干个子问题求解,但是,子问题之间却往往不是独立的,是相互关联的,如果用分治法求解,这些子问题的重叠部分被重复计算多次,动态规划法将每个子问题求解一次并将其解保存在一个表格(通常采用数组)中,当需要再次解此子问题时,只是简单地通过查表获得该子问题的解,从而避免了大量重复计算。对于这道题目,我们可以将从第二层开始,分为两个子树,然后,比较这两个子树从底层找一条路径原创 2020-09-27 13:00:41 · 2086 阅读 · 0 评论 -
埃及分数[算法]
埃及同中国一样,也是世界文明古国之一。古埃及人只用分子为1的分数,在表示一个真分数时,将其分解为若干个埃及分数之和,例如:7/8表示为1/2+1/3+1/24。设计程序把一个真分数表示为最少的埃及分数之和的形式这涉及到了贪心的思想,即,每一项都是减去前一项后,留下分子是1的最大真分数就可以了,所以如何找到真分数包含的最大埃及分数,就是解决问题的关键了。设真分数为A/B,B除以A的整数部分为C,余数为D,则有下式成立:B=AC+D即B/A=C+D/A<C+1(因为D/A是小于1的,因此呢,C+D/A原创 2020-09-26 15:06:27 · 5678 阅读 · 0 评论 -
选择排序 与反转排序
五月到六月 都没有 更新过博客 (期末任务太多了,忙不过来 ) 今天是2020年6月13日 23:44:01 周六 ,终于 结课了分享下 排序中 的 选择 排序和 反转排序应该 很多朋友 都 知道 冒泡 排序把 ,殊不知选择排序 和 反转排序 从运行时间上的效率 都比 冒泡排序 高 呢 ~下面说一下选择排序~选择排序:public class one1 { public static void main(String[] args) { int arry [] ={63,4,24原创 2020-06-14 00:02:28 · 161 阅读 · 0 评论 -
浅谈KMP算法
上一篇博客写到,如果我们想要在主串中寻找相对应的子串序列,我们可以利用BF算法进行查找,不过那种查找方式效率实在是太低了,因此就有了编程界的三位大神 一同发明了KMP算法,这个算法是基于BF算法的,不过多了一个NEXT 数组,这是一个智能的数组,它能够在 子串与主串 匹配失败的时候 指导 子串应该 如何开始继续和主串匹配,而主串就不用回溯到之前的位置。这个只能算法呢,主要是看 不匹配 字符 发生...原创 2020-05-02 16:35:35 · 159 阅读 · 0 评论 -
BF算法.
BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。这个思路和代码 还是比较简单的 就是用子串的字符 一个一个的和 主串进行对比,如果有不同就退出...原创 2020-05-02 01:59:42 · 241 阅读 · 0 评论 -
递归解决八皇后问题
八皇后问题,一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有 76 种方案。1854 年在柏林的象棋杂志上不同的作者发表了 40 种不同的解,后来有人用图论的方法解出 92 种结果。计算机发明后,有多种计算机语...原创 2020-04-28 02:50:54 · 290 阅读 · 0 评论 -
解决令人头疼的汉诺塔问题(递归)
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。代码如下 (这篇文章 的杆子 从左...原创 2020-04-27 19:55:50 · 221 阅读 · 0 评论 -
直接运算中缀表达式(不支持负数)
利用栈的特性,我们可以将中缀表达式直接转换为后缀表达式,然后呢,将它们存进 字符数组中,然后 将字符数组中的数字转化为数字后,遇到符号 就进行运算 ,就可以实现中缀表达式的运算了~具体代码如下#include<stdio.h>#include<stdlib.h>#include<math.h>#include<ctype.h>//isdig...原创 2020-04-27 00:59:55 · 303 阅读 · 0 评论 -
利用栈的原理,将中缀表达式转换为逆波兰表达式
今天来讲一下如何利用栈记忆的特性,将中缀表达式 转换成逆波兰表达式。可能有初学者会问,为什么需要转换成逆波兰表达式啊?这是因为,计算机识别不了中缀表达式,我们从计算器中输入的数据都是要通过转换,变成逆波兰表达式后, 再交给计算器计算的,如果学会了中缀表达式 转换成逆波兰表达式的方法,你就可以轻松编辑一个计算器啦~这篇博客可能对初学者来说会比较难以理解(博主是通过九牛二虎之力才搞明白的…o(︶...原创 2020-04-26 01:24:16 · 311 阅读 · 0 评论 -
利用栈的特性实现逆波兰表达式的运算(无括号)
百度原文:逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。这篇博客先讲 没有括号的 逆波兰表达式运算实现代码如下:#include<stdio.h>#include<...原创 2020-04-25 18:57:23 · 243 阅读 · 0 评论 -
利用双向循环链表解决比较棘手的输出问题
在这里插入图片描述就是输出字母的一道题目,题目是这样的:有A-Z个字母 正序排放,现如果输入一个正数N,那么前面N个数就会最后输入,如果输入的是一个负数N,那么 后面的N个数就先输出博主刚学完双向循环链表,感觉做这个 非常的简单,(但是如果没学的话,做起来无解 ,可能是博主太笨啦┭┮﹏┭┮)代码如下#include<stdio.h>#include<stdlib....原创 2020-04-24 20:59:42 · 229 阅读 · 0 评论 -
双向循环链表的创建,插入,读取,与删除操作
今天我学习了双向循环链表,不过与以往的不同,这次的双向循环链表 有坑,是巨坑… 我以为写的会很顺利 没想到 我竟然踩了“雷”…好尴尬哦,下面我们来学习这个 双向循环链表把~对了,说一下为什么需要双向循环链表把,如果一个链表是单向的,那么,如果在读取过程中,要读取已读取数据的前一个 或者前面几个数据怎么办呢? 比如 1–>2–>3–>4–>5 如果是循环链表的话,我读到了...原创 2020-04-24 20:02:16 · 832 阅读 · 0 评论 -
循环链表解决拉丁方阵问题
拉丁方阵是一种N*N的方阵,方阵中恰巧 有N种不同的元素,每种元素恰好有N个,并且每种元素在一行和一列中恰好出现一次,例如这下面这个图片就是一个3X3的拉丁方阵这个实在太简单了…操作只要两步 创建循环链表,移动头结点…但是如果没有学链表的话 ,写起来可能很麻烦把…我想了一下,的确非常的麻烦… 链表真是个好东西啊!代码如下:#include<stdio.h>#include&...原创 2020-04-24 01:57:38 · 256 阅读 · 0 评论