- 博客(14)
- 收藏
- 关注
原创 算法作业5
问题:给定平面S上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。解析:在n个点中找出距离最近的一对点,我们首先可以想到的方法就是暴力穷举的方法:遍历整个点集,计算每一对点之间的距离d,就能找出最短距离dmin。显然这样的方法时间复杂度为O(n2),时间复杂度太高,若问题规模较大,穷举的算法并不是一个合适的算法。在利用分治法解决该问题时,我们先要考虑划分,即将整个点集划分为两各部分S1和S2,每个子点集的点的数量都为n/2,最近点对会出现以下三种情况:点对在S1中;点
2021-06-23 20:29:23
85
原创 算法作业3
问题:写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度结果即可。解析:方法一:二分查找法将x和数组中间值T[m]比较,若相等则查找成功,如果不相等则看x大于还是小于T[m],缩小范围,直到查找到下标j,或查找结束,得出x不在数组中,返回j=0。方法二:顺序查找法从数组的第一个数开始按顺序查找,将每一个数与x相比,如果相等输出下标j,如果到结尾了还没找到,则输出j=0;设计:#inc
2021-06-23 20:23:31
85
原创 算法作业1
问题:1.1在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得到的 w(T) 最小,则此 T 为 G 的最小生成树。1.2在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得到的 w(T) 最小,则此 T 为 G 的最小生成树。解析:2.
2021-06-23 20:19:09
290
原创 算法作业12
问题:图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。解析:在填写每一个顶点的颜色时检查与相邻已填顶点的颜色是否相同。如果不同,则填上;如果相同(冲突),则另选一种;如果已没有颜色可供选择,则回溯到上一顶点。重复这一过程,直到所有顶点的颜色都已填上。设计:#include<iostream>using namespace std;#define MAX
2021-06-23 19:55:10
104
原创 算法作业11
问题:给定给定字符集C={x1,x2,…,xn}和每个字符的频率f(xi),求关于C的一个最优前缀码解析:构造最优前缀码的贪心算法就是哈夫曼算法。将字符集作为森林,从中选出频率最低的两个字符,将这两个字符的合并成一棵新树,新树的根节点权值为两字符频率之和,从森林中删除这两个字符,将新树加入森林,重复直至全部合并为一颗树,即为所求的哈夫曼树。设计:void minHeapify(int i){int l;int r;int min;node temp;l = i * 2;r = i *
2021-06-23 19:50:18
80
原创 算法作业10
问题:有一批共n个集装箱要装上两艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且 ,装载问题要求确定是否有一个合理的装载方案可将这些集装箱装上这两艘轮船。如果有,找出一种装载方案。设计:void BackTrack(int t){ if(t>n) { if(cw>bestw) { for(int i=1; i<=n; i++) { be
2021-06-23 19:44:05
116
原创 算法作业8
问题:设给定n个矩阵的链<A 1 ,A 2 ,…,A n >,其中i=1,2,…,n,矩阵A i的维数为p i-1 ×p i 。给定向量 P,确定一种乘法次序,使得计算乘积A1 A2 …A n 所需的标量乘法次数最小。设计:#include<stdio.h>int PrintDivi(int (*p)[6], int start, int end){ int Divi; Divi = p[start][end]; if(start == end) printf("
2021-06-23 19:39:01
84
原创 算法作业6
问题:设L是n个元素的集合,从L中选取第k小的元素,其中1<=k<=n。这里第k小的元素是指,当L按从小到大排好序之后,排在第k个位置的元素。利用特定分治策略选出第k小的元素。解析:k=|S1|+1, m’ 就是所要找的第k小的数(以m’为划分标准后, 比m’小的有|S1|个,如果恰巧k=|S1|+1, 则m’就是所要找的第k小的数)k<=|S1|,归约为在s1,中找第k1小的子问题,k1在子问题中相对位置不变,即k1=k ;k>|S1|+1,归约为在S,中找k2位置的
2021-06-23 19:33:59
129
原创 算法作业4
问题:二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k解析:二分归并排序采用了分治的思想,将序列不断划分成左右两个序列,然后依次将小序列进行排序,然后归并到大序列中。设计:#include<stdio.h>#include<stdlib.h>int Merge(int a[],int head, int mid, int tail){ int j, k, h; j = head; h = mid + 1; k = head; in
2021-06-23 19:26:57
91
原创 算法作业2
问题1.1用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵),按实验报告模板编写算法。1.2对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。解析:2.1Floyd算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的原理是动态规划。2.2Dijkstra算法:从一个顶点到其余各顶
2021-06-23 19:18:14
99
原创 对多态的理解
多态的概念:多态是同一个行为具有多个不同表现形式或形态的能力。为了在Java中实现多态,先了解什么是“继承”。面向对象的编程允许你从已经存在的类中定义新的类,这称为继承。继承使得你可以定义一个通用的类(即父类),之后扩充该类为一个更加特定的类(即子类)。继承关系使一个子类继承父类的特征,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来就不成立。例如:每个圆都是一个几何 对象,但并非每个几何对象都是圆。多态即体现为父类引用变量可以指向子类对象。...
2021-01-07 21:46:34
238
原创 抽象类和接口
抽象类和接口1.抽象类1.1抽象类的定义:在继承的层次结构中,每个新子类都使类变得越来越明确和具体。如果从一个子类追溯到父类,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类(abstract class)。下面是一个抽象类方法的声明:abstract void fun();1.2抽象类的特点:(1)抽象方法必须为public或者protected(因为如果为private,则不能被子类
2021-01-07 21:26:28
66
原创 关于Java实现正则表达式
关于Java实现正则表达式正则表达式是计算机科学的一个概念,通常被用来检索、替换某些符合某个模式(规则)的文本。在Java中,当字符串之间有多个不同符号时,使用正则表达式可以简便地分隔字符串。下面列举两种实现的方法:多个分隔符可以用“|”分开:String str = "abc;123,456?999|haha"; String[] strs = str.split(";|,"); for(String s: strs) { System.out.println(s);上述代码
2020-10-20 15:53:13
151
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人