算法实验报告(共16页).doc
《算法实验报告(共16页).doc》由会员分享,可在线阅读,更多相关《算法实验报告(共16页).doc(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上华北电力大学实 验 报 告| 实验名称 算法设计与分析综合实验 课程名称 算法设计与分析 | 专业班级 软件12 学生姓名: 学 号: 成 绩:指导教师:胡朝举 实验日期:2014.12 实验一 分治策略归并排序一、实验要求(1)编写一个模板函数:template ,MergeSort(T *a, int n);以及相应的一系列函数,采用分治策略,对任意具有:bool operator(const T&x,const T&y);比较运算符的类型进行排序。(2)与STL库中的函数std:sort(.)进行运行时间上的比较,给出比较结果,如:动态生成100万个随机生成的附
2、点数序列的排序列问题, 给出所用的时间比较。二、实验代码#include #include #include #include #define MAX 50 typedef struct int arrMAX+1; int length; SortArr; SortArr *CreateSortArr() int i = 0; char buf4*MAX = ; char *ptr = NULL; SortArr *sortArr = (SortArr *)malloc(sizeof(SortArr); memset(sortArr, 0, sizeof(SortArr); printf(请输
3、入待排序数据,以逗号分隔,以分号结束n input:); scanf(%s, buf); ptr = buf; sortArr-arri = 0; i = 1; while(*ptr != ;) sortArr-arri = atoi(ptr); i+; ptr = strstr(ptr, ,); if(!ptr) break; ptr+; sortArr-length = (i - 1); return sortArr; int merge(int arr, int p, int q, int r) int i = 0; int j = 0; int k = 0; int n1 = 0; i
4、nt n2 = 0; int *leftArr = NULL; int *rightArr = NULL; n1 = q - p + 1; n2 = r - q; leftArr = (int *)malloc(n1 + 2) * sizeof(int); rightArr = (int *)malloc(n2 + 2) * sizeof(int); for(i = 1; i = n1; i+) leftArri = arrp+i-1; for(j = 0; j = n2; j+) rightArrj = arrq+j; i = 1; j = 1; leftArrn1+1 = INT_MAX;
5、 rightArrn2+1 = INT_MAX; for(k = p; k = r; k+) if(leftArri = rightArrj) arrk = leftArri; i+; else arrk = rightArrj; j+; free(leftArr); free(rightArr); return 0; int mergeSort(int arr, int p, int r) int q = 0; if(p length); return 0; int PrintArray(SortArr sortArr) int i = 0; for(i = 1; i = sortArr.l
6、ength; i+) printf(%d, sortArr.arri); printf(b;n); return 0; int main() SortArr *sortArr = NULL; sortArr = CreateSortArr(); printf(nBefore Sort:t); PrintArray(*sortArr); MergingSortRecursion(sortArr); printf(Sorted Array:t); PrintArray(*sortArr); free(sortArr); return 0; 实验二 贪心算法Huffman树及Huffman编码一、实
7、验要求 一个记录字符及出现频率的文件如下所示: Huffman.haf,7,a,45,b,13,c,12,d,16,e,89,f,34,g,20试编写一个读取此种格式文件类CHuffman, 内部机制采用优先队列,用于建立Huffman树及进行Huffman编码输出,其用法可以如下所示:CHuffman hm(huffman.dat);hm.CreateTree();hm.OutputTree();hm.OutputCode(); /二进制形式的字符串对于输出树的形式可自行决定(如图形界面或字符界面)。二、 实验代码 #include #include using namespace std;
8、 const int MaxValue =10000;/初始设定的权值最大值 const int MaxBit =4;/初始设定的最大编码位数 const int MaxN=10;/初始设定的最大结点个数 struct HaffNode/哈夫曼树的结点结构 int weight;/权值 int flag;/标记 int parent;/双亲结点下标 int leftChild;/左孩子下标 int rightChild;/右孩子下标 ; struct Code/存放哈夫曼编码的数据元素结构 int bitMaxBit;/数组 int start;/编码的起始下标 int weight;/字符的
9、权值 ; /weight:由小到大排序 void Haffman(int weight, int n, HaffNode haffTree) /建立叶结点个数为n权值为weight的哈夫曼树haffTree int j,m1,m2,x1,x2; /哈夫曼树haffTree初始化。n个叶结点的哈夫曼树共有2n-1个结点 for(int i=0;i2*n-1;i+) if(in) haffTreei.weight=weighti; else haffTreei.weight=0; /注意这里没打else那,故无论是n个叶子节点还是n-1个非叶子节点都会进行下面4步的初始化 haffTreei.pa
10、rent=0; haffTreei.flag=0; haffTreei.leftChild=-1; haffTreei.rightChild=-1; /构造哈夫曼树haffTree的n-1个非叶结点 for(int i=0;in-1;i+) m1=m2=MaxValue;/Maxvalue=10000;(就是一个相当大的数) x1=x2=0;/x1、x2是用来保存最小的两个值在数组对应的下标 for(j=i;jn+i;j+)/循环找出所有权重中,最小的二个值-morgan if(haffTreej.weightm1&haffTreej.flag=0) m2=m1; x2=x1; m1=haff
11、Treej.weight; x1=j; else if(haffTreej.weightm2&haffTreej.flag=0) m2=haffTreej.weight; x2=j; couti=i m1 m2endl; /将找出的两棵权值最小的子树合并为一棵子树 haffTreex1.parent=n+i; haffTreex2.parent=n+i; haffTreex1.flag=1; haffTreex2.flag=1; haffTreen+i.weight=haffTreex1.weight+haffTreex2.weight; haffTreen+i.leftChild=x1; h
12、affTreen+i.rightChild=x2; void HaffmanCode(HaffNode haffTree,int n,Code haffCode) /由n个结点的哈夫曼树haffTree构造哈夫曼编码haffCode Code*cd=new Code; int child, parent; /求n个叶结点的哈夫曼编码 for(int i=0;istart=n-1;/不等长编码的最后一位为n-1, cd-start=0;/,-修改从0开始计数-morgan cd-weight=haffTreei.weight;/取得编码对应权值的字符 child=i; parent=haffTr
13、eechild.parent; /由叶结点向上直到根结点 while(parent!=0) if(haffTreeparent.leftChild=child) cd-bitcd-start=0;/左孩子结点编码0 else cd-bitcd-start=1;/右孩子结点编码1 /cd-start-; cd-start+;/改成编码自增-morgan child=parent; parent=haffTreechild.parent; /保存叶结点的编码和不等长编码的起始位 /for(intj=cd-start+1;jstart-1;j=0;j-)/重新修改编码,从根节点开始计数-morgan
14、 haffCodei.bitcd-start-j-1=cd-bitj; haffCodei.start=cd-start; haffCodei.weight=cd-weight;/保存编码对应的权值 int main() int i, j, n=4,m=0; int weight=2,4,5,7; /int weight=7,5,4,2; HaffNode*myHaffTree=new HaffNode2*n-1; Code*myHaffCode=new Coden; if(nMaxN) cout定义的n越界,修改MaxN!endl; exit(0); Haffman(weight,n,myH
15、affTree); HaffmanCode(myHaffTree,n,myHaffCode); /输出每个叶结点的哈夫曼编码 for(i=0;in;i+) coutWeight=myHaffCodei.weight Code=; /for(j=myHaffCodei.start+1;jn;j+) for(j=0;jmyHaffCodei.start;j+) coutmyHaffCodei.bitj; m=m+myHaffCodei.weight*myHaffCodei.start; cout 长度:myHaffCodei.startendl; couthuffmansWPLis:; coutm
16、; coutendl; return 0; 实验三 用回溯方法求解n后问题一、 实验要求问题:对任意给定的n求解n后问题。具体要求: 1封装n后问题为类,编写以下两种算法进行求解:(1)递归回溯方法;(2)迭代回溯方法。(选)2对任意给定的n,要求输出其解向量(所有解),并输出其解数;3构造n后问题的解数表格(由程序自动生成):n 后数解数第一个解42(2,4,1,3)56参考类的封装如下:class CQueenpublic:CQueen(); /缺省构造函数CQueen(int n);CQueen();void IniQueen(int n);void ToPrintAll(); /求出所
17、有的解并输出void ToPrint(int m); /输出前m个解;void ToGetFirstAndSum(); /求出所有解的总和及第一个解; (为了生成以上所示的表格)private:int m_n; /皇后数long m_sum;/总解数;int *m_x; /解向量;int *m_FirstX; /第一个解向量;bool m_bPlace(int k); /当主生了x0.xk-1时,判断xk 能否放置void BackTrack(int t);/ BackTrack-Method/为了输出前m个解,可能需要增加其它的变量;二、 实验代码#include #include #inc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 实验 报告 16
限制150内