- 博客(17)
- 收藏
- 关注
原创 图的m着色问题
图的m着色问题问题:给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。输出为成功的数量。解析:为了更清楚的理解问题,接下来举个例子:(图来自网络)这里的图共有四个顶点、四条边、按照右侧树的说明共有三种颜色可上。其实从右侧的树可以很清楚的看到每个顶点都有m种着色方法。当根与左右子树的任一个节点是相同的颜色则说明着色方法错误。设计:这里用到了回溯的方法。从第1个点开始搜,依次填
2021-06-21 20:46:04
558
原创 最优前缀编码
最优前缀编码先来理解一下什么是最优前缀编码: 最优前缀编码,也称 Huffman 编码。这种编码组合的特点是对于较频繁使用的元素给与 较短的唯一编码,以提高通讯的效率。理解了最优前缀编码后一起来看一下问题:给定字符集C={x1,x2,…,xn}和每个字符的频率f(xi),求关于C的一个最优前缀码。解析:解题前最重要的就是确定用什么算法去实现,这里很明显使用哈夫曼算法来解决。学过数据结构的应该对哈夫曼树比较熟悉了。这里举个例子:选取几个数分别为:6、2、7、9、5对他们进行排序后:2
2021-06-21 19:51:21
4144
2
原创 背包算法
背包算法问题:有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?问题分析:在选择装入背包的物品时,对于物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入物品i的一部分。假设xi表示物品i被装入背包的情况,当xi=0时,表示物品没有被装入背包;当xi=1时,表示物品被装入背包。在决策xi时,问题处于下列两种状态之一:1、背包容量不足以装入物品i,则xi=0,装入背包的价值不增加2、背包容量足以装入物品i,则xi=1,
2021-06-20 10:32:15
1021
原创 LCS算法
LCS算法LCS算法:LCS是Longest Common Subsequence的缩写,即最长公共子序列。一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列。LCS不是唯一的,它可以有很多种,例如<A,B,C,B,D,A,B>和<B,D,C,A,B,A>的最长子序列可以是<B,C,A,B>也可以是<B,C,B,A>,显然都成立。问题:解析:设Xi=<x1,x2,…,xi>Yj=<y1,y2,
2021-06-20 10:19:08
3666
原创 矩阵链乘法
矩阵链乘法问题:可以看下例子加强对问题的理解:例:设P = < 10,100,5,50>,则A1:1005、A2:1005、A3:550,同时还有(A1(A2,A3)):101005+10550=7500、((A1,A2)A3):1010050+1005*50=75000。不难看出,一个乘法顺序的变化,乘法数量就有了十倍的差距,所以求的一个最有乘法以减少乘法数量是很关键的。解析:前提:学代数的应该都知道,两个矩阵相乘是有条件的,就是即A的列数等于B的行数时,才能相乘。如果A是p×q
2021-06-19 21:31:57
241
原创 投资问题(动态规划)
投资问题问题描述:实例:解析:假设分配给i个项目的钱是xi,问题描述为:目标函数:max{f1(X1)+f2(X2)+…+fn(Xn)}约束条件:X1+X2+X3+…+Xn=m, Xi∈n;设Fk(X)表示X万元投给前k个项目的最大收益,k=2,3,…,n,X=1,2,…,m递推方程:Fk(X)=max{fk(Xk)+Fk-1(X-Xk)},k=2,3,...,n设计:核心代码:其实非常简单,就是从一个项目开始,慢慢增加项目,在每个项目中都用一个for循环,将所有投资的钱投
2021-06-02 09:32:11
386
原创 装载问题
装载问题问题:假设有两只船,各可以载重c1,c2。同时有n个集装箱,每个集装箱重量为w[i],问能否将集装箱放入船内,能放入则就最优载重。分析:其实和背包问题如出一辙。如果一个给定的装载问题有解,则我们采用的策略应该是:先将第一艘轮船尽可能装满,然后将剩余的集装箱上第二艘轮船(如果不能把所有物品装入第二艘船那么问题无解)。将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近c1(即求出最解)。由此可知,装载问题等价于特殊的0-1背包问题。递归算法解决。没有到达叶结点
2021-05-18 16:11:16
3953
原创 选第k小元素:特定分治策略
选第k小元素:特定分治策略其实就是分两步:第一步,排序;第二步,寻找。但这里为了加快寻找的速度,不是将数组里所有的数一次性无脑排序,而是以5个元素为一组进行排序,再将每组中的中位数分为一个新数组进行排序,取出新数组中的中位数,这样就可以得到数组a中的中位数了。再将数组中所有元素与中位数进行比较,计算比中位数小,等于,大的元素的个数,将所要取的k值与其进行比较,缩小查找范围,在哪一个分区,就按上述方法重新操作,即可得到第k小的元素。这里的排序我用到了二分归并排序,比较高效。核心代码就是上述的过程,源代
2021-04-24 22:58:38
138
原创 平面最近点对问题(分治思想)
平面最近点对问题(分治思想)平面最近点对顾名思义就是在一个二维平面内找到距离最近的两个点。用到分治思想,可以很好的减少复杂度。接下来进行解析。首先将输入的坐标按照x坐标大小排序,并二分为左右两块区域在左右两块区域都可以得到一个最近点对距离,取最小值作为暂时的ans考虑完左右两边的情况以后再考虑两个点分别在左右的情况,很显然这种情况就不用所有点都考虑,那就没必要二分了。我们以中间的点为标准,划分一个新区域,区域范围为中间点向左右都取ans’的大小为了进一步减少计算量,我们可以在y坐标上下功夫,
2021-04-14 21:43:19
3464
原创 二分归并排序
二分归并排序二分归并排序算法使用了分治思想。不断将数组分割成左右两部分,直到不能分割,然后排序完后再合并成一个新数组。步骤:1、分割:n个数的数组分割成两份n/2个数的数组。2、排序:给每一半数组都排序,这里利用了归并排序3、合并:重新合并为一个数组源代码:#include <iostream>#include<cstdlib>#include<ctime>using namespace std;const int MAX_SIZE = 10
2021-03-29 16:17:02
529
原创 两个常用的检索算法
两个常用的检索算法前提:在一个排好序的数组T[1…n]中查找x一、顺序查找顺序查找在我们这种数据规模不大的情况下还比较适用,毕竟简单,小学生都会。但在大数据情况下完全不能使用,因为顺序查找的时间复杂度是O(n),当n非常非常大的时候,然后运气有非常差的时候,需要非常非常久的时间才能得出结果。二、二分查找二分查找是用的比较多的检索算法,既简单又适用。折半计算的核心思想让查找非常高效。解析:二分查找其实就是在直到数组长度的情况下,设置好左右的下标left=0&right=array.leng
2021-03-22 15:46:18
761
原创 Floyd算法&&Dijkstra算法
Floyd算法和Dijkstra算法一、Floyd算法1、简要介绍:****Floyd算法又称插点法,是利用动态规划的思想寻找有权图多源点之间最短路径的算法,算法目的是寻找从点i到点j的最短路径。2、步骤:以此图为例Floyd算法核心就是大循环N次下,循环所有点作为一个中转点f,去比较点i到点j的距离和点i到点f的距离加上点f到点j的距离。将较小的值作为点i到点j的距离。如此图,先从 点1(i = 1)开始,若将点2(k = 2)作为中转点,想要计算的点为点3(j = 3),比较<1,3
2021-03-16 17:31:59
1907
原创 最小生成树——Prim算法和Kruskal算法
最小生成树——Prim算法和Kruskal算法一、prim算法解析以上图为例。prim算法从任意顶点开始,每次都找到一个距离顶点集中距离最近的一个点,将其加入到顶点集,并把两点间的边加入到树中。直到访问完所有点,得到的就是最小生成树。步骤:1、从点A开始,将其加入到顶点集中,此时涉及的边有两条,[A,B]和[A, C],显然可以判断出后者距离更小,所以把C点加入到顶点集中。2、在此顶点集中,涉及的边数增加,在所有边中继续寻找顶点集中没有的距离最短的点。这里可以找到第三个点为F。以此类推,可
2021-03-09 09:46:08
1476
2
原创 连接Eclipe与Github
连接Eclipe与Github1、在Github创建一个仓库2、新建一个文件夹,打开CMB控制台。打开刚刚新建文件夹,输入“git clone+仓库地址”复制到本地。文件夹中新文件夹,为仓库名。需要额外下载一个插件用来执行clone命令,链接:https://sl-m- ssl.xunlei.com/h5/page/download-share/index.html?entry=link&appType=PC&videobtindex=-1&storid=c5o1
2021-01-08 19:39:00
1046
原创 JAVA多态
JAVA 多态面向对象程序设计的三大支柱是封装、继承和多态。概念多态(baiPolymorphism)按字面的意思就是“多种状态”,指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。首先定义两个有用的术语:子类型和父类型。实际上一个类定义了一种类型。子类定义的类型称为子类型(subtype), 而父类定义的类型称为父类型(supertype)。举个例子:球场上一共有三种运动器材:A:篮球B:足球C:网球这里所表现的的就是多态。篮球、足球、网球都有一个共同
2020-12-03 22:15:15
217
原创 JAVA抽象类和接口Wonder_b
JAVA 抽象类和接口一、抽象类定义在继承的层次结构中,每个新子类都使类变得越来越明确和具体。如果从一个子类追溯 到父类,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽 象类(abstract class)提示:抽象类不可以用于创建对象。抽象类可以包含抽象方法,这些方法将在具体的子类中实现因为类的设计应该确保父类包含它的子类的共同特征,所以父类应该具有同一类型子类共有的一些方法,例如Geo
2020-12-02 18:58:31
175
原创 java正则表达式 Wonder_b
Java正则表达式1. 正则表达式概念正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。2.例子字符说明\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n"匹配字符"n”。"\n"匹配换行符。序列"\“匹配”","(“匹配”("。^匹配输入字符串开始的位置
2020-10-31 19:46:22
110
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人