怎么写c语言综合实验设计报告
发布时间:2025-05-18 21:02:02 发布人:远客网络
一、怎么写c语言综合实验设计报告
举个楼主自己写的例子吧,仅供参考。
题目:二次探测再散列法解决冲突建立哈希表并查找
学号:2011013290姓名:聂亮兵专业班级:信管112班
实验任务:独立写出哈希查找的相关代码并画出核心的算法流程图,记录相关实验数据,得出实验结果。
试验目的:通过两者运行时间的对比,加深对哈希查找和顺序查找各自优缺点的理解,并进一步熟悉哈希查找的原理和流程。
实习内容:用除留余数法和二次探测再散列法解决冲突建立哈希表并查找,通过函数GetTickCount计算运行时间;再同样计算顺序查找的方法的查找时间。
查阅关于库函数<windows.h>的相关内容,并熟悉函数GetTickCount()的用法。
规划算法流程,画出主要函数的流程图。具体流程是:读入文件数据——顺序查找——输出结果——哈希查找——输出结果。
对应流程写出相关函数,完善主函数。
进行程序的运行和调试,修改一些不足和bug。
运行程序进行实验并得出实验结果,记录。
实验结果:由于所给数据Data.txt数据量过小,实验结果不明显,两种查找所耗时间均被系统默认为0;如图所示为编号为37、1294、4091的三个数据元素:
分析:哈希查找的方法适用于数据在区间内随机分布均并且量大的数据形式;而顺序查找原理简单,但是不适用于大量数据的查找。
这个实验难度不大,但是需要自己高质量的独立完成,对自己是一个总结归纳,能通过这个实验清楚自己哪些地方平时没有注意到,哪些地方是自己擅长并应该继续保持的。
此外,本实验的全过程能让自己了解正式的程序、任务和报告等的完成流程。通过自己独立完成这个实验,再和标准的数据结构代码比较,找出自己代码的亮点、不足以及欠缺,让自己明白哪些地方是自己想不到的,哪些方法是自己不能想到的,并以此学习好的编程思想和优秀的编程技巧和编程风格。
正式的程序代码中,外部变量的使用要格外注意,不能随意使用外部变量。但是本程序具有独立性,不用与其他程序代码相衔接,采用外部变量的方法,减少函数调用的时候的复制传值的次数,提高效率。
正式的编程思想中,要有统一的命名方式。这包括两个方面。其一是自己的命名规则要统一,不能乱。其二是与合作小组之间的命名规则要统一,提高代码的可嵌入性。但是本实验由自己独立完成,命名规则按照自己的习惯而定,与课本命名规则有点出入。
二次探测再散列法解决冲突中,课本中没有提到如果H(a)-m^2<0时的处理方法。本程序中采用的方法是取绝对值。二次探测再散列法中,再散列需要在循环中进行,直到找到位置e为止。这个过程中m需要进行两种互斥变化:一种是*-1;一种是+1;再循环中不好实现。本程序中采用一个信号变量,每次循环自增1,奇偶数分别执行不同的变化。
二、C语言怎么实现有重复元素的全排列
1、整体思路就是利用回溯的思想,也可认为是深度优先搜索
2、从字符串第一位idx=0开始,每次递归都从s[idx]之后选择一个字符与s[idx]交换
3、因为可能有重复字符,可使用哈希数组标记当前循环每个字符是否被选择
4、因为字符范围不超过ASCII码,所以使用128空间的数组足够用来标记了
5、选择好当前字符s[i]并与s[idx]交换之后,递归调用继续排列下一位s[idx+1]
6、注意这里要进行回溯,即不选s[i]而选择之后的某个字符交换到s[idx]
7、所以要将之前的s[i]与s[idx]交换过来,恢复原状,才能循环判断下一个选择
8、#define MAXN 1000000//排列总数可能很多
9、char*res[MAXN]={NULL};//指针数组保存排列结果
10、void swap(char*x, char*y){//交换两个字符变量的内容
11、void perm(char*s, int n, int idx){//回溯产生字符串全排列
12、 if(idx== n){//已排列到字符串结尾
13、 res[num]=(char*)malloc(sizeof(char)*(n+ 1));
14、//printf("%s\n", s);//输出当前排列
15、 strcpy(res[num], s);//保存当前排列
16、 int i, hash[128]={0};//哈希数组,标记每个字符是否被选择
17、 continue;//跳过已被标记过的重复字符
18、 hash[s[i]]= 1;//选过的话在数组中标记为1
19、 swap(&s[idx],&s[i]);//选择s[i]交换到s[idx]
20、 perm(s, n, idx+ 1);//递归,继续s[idx+1]的选择
21、 swap(&s[idx],&s[i]);//回溯,当前不选择s[i],而选择其他字符
22、 char*s=(char*)malloc(sizeof(char)*(n+ 1));
23、 printf("一共有%d种排列:\n", num);//输出排列总数
24、 for(i= 0; i< num; i++){//输出所有排列
三、LZOC语言压缩算法
1、LZOC语言的压缩算法在内部实现了一个名为_do_compress的函数,用于对输入数据进行压缩。该函数的主要逻辑如下:
2、首先,定义了工作内存wrkmem和几个辅助指针,如ip、op和ii。然后,循环遍历输入数据,对每个字节进行处理。
3、在循环中,计算一个hash值dindex,用于查找字节序列的已存在位置(m_pos)。如果m_pos指向的字节序列与当前ip的前四个字节匹配,或者回指长度小于2KB,会尝试匹配。否则,将当前ip的前四个字节作为新的记录存入字典dict中,并继续处理下一个字节。
4、如果匹配成功(即m_pos的前三个字节与ip匹配),则可能需要输出未匹配的新字符。如果新字符数目小于3个,会直接进行编码;如果新字符数目在18个以内,会用一个字节表示;超过18个,则编码成一个位元组。然后,继续匹配下一个可能的重复区域。
5、如果匹配失败或者没有找到重复区域,会将当前ip的前四个字节作为新的记录存入字典,然后更新ii指针,继续遍历输入数据。在循环结束时,计算输出字节的长度,并返回压缩后的数据结束位置。
6、总的来说,LZOC算法通过复杂的哈希查找和匹配机制,尽可能地找到输入数据中的重复区域,并以特定的方式编码输出,以达到压缩数据的目的。
7、LZO是致力于解压速度的一种数据压缩算法,LZO是 Lempel-Ziv-Oberhumer的缩写。这个算法是无损算法,参考实现程序是线程安全的。实现它的一个自由软件工具是lzop。最初的库是用 ANSI C编写、并且遵从 GNU通用公共许可证发布的。现在 LZO有用于 Perl、Python以及 Java的各种版本。代码版权的所有者是 Markus F. X. J. Oberhumer。