算法分析 重庆邮电大学第一次实验
时空关联性分析方法研究与应用

时空关联性分析方法研究与应用摘要:随着信息技术、通讯技术、数字存储技术和高速数据获取技术的迅猛发展,在交通、电力、物流、环境监控、工业生产等领域积累了大量与时间和地理空间相关的数据资源,可这些随时随地获取的、呈爆炸性增长的数据资源在给我们带来丰富信息的同时,“数据越丰富,知识越贫乏”的问题则日益突出。
近年来,越来越多的学者认识到,通过研究空间对象随时间的变化规律,发现数据的时空关联规则,分析数据的时空变化趋势并预测未来的时空状态,对于规划建设、指挥调度、应急管理、信息服务等具有重要的应用价值。
本文研究的目的是面向智能交通领域,在时空关联性分析基础上,利用时空关联规则挖掘方法获取含时空约束的关联规则,从而进行交通拥堵趋势分析,为道路导航、趋势查询、交通控制等提供辅助决策信息。
时空关联性分析是研究空间对象随时间的变化规律,反映时空数据在时间和空间上的关联性,时空关联规则挖掘作为时空关联性分析的主要方法之一,目前已有不少学者对其进行了研究或应用。
本文详细介绍了时空关联规则挖掘的研究现状,通过分析现有时空关联规则算法在同时考虑时间和空间约束方面的不足,实现了一种新的时空关联规则挖掘方法。
文中首先对时空数据进行空间关联性分析和时间段划分形成事务表,然后对空间关联的项集进行连接并产生时空关联规则。
在算法执行过程中,对关联规则挖掘相关的阈值进行了分析,使挖掘所得的结果能更好的满足用户的需求。
算法分析和实验对比表明,同时考虑时间和空间约束,能够在分析过程中及时过滤不相关的数据,提高时空关联规则的获取效率,能够有效地发现时空关联规则。
在理论研究的基础上,本文设计并实现了一个基于时空关联规则分析交通拥堵趋势的原型系统,可有效地实现时空关联性分析和结果的可视化。
关键词:时空关联性分析,时空关联规则,可视化,阈值分析,交通拥堵时空关联性分析绪论当前像气象预报、环境监测和交通控制等领域,在问题的求解过程中越来越需要同时考虑时间和空间因素,而时空关联性分析的目标就是明确时空数据的时间有效性和空间可达性,从而在时间和空间上进行有效的趋势分析和预测。
重庆邮电大学-软件技术基础--实验报告(耿道渠)

《软件技术基础》实验报告实验名称:顺序表的操作班级学号姓名第9 周星期 2 、5,6 节成绩一、实验目的:1、掌握顺序表结构的实现方式;2、掌握顺序表常用算法的实现;3、熟悉利用顺序表解决问题的一般思路;4、参照给定的顺序表的程序样例,验证给出的顺序表的常见算法,领会顺序表结构的优点和不足。
二、实验内容:1、设计一个静态数组存储结构的顺序表,要求编程实现如下任务:(1)建立一个顺序表,首先依次输人整数数据元素(个数根据需要键盘给定)。
(2)删除指定位置的数据元素(指定元素位置通过键盘输入),再依次显示删除后的顺序表中的数据元素。
(3)查找指定数据的数据元素(指定数据由键盘输入),若找到则显示位置,若没有找到则显示0。
2、使用顺序表实现一个电话本的管理程序,电话本中的每条记录包括学号、姓名、手机号码和固定电话四项。
要求实现菜单、初始化、添加、删除和显示等功能。
三、实验结果:四、实验中遇到的问题及解决方法:第一次编写C++,感觉力不从心,回去多看看PPT。
五、实验心得体会:对顺序表的一些常用语句不熟悉,对顺序表的整体思路理解不深刻以后要加强练习附:源程序(自行编写或修改的程序。
若为修改程序请注明修改部分的功能,若为书上实例则可不附。
)#include <iostream>#include <string>#include <stdlib.h>#include <iomanip>#define MAXSIZE 20using namespace std;int num;typedef struct{string student_number;string name;string tel;string home_phone;int id;} TEL;void shuaxin(TEL *);void delet(TEL *);void find(TEL *);void show(TEL *);int main(void){int choose;TEL List[MAXSIZE];while(1){cout << "***************************欢迎来到XXX电话本系统*********************" << endl;cout << "1.初始化并建立" <<endl;cout << "2.删除" <<endl;cout << "3.查找" <<endl;cout << "4.显示全部" << endl <<endl;cin >> choose;system("cls");while( choose < 1 || choose > 4){cout << "输入错误,数字1-4,请重新输入!" << endl;cin >> choose;system("cls");}switch(choose){case 1: shuaxin(List); break;case 2: delet(List); break;case 3: find(List); break;case 4: show(List); break;}//system("cls");}return 0;}void shuaxin(TEL * list){int i,j;for(i = 0; i < MAXSIZE; i++){list[i].id = i + 1;list[i].home_phone = "none";list[i].name = "none";list[i].student_number = "none";list[i].tel = "none";system("cls");cout << "初始化成功,现在开始建表:" << endl;cout << "请输入需要建立的电话个数:(小于" << MAXSIZE << ")"<<endl;cin >> num;while( num < 1 || num > MAXSIZE ){system("cls");cout << "输入错误,请重新输入" << endl;cin >> num;}system("cls");cout << "请依次输入学生的学号,姓名,移动电话,家庭电话" << endl;for(j = 1; j <= num; j++){cout << j << '.';cin >> list[j - 1].student_number;cin >> list[j - 1].name;cin >> list[j - 1].tel;cin >> list[j - 1].home_phone;cout << endl;if(num == (j - 1) ){system("cls");cout << "建立表完毕!" << endl;}}void delet(TEL * list){int j,i = 0;cout << "请输入你需要删除的序号" << endl;cin >> j;while( j < 0 || j > num){cout << "输入错误,请重新输入" << endl;cin >> j;}while(list[i].id != j)i++;for(j = i; j < num - 1; j++){list[j].name = list[j + 1].name;list[j].tel = list[j + 1].tel;list[j].student_number = list[j + 1].student_number;list[j].home_phone = list[j + 1].home_phone;}list[j].home_phone = "none";list[j].name = "none";list[j].student_number = "none";list[j].tel = "none";num--;system("cls");cout << "删除完毕" << endl;}void find(TEL * list){string telnum;int i,key = 0;cout << "请输入你需要查找的电话号码" << endl;cin >> telnum;system("cls");for(i = 0; i < MAXSIZE; i++){if(telnum == list[i].tel || telnum == list[i].home_phone){if(key == 0)cout << "依次学号姓名移动电话家庭电话" << endl;cout << list[i].id << '.';cout << setw(12) << list[i].student_number;cout << setw(10) << list[i].name;cout << setw(14) << list[i].tel;cout << setw(10) << list[i].home_phone;cout << endl;key = 1;}}if( key == 0)cout << "未找到此电话号码" << endl;}void show(TEL * list){int i;cout << "现在有" << num << "个电话号码" << endl;cout << "依次学号姓名移动电话家庭电话" << endl;for(i = 0; i < num; i++){cout << list[i].id << '.';cout << setw(12) << list[i].student_number;cout << setw(10) << list[i].name;cout << setw(14) << list[i].tel;cout << setw(10) << list[i].home_phone;cout << endl;}cout << "输出完毕" << endl;}《软件技术基础》实验报告实验名称:链表的操作(一)班级学号姓名第10 周星期 2 、5,6 节成绩一、实验目的:1、掌握单链表结构的实现方式;2、掌握单链表常用算法的实现。
算法分析 重庆邮电大学第一次实验

实验四贪心算法求解最短路径问题实验目的:1)以解决最短路径问题为例,掌握贪心算法的基本设计策略;2)掌握Dijkstra贪心法求解单源点最短路径问题并实现;3)分析实验结果。
实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1.准备实验数据假设算法要处理下图,需要把图数据组织存放到相应的数据结构中,如:权值矩阵float graph[maxsize][maxsize]。
2.实现Dijkstra算法代码:#include <iostream>#include <fstream>#include <string>using namespace std;const int N = 6;const int M = 1000;ifstream fin("e://4d5.txt");ofstream fout("e://dijkstra-output1.txt");template<class Type>void Dijkstra(int n,int v,Type dist[],int prev[],Type c[][N+1]);void Traceback(int v,int i,int prev[]);//输出最短路径v源点,i终点int main(){int v = 1;//源点为1int dist[N+1],prev[N+1],c[N+1][N+1];cout<<"有向图权的矩阵为:"<<endl;for(int i=1; i<=N; i++){for(int j=1; j<=N; j++){fin>>c[i][j];cout<<c[i][j]<<" ";}cout<<endl;}Dijkstra(N,v,dist,prev,c);for(int i1=2; i1<=N; i1++){fout<<"源点1到点"<<i1<<"的最短路径长度为:"<<dist[i1]<<",其路径为";cout<<"源点1到点"<<i1<<"的最短路径长度为:"<<dist[i1]<<",其路径为";Traceback(1,i1,prev);cout<<endl;fout<<endl;}return 0;}template<class Type>void Dijkstra(int n,int v,Type dist[],int prev[],Type c[][N+1]){bool s[N+1];for(int i=1; i<=n; i++){dist[i] = c[v][i];//dist[i]表示当前从源到顶点i的最短特殊路径长度s[i] = false;if(dist[i] == M){prev[i] = 0;//记录从源到顶点i的最短路径i的前一个顶点}else{prev[i] = v;}}dist[v] = 0;s[v] = true;for(int i1=1; i1<n; i1++){int temp = M;int u = v;//上一顶点//取出V-S中具有最短特殊路径长度的顶点ufor(int j=1; j<=n; j++){if((!s[j]) && (dist[j]<temp)){u = j ;temp = dist[j];}}s[u] = true;//根据作出的贪心选择更新Dist值for(int j1=1; j1<=n; j1++){if((!s[j1]) && (c[u][j1]<M)){Type newdist = dist[u] + c[u][j1];if(newdist < dist[j1]){dist[j1] = newdist;prev[j1] = u;}}}}}//输出最短路径v源点,i终点void Traceback(int v,int i,int prev[]){if(v == i){cout<<i;fout<<i;return;}Traceback(v,prev[i],prev);cout<<"->"<<i;fout<<"->"<<i;}结果:#include <iostream>#include <limits>#include <fstream>#include <string>using namespace std;ofstream fout("e://dijkstra-output2.txt");struct Node { //定义表结点int adjvex; //该边所指向的顶点的位置int weight;// 边的权值Node *next; //下一条边的指针};struct HeadNode{ // 定义头结点int nodeName; // 顶点信息int inDegree; // 入度int d; //表示当前情况下起始顶点至该顶点的最短路径,初始化为无穷大bool isKnown; //表示起始顶点至该顶点的最短路径是否已知,true表示已知,false表示未知int parent; //表示最短路径的上一个顶点Node *link; //指向第一条依附该顶点的边的指针};//G表示指向头结点数组的第一个结点的指针//nodeNum表示结点个数//arcNum表示边的个数void createGraph(HeadNode *G, int nodeNum, int arcNum) {cout << "开始创建图(" << nodeNum << ", " << arcNum << ")" << endl; //初始化头结点for (int i = 0; i < nodeNum; i++) {G[i].nodeName = i+1; //位置0上面存储的是结点v1,依次类推G[i].inDegree = 0; //入度为0G[i].link = NULL;}inta[6][6]={{0,999,15,999,999,999},{2,999,999,999,10,30},{999,4,0,999,99 9,10},{999,999,999,0,999,999},{999,999,999,15,0,999},{999,999,999,4,1 0,0}};for (int j = 0;j<6;j++) {for(int k=0;k<6;k++){int begin, end, weight;begin = j+1;end=k+1;weight= a[j][k];// 创建新的结点插入链接表Node *node = new Node;node->adjvex = end - 1;node->weight = weight;++G[end-1].inDegree; //入度加1//插入链接表的第一个位置node->next = G[begin-1].link;G[begin-1].link = node;}}}void printGraph(HeadNode *G, int nodeNum) {for (int i = 0; i < nodeNum; i++) {cout << "结点v" << G[i].nodeName << "的入度为";cout << G[i].inDegree << ", 以它为起始顶点的边为: ";Node *node = G[i].link;while (node != NULL) {cout << "v" << G[node->adjvex].nodeName << "(权:" << node->weight << ")" << " ";node = node->next;}cout << endl;}}//得到begin->end权重int getWeight(HeadNode *G, int begin, int end) {Node *node = G[begin-1].link;while (node) {if (node->adjvex == end - 1) {return node->weight;}node = node->next;}}//从start开始,计算其到每一个顶点的最短路径void Dijkstra(HeadNode *G, int nodeNum, int start) {//初始化所有结点for (int i = 0; i < nodeNum; i++) {G[i].d = INT_MAX; //到每一个顶点的距离初始化为无穷大G[i].isKnown = false; // 到每一个顶点的距离为未知数}G[start-1].d = 0; //到其本身的距离为0G[start-1].parent = -1; //表示该结点是起始结点while(true) {//==== 如果所有的结点的最短距离都已知, 那么就跳出循环int k;bool ok = true; //表示是否全部okfor (k = 0; k < nodeNum; k++) {//只要有一个顶点的最短路径未知,ok就设置为falseif (!G[k].isKnown) {ok = false;break;}}if (ok) return;//==========================================//==== 搜索未知结点中d最小的,将其变为known//==== 这里其实可以用最小堆来实现int i;int minIndex = -1;for (i = 0; i < nodeNum; i++) {if (!G[i].isKnown) {if (minIndex == -1)minIndex = i;else if (G[minIndex].d > G[i].d)minIndex = i;}}//===========================================cout << "当前选中的结点为: v" << (minIndex+1) << endl;G[minIndex].isKnown = true; //将其加入最短路径已知的顶点集// 将以minIndex为起始顶点的所有的d更新Node *node = G[minIndex].link;while (node != NULL) {int begin = minIndex + 1;int end = node->adjvex + 1;int weight = getWeight(G, begin, end);if (G[minIndex].d + weight < G[end-1].d) {G[end-1].d = G[minIndex].d + weight;G[end-1].parent = minIndex; //记录最短路径的上一个结点}node = node->next;}}}//打印到end-1的最短路径void printPath(HeadNode *G, int end) {if (G[end-1].parent == -1) {cout << "v" << end;fout << "v" << end;} else if (end != 0) {printPath(G, G[end-1].parent + 1); // 因为这里的parent表示的是下标,从0开始,所以要加1cout << " -> v" << end;fout << " -> v" << end;}}int main() {HeadNode *G;int nodeNum, arcNum;nodeNum=6;arcNum=36;G = new HeadNode[nodeNum];createGraph(G, nodeNum, arcNum);cout << "=============================" << endl;cout << "下面开始打印图信息..." << endl;printGraph(G, nodeNum);cout << "=============================" << endl;cout << "下面开始运行dijkstra算法..." << endl;for (int i=1;i<=6;i++){Dijkstra(G, nodeNum, i);cout << "=============================" << endl;cout << "打印从v"<<i<<"开始所有的最短路径" << endl;fout << "打印从v"<<i<<"开始所有的最短路径" << endl;for (int k = 1; k <= nodeNum; k++) {if(k!=i){if(G[k-1].d>=150){cout<<"v"<<i<<"到v" << k << "无法到达!";fout<<"v"<<i<<"到v" << k << "无法到达!";}else{cout << "v"<<i<<"到v" << k << "的最短路径为" << G[k-1].d << ": "; fout << "v"<<i<<"到v" << k << "的最短路径为" << G[k-1].d << ": "; printPath(G, k);}cout << endl;fout << endl;}}}}算法分析:图中应用Dijkstra算法更好地实现最短路问题,效率提高很多。
算法分析与设计实验报告 CQUPT

算法分析与设计实验报告 CQUPT计算机科学与技术学院算法分析与设计实验报告目录实验报告一排序问题求解 ........................................................................... .......................................... 2 实验报告二背包问题求解 ........................................................................... .......................................... 8 实验报告三最短路径求解 ........................................................................... ........................................ 12 实验报告四 N-皇后问题求解 ........................................................................... (18)姓名:XXX学号:XXXXXXXX班级:XXXXXXX实验报告一排序问题求解实验目的1)以排序(分类)问题为例,掌握分治法的基本设计策略。
2)熟练掌握一般插入排序算法的实现; 3)熟练掌握快速排序算法的实现; 4) 理解常见的算法经验分析方法;实验内容与步骤 1. 生成实验数据.要求:编写一个函数datagenetare,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。
这些数作为后面算法的实验数据。
2. 实现直接插入排序算法. 要求:实现insertionsort算法。
算法的输入是data.txt;输出记录为文件:resultsIS.txt;同时记录运行时间为TimeIS。
重邮,王利,c语言实验课

C语言程序设计实验报告学号:姓名:班级:0801406任课教师:王利学期:2014-2015(2)第一次实验日志实验题目:1.改正错误,并让程序正确运行#include<stdio.h>void main(){printf(“these values are:\n”);int x=y=2.5;printf(“x=%d\n”,x);printf(“x=%d\n”,y);pri ntf(“x=%d\n”,z);}2.在屏幕上输出如下图形:*********3.已知三角形的底和高,求三角形的面积。
实验目的:掌握C程序的建立,和使用。
实验要求:独立完成实验题目实验主要步骤:1.打开C++;2.建立工作区和文件;3.根据题目要求,完成作业。
实验结果:#include <stdio.h>void main(){float x,y,z;x=y=z=2.5;printf("x=%f\n",x);printf("y=%f\n",y);printf("z=%f\n",z);printf("these values are:\n");printf(" *\n ***\n*****\n");float a,b,s;scanf("%f,%f",&a,&b);s=1/2*a*b;printf("三角形的面积:%f\n",(float)s);}心得体会:注意变量的精度问题,高精度不能赋值给低精度,可以通过(float)+变量名的方式改变变量精度。
第二次实验日志实验题目:1)某航空公司规定:在旅游旺季7~9月份,如果订票20张及其以上,优惠票价的10%;20张以下,优惠5%;在旅游淡季1~6月份、10~12月份,订票20张及其以上,优惠20%,20张以下,优惠10%。
数据结构实验报告(重邮)5个

数据结构实验报告学院:班级:姓名:学号:实验一线性链表的实现与操作题目:设计一个100位以内的长整数加减运算的程序班级:姓名:学号:完成日期:一、需求分析1、本实验中,100位长整数的每位上的数字必须为数字[0——9]之间,长整数的位数并要求100位以内。
测试的时候输入数据,当输入回车键的时候结束输入,如果输入的字符不符合题目要求,则程序能过滤这些不符合要求的字符。
2、演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中不符合要求的字符)和运算结果显示在其后。
3、程序执行的命令包括:(1)创建第一个整数(100以内);(2)执行加法或者减法;(3)创建第二个整数(100以内);(4)结束。
二、概要设计为实现上述程序功能,可以用链表或者长数组表示长整数,如果用数组表示长整数有个缺点就是长整数不能无限长,而链表能动态开辟空间,它克服了这个缺点,所以次试验用链表来表示长整数。
1、链表的抽象数据类型定义为:ADT Number{数据对象:D={a i| a i∈(0,1,…,9),i=0,1,2,…,n,n≥0}数据关系:R={< a i-1, a i>| a i-1, a i∈D,i=1,2,…,n}基本操作:CreateList(&L)操作结果:创建一个链表L。
PrintList(L)初始条件:链表L已存在。
操作结果:在屏幕上输出链表的值。
PlusList(L1,L2,a)初始条件:链表L1,L2已存在,a为+ or –表示加减。
操作结果:将两链表的值相加然后在屏幕上输出。
DestroyList(&L)初始条件:链表L已存在。
操作结果:销毁链表L。
} ADT Number2、本程序包含五个模块:int main(){定义变量;接受命令;处理命令;return 0;}各模块之间的调用关系如下:+or - :+or -三、详细设计1、定义头文件#include<stdio.h>#include<stdlib.h>#define LEN sizeof(Number)typedef struct number Number;struct number{int data;Number *next;Number *prior;};/////////////////////////////////////////////////////////////////////////////////////////////// ////////void main(){void DestoryList(Number *); //释放链表void PutNumber(Number *); //将求得的结果输出Number *GetNumber(); //创建链表,放被加数与加数Number *JiaFa(Number *num_1,Number *num_2);//加法函数Number *JianFa(Number *num_1,Number *num_2);//减法函数Number *number_1,*number_2,*number;char ch; //存放运算符号printf("Enter the first long number:");number_1=GetNumber();printf("put +or-:");ch=getchar();fflush(stdin); //吸收不相关的字符printf("Enter the second long number:");number_2=GetNumber();if(ch=='+')number=JiaFa(number_1,number_2);elseif(ch=='-')number=JianFa(number_1,number_2);printf("\n=\n");PutNumber(number);DestoryList(number);DestoryList(number_1);DestoryList(number_2);printf("链表释放完成。
算法设计算法实验报告(3篇)

第1篇一、实验目的本次实验旨在通过实际操作,加深对算法设计方法、基本思想、基本步骤和基本方法的理解与掌握。
通过具体问题的解决,提高利用课堂所学知识解决实际问题的能力,并培养综合应用所学知识解决复杂问题的能力。
二、实验内容1. 实验一:排序算法分析- 实验内容:分析比较冒泡排序、选择排序、插入排序、快速排序、归并排序等基本排序算法的效率。
- 实验步骤:1. 编写各排序算法的C++实现。
2. 使用随机生成的不同规模的数据集进行测试。
3. 记录并比较各算法的运行时间。
4. 分析不同排序算法的时间复杂度和空间复杂度。
2. 实验二:背包问题- 实验内容:使用贪心算法、回溯法、分支限界法解决0-1背包问题。
- 实验步骤:1. 编写贪心算法、回溯法和分支限界法的C++实现。
2. 使用标准测试数据集进行测试。
3. 对比分析三种算法的执行时间和求解质量。
3. 实验三:矩阵链乘问题- 实验内容:使用动态规划算法解决矩阵链乘问题。
- 实验步骤:1. 编写动态规划算法的C++实现。
2. 使用不同规模的矩阵链乘实例进行测试。
3. 分析算法的时间复杂度和空间复杂度。
4. 实验四:旅行商问题- 实验内容:使用遗传算法解决旅行商问题。
- 实验步骤:1. 设计遗传算法的参数,如种群大小、交叉率、变异率等。
2. 编写遗传算法的C++实现。
3. 使用标准测试数据集进行测试。
4. 分析算法的收敛速度和求解质量。
三、实验结果与分析1. 排序算法分析- 通过实验,我们验证了快速排序在平均情况下具有最佳的性能,其时间复杂度为O(nlogn),优于其他排序算法。
- 冒泡排序、选择排序和插入排序在数据规模较大时效率较低,不适合实际应用。
2. 背包问题- 贪心算法虽然简单,但在某些情况下无法得到最优解。
- 回溯法能够找到最优解,但计算量较大,时间复杂度较高。
- 分支限界法结合了贪心算法和回溯法的特点,能够在保证解质量的同时,降低计算量。
3. 矩阵链乘问题- 动态规划算法能够有效解决矩阵链乘问题,时间复杂度为O(n^3),空间复杂度为O(n^2)。
重庆邮电大学软件专业技术基础实验报告(耿道渠)

《软件技术基础》实验报告实验名称:顺序表的操作班级学号姓名第9 周星期 2 、5,6 节成绩一、实验目的:1、掌握顺序表结构的实现方式;2、掌握顺序表常用算法的实现;3、熟悉利用顺序表解决问题的一般思路;4、参照给定的顺序表的程序样例,验证给出的顺序表的常见算法,领会顺序表结构的优点和不足。
二、实验内容:1、设计一个静态数组存储结构的顺序表,要求编程实现如下任务:(1)建立一个顺序表,首先依次输人整数数据元素(个数根据需要键盘给定)。
(2)删除指定位置的数据元素(指定元素位置通过键盘输入),再依次显示删除后的顺序表中的数据元素。
(3)查找指定数据的数据元素(指定数据由键盘输入),若找到则显示位置,若没有找到则显示0。
2、使用顺序表实现一个电话本的管理程序,电话本中的每条记录包括学号、姓名、手机号码和固定电话四项。
要求实现菜单、初始化、添加、删除和显示等功能。
三、实验结果:四、实验中遇到的问题及解决方法:第一次编写C++,感觉力不从心,回去多看看PPT。
五、实验心得体会:对顺序表的一些常用语句不熟悉,对顺序表的整体思路理解不深刻以后要加强练习附:源程序(自行编写或修改的程序。
若为修改程序请注明修改部分的功能,若为书上实例则可不附。
)#include <iostream>#include <string>#include <stdlib.h>#include <iomanip>#define MAXSIZE 20using namespace std;int num;typedef struct{string student_number;string name;string tel;string home_phone;int id;} TEL;void shuaxin(TEL *);void delet(TEL *);void find(TEL *);void show(TEL *);int main(void){int choose;TEL List[MAXSIZE];while(1){cout << "***************************欢迎来到XXX电话本系统*********************" << endl;cout << "1.初始化并建立" <<endl;cout << "2.删除" <<endl;cout << "3.查找" <<endl;cout << "4.显示全部" << endl <<endl;cin >> choose;system("cls");while( choose < 1 || choose > 4){cout << "输入错误,数字1-4,请重新输入!" << endl;cin >> choose;system("cls");}switch(choose){case 1: shuaxin(List); break;case 2: delet(List); break;case 3: find(List); break;case 4: show(List); break;}//system("cls");}return 0;}void shuaxin(TEL * list){int i,j;for(i = 0; i < MAXSIZE; i++){list[i].id = i + 1;list[i].home_phone = "none";list[i].name = "none";list[i].student_number = "none";list[i].tel = "none";system("cls");cout << "初始化成功,现在开始建表:" << endl;cout << "请输入需要建立的电话个数:(小于" << MAXSIZE << ")"<<endl;cin >> num;while( num < 1 || num > MAXSIZE ){system("cls");cout << "输入错误,请重新输入" << endl;cin >> num;}system("cls");cout << "请依次输入学生的学号,姓名,移动电话,家庭电话" << endl;for(j = 1; j <= num; j++){cout << j << '.';cin >> list[j - 1].student_number;cin >> list[j - 1].name;cin >> list[j - 1].tel;cin >> list[j - 1].home_phone;cout << endl;if(num == (j - 1) ){system("cls");cout << "建立表完毕!" << endl;}}void delet(TEL * list){int j,i = 0;cout << "请输入你需要删除的序号" << endl;cin >> j;while( j < 0 || j > num){cout << "输入错误,请重新输入" << endl;cin >> j;}while(list[i].id != j)i++;for(j = i; j < num - 1; j++){list[j].name = list[j + 1].name;list[j].tel = list[j + 1].tel;list[j].student_number = list[j + 1].student_number;list[j].home_phone = list[j + 1].home_phone;}list[j].home_phone = "none";list[j].name = "none";list[j].student_number = "none";list[j].tel = "none";num--;system("cls");cout << "删除完毕" << endl;}void find(TEL * list){string telnum;int i,key = 0;cout << "请输入你需要查找的电话号码" << endl;cin >> telnum;system("cls");for(i = 0; i < MAXSIZE; i++){if(telnum == list[i].tel || telnum == list[i].home_phone){if(key == 0)cout << "依次学号姓名移动电话家庭电话" << endl;cout << list[i].id << '.';cout << setw(12) << list[i].student_number;cout << setw(10) << list[i].name;cout << setw(14) << list[i].tel;cout << setw(10) << list[i].home_phone;cout << endl;key = 1;}}if( key == 0)cout << "未找到此电话号码" << endl;}void show(TEL * list){int i;cout << "现在有" << num << "个电话号码" << endl;cout << "依次学号姓名移动电话家庭电话" << endl;for(i = 0; i < num; i++){cout << list[i].id << '.';cout << setw(12) << list[i].student_number;cout << setw(10) << list[i].name;cout << setw(14) << list[i].tel;cout << setw(10) << list[i].home_phone;cout << endl;}cout << "输出完毕" << endl;}《软件技术基础》实验报告实验名称:链表的操作(一)班级学号姓名第10 周星期 2 、5,6 节成绩一、实验目的:1、掌握单链表结构的实现方式;2、掌握单链表常用算法的实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四贪心算法求解最短路径问题实验目的:1)以解决最短路径问题为例,掌握贪心算法的基本设计策略;2)掌握Dijkstra贪心法求解单源点最短路径问题并实现;3)分析实验结果。
实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1.准备实验数据假设算法要处理下图,需要把图数据组织存放到相应的数据结构中,如:权值矩阵float graph[maxsize][maxsize]。
2.实现Dijkstra算法代码:#include <iostream>#include <fstream>#include <string>using namespace std;const int N = 6;const int M = 1000;ifstream fin("e://4d5.txt");ofstream fout("e://dijkstra-output1.txt");template<class Type>void Dijkstra(int n,int v,Type dist[],int prev[],Type c[][N+1]);void Traceback(int v,int i,int prev[]);//输出最短路径v源点,i终点int main(){int v = 1;//源点为1int dist[N+1],prev[N+1],c[N+1][N+1];cout<<"有向图权的矩阵为:"<<endl;for(int i=1; i<=N; i++){for(int j=1; j<=N; j++){fin>>c[i][j];cout<<c[i][j]<<" ";}cout<<endl;}Dijkstra(N,v,dist,prev,c);for(int i1=2; i1<=N; i1++){fout<<"源点1到点"<<i1<<"的最短路径长度为:"<<dist[i1]<<",其路径为";cout<<"源点1到点"<<i1<<"的最短路径长度为:"<<dist[i1]<<",其路径为";Traceback(1,i1,prev);cout<<endl;fout<<endl;}return 0;}template<class Type>void Dijkstra(int n,int v,Type dist[],int prev[],Type c[][N+1]){bool s[N+1];for(int i=1; i<=n; i++){dist[i] = c[v][i];//dist[i]表示当前从源到顶点i的最短特殊路径长度s[i] = false;if(dist[i] == M){prev[i] = 0;//记录从源到顶点i的最短路径i的前一个顶点}else{prev[i] = v;}}dist[v] = 0;s[v] = true;for(int i1=1; i1<n; i1++){int temp = M;int u = v;//上一顶点//取出V-S中具有最短特殊路径长度的顶点ufor(int j=1; j<=n; j++){if((!s[j]) && (dist[j]<temp)){u = j ;temp = dist[j];}}s[u] = true;//根据作出的贪心选择更新Dist值for(int j1=1; j1<=n; j1++){if((!s[j1]) && (c[u][j1]<M)){Type newdist = dist[u] + c[u][j1];if(newdist < dist[j1]){dist[j1] = newdist;prev[j1] = u;}}}}}//输出最短路径v源点,i终点void Traceback(int v,int i,int prev[]){if(v == i){cout<<i;fout<<i;return;}Traceback(v,prev[i],prev);cout<<"->"<<i;fout<<"->"<<i;}结果:#include <iostream>#include <limits>#include <fstream>#include <string>using namespace std;ofstream fout("e://dijkstra-output2.txt");struct Node { //定义表结点int adjvex; //该边所指向的顶点的位置int weight;// 边的权值Node *next; //下一条边的指针};struct HeadNode{ // 定义头结点int nodeName; // 顶点信息int inDegree; // 入度int d; //表示当前情况下起始顶点至该顶点的最短路径,初始化为无穷大bool isKnown; //表示起始顶点至该顶点的最短路径是否已知,true表示已知,false表示未知int parent; //表示最短路径的上一个顶点Node *link; //指向第一条依附该顶点的边的指针};//G表示指向头结点数组的第一个结点的指针//nodeNum表示结点个数//arcNum表示边的个数void createGraph(HeadNode *G, int nodeNum, int arcNum) {cout << "开始创建图(" << nodeNum << ", " << arcNum << ")" << endl; //初始化头结点for (int i = 0; i < nodeNum; i++) {G[i].nodeName = i+1; //位置0上面存储的是结点v1,依次类推G[i].inDegree = 0; //入度为0G[i].link = NULL;}inta[6][6]={{0,999,15,999,999,999},{2,999,999,999,10,30},{999,4,0,999,99 9,10},{999,999,999,0,999,999},{999,999,999,15,0,999},{999,999,999,4,1 0,0}};for (int j = 0;j<6;j++) {for(int k=0;k<6;k++){int begin, end, weight;begin = j+1;end=k+1;weight= a[j][k];// 创建新的结点插入链接表Node *node = new Node;node->adjvex = end - 1;node->weight = weight;++G[end-1].inDegree; //入度加1//插入链接表的第一个位置node->next = G[begin-1].link;G[begin-1].link = node;}}}void printGraph(HeadNode *G, int nodeNum) {for (int i = 0; i < nodeNum; i++) {cout << "结点v" << G[i].nodeName << "的入度为";cout << G[i].inDegree << ", 以它为起始顶点的边为: ";Node *node = G[i].link;while (node != NULL) {cout << "v" << G[node->adjvex].nodeName << "(权:" << node->weight << ")" << " ";node = node->next;}cout << endl;}}//得到begin->end权重int getWeight(HeadNode *G, int begin, int end) {Node *node = G[begin-1].link;while (node) {if (node->adjvex == end - 1) {return node->weight;}node = node->next;}}//从start开始,计算其到每一个顶点的最短路径void Dijkstra(HeadNode *G, int nodeNum, int start) {//初始化所有结点for (int i = 0; i < nodeNum; i++) {G[i].d = INT_MAX; //到每一个顶点的距离初始化为无穷大G[i].isKnown = false; // 到每一个顶点的距离为未知数}G[start-1].d = 0; //到其本身的距离为0G[start-1].parent = -1; //表示该结点是起始结点while(true) {//==== 如果所有的结点的最短距离都已知, 那么就跳出循环int k;bool ok = true; //表示是否全部okfor (k = 0; k < nodeNum; k++) {//只要有一个顶点的最短路径未知,ok就设置为falseif (!G[k].isKnown) {ok = false;break;}}if (ok) return;//==========================================//==== 搜索未知结点中d最小的,将其变为known//==== 这里其实可以用最小堆来实现int i;int minIndex = -1;for (i = 0; i < nodeNum; i++) {if (!G[i].isKnown) {if (minIndex == -1)minIndex = i;else if (G[minIndex].d > G[i].d)minIndex = i;}}//===========================================cout << "当前选中的结点为: v" << (minIndex+1) << endl;G[minIndex].isKnown = true; //将其加入最短路径已知的顶点集// 将以minIndex为起始顶点的所有的d更新Node *node = G[minIndex].link;while (node != NULL) {int begin = minIndex + 1;int end = node->adjvex + 1;int weight = getWeight(G, begin, end);if (G[minIndex].d + weight < G[end-1].d) {G[end-1].d = G[minIndex].d + weight;G[end-1].parent = minIndex; //记录最短路径的上一个结点}node = node->next;}}}//打印到end-1的最短路径void printPath(HeadNode *G, int end) {if (G[end-1].parent == -1) {cout << "v" << end;fout << "v" << end;} else if (end != 0) {printPath(G, G[end-1].parent + 1); // 因为这里的parent表示的是下标,从0开始,所以要加1cout << " -> v" << end;fout << " -> v" << end;}}int main() {HeadNode *G;int nodeNum, arcNum;nodeNum=6;arcNum=36;G = new HeadNode[nodeNum];createGraph(G, nodeNum, arcNum);cout << "=============================" << endl;cout << "下面开始打印图信息..." << endl;printGraph(G, nodeNum);cout << "=============================" << endl;cout << "下面开始运行dijkstra算法..." << endl;for (int i=1;i<=6;i++){Dijkstra(G, nodeNum, i);cout << "=============================" << endl;cout << "打印从v"<<i<<"开始所有的最短路径" << endl;fout << "打印从v"<<i<<"开始所有的最短路径" << endl;for (int k = 1; k <= nodeNum; k++) {if(k!=i){if(G[k-1].d>=150){cout<<"v"<<i<<"到v" << k << "无法到达!";fout<<"v"<<i<<"到v" << k << "无法到达!";}else{cout << "v"<<i<<"到v" << k << "的最短路径为" << G[k-1].d << ": "; fout << "v"<<i<<"到v" << k << "的最短路径为" << G[k-1].d << ": "; printPath(G, k);}cout << endl;fout << endl;}}}}算法分析:图中应用Dijkstra算法更好地实现最短路问题,效率提高很多。