北邮数据结构实验报告

合集下载

数据结构实验报告实验4

数据结构实验报告实验4

数据结构实验报告实验名称:实验四排序(题目1)学生姓名:班级:班内序号:学号:日期:2013年12月19日1.实验要求实验目的:学习、实现、对比各种排序算法,掌握各种排序算法的优劣,以及各种算法使用的情况。

实验内容:使用简单数组实现下面各种排序算法,并进行比较。

排序算法:1、插入排序2、希尔排序3、冒泡排序4、快速排序5、简单选择排序6、堆排序7、其他要求:1、测试数据分成三类:正序、逆序、随机数据2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。

3、对2的结果进行分析,验证上述各种算法的时间复杂度。

编写测试main()函数测试线性表的正确性。

2. 程序分析2.1 存储结构程序采用的存储机构是顺序存储,如下图所示:2.2 关键算法分析2.2.1 插入排序插入排序的基本方法是寻找一个指定元素在待排序元素中的位置,然后插入。

一趟直接插入排序的C++描述过程如下:①将待插入纪录赋值给哨兵r[0]:r[0]=r[i];②从后向前进行顺序查找:for(j=i-1;r[0]<r[j];j--);③元素后插:r[j+1]=r[j];④插入记录:r[j+1]=r[j];性能分析:原序列正序时直接插入排序达到最好的时间性能,比较次数为n-1,移动次数为0。

原序列逆序时直接插入排序达到最差时间性能,比较次数为,移动次数为。

直接插入排序的平均时间复杂度为,空间复杂度为。

直接插入排序是一种稳定的排序算法,特别适合于待排序集合基本有序的情况。

2.2.2 希尔排序希尔排序的基本方法是将待排序的元素集分成多个子集,分别对这些子集进行直接插入排序,待整个序列基本有序时,再对元素进行一次直接插入排序。

希尔排序的整个过程如下:for(int d=n/2;d>=1;d=d/2) //以d为增量//在子序列中进行插入排序{for(int i=d+1;i<=n;i++) //一趟希尔排序{if(r[i]<r[i-d]){r[0]=r[i];for(int j=i-d;j>0&&r[0]<r[j];j=j-d)//每隔d个记录,进行一次比较和移动,d=1时即是最后一趟直接插入排序r[j+d]=r[j];r[j+d]=r[0];}}}性能分析:希尔排序的时间复杂度在和之间,空间复杂度为,是一种不稳定的排序算法。

北邮-数据结构-哈夫曼树报告

北邮-数据结构-哈夫曼树报告

数据结构欧阳学文实验报告实验名称:哈夫曼树学生姓名:袁普班级:211125班班内序号:14号学号:210681日期:12月1.实验目的和内容利用二叉树结构实现哈夫曼编/解码器。

基本要求:1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈夫曼树2、建立编码表(CreateTable):利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。

3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。

4、译码(Decoding):利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。

5、打印(Print):以直观的方式打印哈夫曼树(选作)6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。

7、可采用二进制编码方式(选作)测试数据:I love data Structure, I love Computer。

I will try my best to study data Structure.提示:1、用户界面可以设计为“菜单”方式:能够进行交互。

2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码2. 程序分析2.1 存储结构用struct结构类型来实现存储树的结点类型struct HNode{int weight; //权值int parent; //父节点int lchild; //左孩子int rchild; //右孩子};struct HCode //实现编码的结构类型{char data; //被编码的字符char code[100]; //字符对应的哈夫曼编码};2.2 程序流程2.3算法1:void Huffman::Count()[1] 算法功能:对出现字符的和出现字符的统计,构建权值结点,初始化编码表[2] 算法基本思想:对输入字符一个一个的统计,并统计出现次数,构建权值数组,[3] 算法空间、时间复杂度分析:空间复杂度O(1),要遍历一遍字符串,时间复杂度O(n)[4] 代码逻辑:leaf=0; //初始化叶子节点个数int i,j=0;int s[128]={0}; 用于存储出现的字符for(i=0;str[i]!='\0';i++) 遍历输入的字符串s[(int)str[i]]++; 统计每个字符出现次数for(i=0;i<128;i++)if(s[i]!=0){data[j]=(char)i; 给编码表的字符赋值weight[j]=s[i]; 构建权值数组j++;}leaf=j; //叶子节点个数即字符个数for(i=0;i<leaf;i++)cout<<data[i]<<"的权值为:"<<weight[i]<<endl;算法2:void Init();[1] 算法功能:构建哈弗曼树[2] 算法基本思想:根据哈夫曼树构建要求,选取权值最小的两个结点结合,新结点加入数组,再继续选取最小的两个结点继续构建。

北邮数据结构实验报告

北邮数据结构实验报告

北邮数据结构实验报告摘要:本报告基于北邮数据结构实验,通过实际操作和实验结果的分析,总结和讨论了各实验的目的、实验过程、实验结果以及相关的问题和解决方法。

本报告旨在帮助读者了解数据结构实验的基本原理和应用,并为今后的学习和研究提供参考。

1. 实验一:线性表的操作1.1 实验目的本实验旨在掌握线性表的基本操作以及对应的算法实现,包括插入、删除、查找、修改等。

1.2 实验过程我们使用C++语言编写了线性表的相关算法,并在实际编程环境下进行了测试。

通过插入元素、删除元素、查找元素和修改元素的操作,验证了算法的正确性和效率。

1.3 实验结果经过测试,我们发现线性表的插入和删除操作的时间复杂度为O(n),查找操作的时间复杂度为O(n),修改操作的时间复杂度为O(1)。

这些结果与预期相符,并反映了线性表的基本特性。

1.4 问题与解决方法在实验过程中,我们遇到了一些问题,例如插入操作的边界条件判断、删除操作时的内存释放等。

通过仔细分析问题,我们优化了算法的实现,并解决了这些问题。

2. 实验二:栈和队列的应用2.1 实验目的本实验旨在掌握栈和队列的基本原理、操作和应用,并进行实际编程实现。

2.2 实验过程我们使用C++语言编写了栈和队列的相关算法,并在实际编程环境下进行了测试。

通过栈的应用实现表达式求值和逆波兰表达式的计算,以及队列的应用实现图的广度优先遍历,验证了算法的正确性和效率。

2.3 实验结果经过测试,我们发现栈的应用可以实现表达式的求值和逆波兰表达式的计算,队列的应用可以实现图的广度优先遍历。

这些结果证明了栈和队列在实际应用中的重要性和有效性。

2.4 问题与解决方法在实验过程中,我们遇到了一些问题,例如中缀表达式转后缀表达式的算法设计、表达式求值的优化等。

通过查阅资料和与同学的讨论,我们解决了这些问题,并完善了算法的实现。

3. 实验三:串的模式匹配3.1 实验目的本实验旨在掌握串的基本操作和模式匹配算法,并进行实际编程实现。

北邮数据结构第三次实验-实验报告

北邮数据结构第三次实验-实验报告

数据结构实验报告实验名称:实验三——栈和队列学生姓名:班级:班内序号:学号:日期:1.实验要求1.1 实验目的通过选择下面两个题目之一进行实现,掌握如下内容:➢掌握二叉树基本操作的实现方法➢了解赫夫曼树的思想和相关概念➢学习使用二叉树解决实际问题的能力1.2 实验内容根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。

二叉树的基本功能:1、二叉树的建立2、前序遍历二叉树3、中序遍历二叉树4、后序遍历二叉树5、按层序遍历二叉树6、求二叉树的深度7、求指定结点到根的路径8、二叉树的销毁9、其他:自定义操作编写测试main()函数测试线性表的正确性2. 程序分析2.1 二叉链表2.2 二叉树的二叉链表存储示意图2.3 关键算法分析2.3.1算法1:void create(Binode<T> *&R, T data[], int i);[1] 算法功能:创建一个二叉树[2] 算法基本思想:通过构造函数创建一个二叉树,构造函数通过调用函数create()创建二叉树,关于函数create()的伪代码:1.定义根指针,输入节点储存的data,若输入“#”,则该节点为空;2.申请一个新节点,判断它的父结点是否不为空,如果不为空在判断其为左或者右孩子,并把地址付给父结点,把data写入。

[3] 算法空间、时间复杂度:O(n)[4] 代码逻辑(可用伪代码描述):if(data[i-1]!=0){R = new Binode<T>;R->data= data[i-1];R->lch = R->rch = NULL;create(R->lch, data,2*i);create(R->rch, data, 2*i+1);}2.3.2算法2:void Destroy(Binode<T> *R);[1] 算法功能:二叉树的销毁[2] 算法基本思想:采用后序遍历的方法,释放节点。

北邮数据结构实验-约瑟夫环

北邮数据结构实验-约瑟夫环

北邮数据结构实验-约瑟夫环数据结构实验报告实验名称:实验1——约瑟夫环学生姓名:班级:班内序号:学号:日期:1.实验要求实验目的:通过利用循环链表实现约瑟夫问题的求解进行实现,掌握如下内容:1.熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法2.学习指针、模板类、异常处理的使用3.掌握线性表的操作的实现方法4.学习使用线性表解决实际问题的能力实验内容:利用循环链表实现约瑟夫问题的求解。

约瑟夫问题如下:已知n个人(n>=1)围坐一圆桌周围,从1开始顺序编号。

从序号为1的人开始报数,顺时针数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规则重复下去,直到所有人全部出列。

请问最后一个出列的人的编号。

2. 程序分析2.1 存储结构首先构建结点的结构体,包括结点的编号number和指向后继元素的指针*next。

然后构建循环链表储存每一个结点。

2.2 关键算法分析1、关键算法:插入:用尾插法构建循环链表,建立一个尾指针r用来保存最后一个结点的地址,插入每一个节点后,r指向新插入的结点。

用for循环来给每一个结点的number赋值。

插入的步骤:1.建立新指针s;2.在for循环中给s赋值;3.将r指针指向s;4.修改尾指针r=s5.在全部结点插入后,将终端结点指向第一个指针,r->next=front->next。

约瑟夫环算法实现:1.因为每次循环都有一个人出列,最后只剩一个人,因此要进行n-1次循环,用for循环实现。

2.同时定义一个指针p=front->next,每次循环front和p均后移m-1个,使p指向每次循环的第m个人,front指向第m-1个人。

并输出出列的人的number,即p->number。

3.让front->next=p->next,删除p。

4.继续进行循环2、代码详细分析:约瑟夫环算法步骤:①定义一个指针p=front->next,每次循环front和p均后移m-1个,使p指向每次循环的第m个人,front指向第m-1个人。

北邮数据结构实验报告实验四

北邮数据结构实验报告实验四

2009级数据结构实验报告实验名称:实验四——排序学生姓名:班级:班内序号:学号:日期:2010/12/171.实验要求实验目的:通过选择下面两个题目之一,学习、实现、对比各种排序算法,掌握各种排序算法的优劣,以及各种算法使用的情况。

实验内容:使用简单数组实现下面各种排序算法,并进行比较。

排序算法:1、插入排序2、希尔排序3、冒泡排序4、快速排序5、简单选择排序6、堆排序7、归并排序8、基数排序(选作)9、其他要求:1、测试数据分成三类:正序、逆序、随机数据2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。

3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)4、对2和3的结果进行分析,验证上述各种算法的时间复杂度编写测试main()函数测试线性表的正确性。

2. 程序分析2.1 存储结构使用最简单的一维数组存储待排序的数据。

共使用两个数组,一个用来存储原始数据,一个用来存储待排序数据。

每次排序完毕,用原始数据更新一次待排序数据,保证每一次都对同一组数据排序。

(图略)2.2 关键算法分析1.直接插入的改进:在一般的直接插入中,关键码每移动一次就需要比较一次。

在移动的方面,优化是比较困难的,因为对静态线性表的插入必然要带来大量的移动。

但是,我们可以在比较上进行一些优化。

在查找技术一张曾学过的“折半查找法”,在这里就可以照葫芦画瓢地运用。

一趟排序的伪代码如下:1.如果该元素大于处于其左侧相邻的元素则跳过该元素;2.low=0,high=i;3.循环直至low==high3.1 mid=(low+high)/2;3.2如果当前元素大于中值high=mid;3.3否则low=mid+1;4.当前元素赋值给临时变量;5.将有序区中处于low位置及其右侧的元素右移;6.临时变量置于low位置简单说一下这里的折半查找与一般查找算法的区别。

这里的查找,尤其是对无重复数据和大量数据的处理中,更多的时候是找不到完全相等的项的。

北邮-数据结构-哈夫曼树报告Word版

北邮-数据结构-哈夫曼树报告Word版

数据结构实验报告实验名称:哈夫曼树学生姓名:袁普班级:2013211125班班内序号:14号学号:2013210681日期:2014年12月实验目的和内容利用二叉树结构实现哈夫曼编/解码器。

基本要求:1、初始化(Init):能够对输入的任意长度的字符串 s进行统计,统计每个字符的频度,并建立哈夫曼树2、建立编码表(CreateTable):利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。

3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。

4、译码(Decoding):利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。

5、打印(Print):以直观的方式打印哈夫曼树(选作)6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。

7、可采用二进制编码方式(选作)测试数据:I love data Structure, I love Computer。

I will try my best to studydata Structure.提示:1、用户界面可以设计为“菜单”方式:能够进行交互。

2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码2. 程序分析2.1 存储结构用struct结构类型来实现存储树的结点类型struct HNode{int weight; //权值int parent; //父节点int lchild; //左孩子int rchild; //右孩子};struct HCode //实现编码的结构类型{char data; //被编码的字符char code[100]; //字符对应的哈夫曼编码};2.2 程序流程2.3 关键算法分析算法1:void Huffman::Count()[1] 算法功能:对出现字符的和出现字符的统计,构建权值结点,初始化编码表[2] 算法基本思想:对输入字符一个一个的统计,并统计出现次数,构建权值数组,[3] 算法空间、时间复杂度分析:空间复杂度O(1),要遍历一遍字符串,时间复杂度O(n)[4] 代码逻辑:leaf=0; //初始化叶子节点个数int i,j=0;int s[128]={0}; 用于存储出现的字符for(i=0;str[i]!='\0';i++) 遍历输入的字符串s[(int)str[i]]++; 统计每个字符出现次数for(i=0;i<128;i++)if(s[i]!=0){data[j]=(char)i; 给编码表的字符赋值weight[j]=s[i]; 构建权值数组j++;}leaf=j; //叶子节点个数即字符个数for(i=0;i<leaf;i++)cout<<data[i]<<"的权值为:"<<weight[i]<<endl;算法2:void Init();[1] 算法功能:构建哈弗曼树[2] 算法基本思想:根据哈夫曼树构建要求,选取权值最小的两个结点结合,新结点加入数组,再继续选取最小的两个结点继续构建。

北邮数据结构实验报告-排序

北邮数据结构实验报告-排序

北邮数据结构实验报告-排序北邮数据结构实验报告-排序一、实验目的本实验旨在掌握常见的排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序等,并通过实际编程实现对数字序列的排序。

二、实验内容1.冒泡排序冒泡排序是一种简单的排序算法,其基本思想是依次比较相邻的两个元素,并按照从小到大或从大到小的顺序交换。

具体步骤如下:- 从待排序序列的第一个元素开始,依次比较相邻的两个元素;- 如果前面的元素大于后面的元素,则交换这两个元素的位置;- 重复上述步骤,直到整个序列有序。

2.插入排序插入排序是一种简单且直观的排序算法,其基本思想是将待排序序列分为已排序和未排序两部分,每次从未排序部分中选择一个元素插入到已排序部分的合适位置。

具体步骤如下:- 从待排序序列中选择一个元素作为已排序部分的第一个元素;- 依次将未排序部分的元素插入到已排序部分的合适位置,使得已排序部分保持有序;- 重复上述步骤,直到整个序列有序。

3.选择排序选择排序是一种简单且直观的排序算法,其基本思想是每次选择未排序部分中的最小(或最大)元素,并将其放在已排序部分的末尾。

具体步骤如下:- 在未排序部分中选择最小(或最大)的元素;- 将选择的最小(或最大)元素与未排序部分的第一个元素交换位置;- 重复上述步骤,直到整个序列有序。

4.快速排序快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排序序列分割成两部分,其中一部分的元素都比另一部分的元素小。

具体步骤如下:- 选择一个枢轴元素(一般选择第一个元素);- 将待排序序列中小于枢轴元素的元素放在枢轴元素的左侧,大于枢轴元素的元素放在枢轴元素的右侧;- 对枢轴元素左右两侧的子序列分别进行递归快速排序;- 重复上述步骤,直到整个序列有序。

5.归并排序归并排序是一种高效的排序算法,其基本思想是将待排序序列划分成足够小的子序列,然后对这些子序列进行两两合并,最终形成有序的序列。

具体步骤如下:- 将待排序序列递归地划分成足够小的子序列;- 对每个子序列进行归并排序;- 合并相邻的子序列,直到整个序列有序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
根据图的抽象数据类型的定义,使用邻接矩阵或邻接表实现一个图。
图的基本功能:
1、图的建立
2、图的销毁
3、深度优先遍历图
4、广度优先遍历图
5、使用普里姆算法生成最小生成树
6、使用克鲁斯卡尔算法生成最小生成树
7、求指定顶点到其他各顶点的最短路径
8、其他:比如连通性判断等自定义操作
编写测试main()函数测试图的正确性
2.心得体会
编写代码是一个熟能生巧的程,经过几次练习不仅提高了代码的输入速度,还增进了对代码的理解,对于书本上代码出现的一些错误也能及时发现。
3.下一步的改进
未设计错误处理,没有考虑到输入有误的情况。可加入对输入的判断,判断输入数据是否合理,不合理则输出“请重新输入”。也没有设计判断图是否联通的算法。由于有向图和无向图的区别,我编写了两段代码,无向图用来验证两种遍历,prim和kruskal算法,有向图用来验证最短生成路径的算法,可以考虑将两份代码合二为一。
若被考察边的两个顶点属于T的两个不同连通分量,则将此边加入到TE中,同时将两个连通分量连接为一个连通分量;
若被考察边的两个顶点属于同一连通分量,则舍此边,以免造成回路。
时间复杂度:O(n²)
2.2.4 Dijkstra算法
1.首先找出从源点能够直接到达的顶点的所有路径,并从中选出一条最短的路径。
2.然后以这条已选出的最短路径作为转发路径,找出经过这条路径转发后到达其他顶点的路径,并从中选出一条最低按的路径,如果经过这条路径转发bouquet到达目的节点比直接从源点到达目的节点路径要长,就不转发。
③while(w存在);
④if(w未被访问);
⑤w=下一个邻接点
时间复杂度:O(n²)
2.2.2广度遍历
(1)初始状态:所有结点均未被访问,附设一个数组记录结点状态,即
bool visited[MAX_SIZE]={0};
(2)从结点v开始访问,每访问一个结点,设置该结点的visited[v]=1。
重复执行:在所有u∈U,v∈V-U的边中找一条代价最小的边(u,v)并入集合TE,同时v并入U,直至U=V为止。此时TE中必有n-1条边,T就是最后得到的最小生成树。
lowcost[n]:集合V-U中各顶点与集合U中顶点最短边的权值,lowcost[v]=0表示顶点v已加入最小生成树中;
adjvex[n]:边在集合U中的顶点。
(3)找结点v的所有未访问结点
算法步骤:
初始化队列Q
访问顶点v,visited[v]=1。
while(队列非空):
v=队头元素出队;
访问队头元素的所有未访问的邻接点。
时间复杂度:O(n²)
2.2.2 prim算法
设G=(V,E),具有n个顶点的连通网;
T=(U,TE),G的最小生成树,初始状态为U={u0}(u0∈V),TE={};
3.重复执行2,直到找到所有顶点的路径位置。
3.程序运行结果
4.总结
1.调试时出现的问题及解决的方法
这次实验程序较上次相比复杂程度有所增加,在调试过程中也出现了很多问题。深度遍历是一个递归函数,最开始我的visited数组的初始化语句写在的函数内,导致遍历根本停不下来。调试kruskal算法时出现了输出结果与理论结果不符的情况,宿舍的另一个同学也出现了相同的情况,经过我们讨论研究发现是在给边集数组赋值时忘记去除arc[i][j]=0的情况,导致输出结果出现错误。生成最短路径时由于一开始构造的是无向网所以程序无法正常运行,后重新加上了构造有向网的过程。
lowcost[j]=min { cost (vk,vj) |vk∈U}
adjvex[j]=k
时间复杂度:O(n²)
2.2.3 kruskal算法
1.设无向连通网为G=(V,E),令G的最小生成树T=(U,TE),其初态为U=V, TE={},这样T中各顶点各自构成一个连通分量。
2.将图中边(存于边集数组E)按权值由小到大排序,依次考察边集E中各边:
(1)初始状态:所有结点均未被访问,附设一个数组记录结点状态,即
bool visited[MAX_SIZE]={0};
(2)从结点v开始访问:每访问一个结点,设置该结点的visited[v]=1.
(3)找结点v的第一个未访问的临接点。
算法步骤:
①访问结点v,设置visited[v]=1;
②w=v的第一个邻接点;
2.程序分析
2.1存储结构
•用一维数组存储顶点信息
•用二维数组(邻接矩阵)存储顶点之间的关系(弧或边)
无向图的矩阵如下图所示,其具有对称性。
•Aij=0(i,j)VR
•Aij=1 (i,j)VR




•网的邻接矩阵为:
•Aij=wiji≠j
•Aij=0 i=j
•Aij=∞其他

2.2关键算法分析
2.2.1深度遍历
相关文档
最新文档