数据结构实验四

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、实验题目与要求
从下面题目中至少选择 2 题实现:其中第 1 题必做,2-5 题中至少选择 1 题。
1.折半查找算法 1)问题描述:从键盘读入一串整数和一个待查关键字,查找在该整数串中是否有这个待
查关键字。如果有,输出它在整数串中的位置;如果没有,输出-1 2)实验要求: 利用折半查找算法查找 用递归和非递归两种方式实现折半查找算法 3) 实现提示: 递归实现参考书上折半查找算法的实现 非递归算法利用栈实现
3. 对于给定的一个有序序列,创建一颗高度最小的二叉排序树。 1)实验要求:该二叉排序树以二叉链表存储 2)实验提示:要创建一颗高度最小的二叉排序树,就必须让左右子树的节点个数越接近
越好。由于给定的是一个关键字有序序列 a[start..end],所以让其中间位置的关键字 a[mid]作 为根结点,左序列 a[start..mid-1]构造左子树,右序列 a[mid+1..end]构造右子树。
主要算法(折半查找):
int binarysearch(int R[],int k,int n) {
int low=0,high=n-1,mid; while(low<=high) {
mid=(low+high)/2; if(R[mid]==k) return mid+1; else if(k<R[mid]) high=mid-1; else low=mid+1; } return -1; }
程序运行 20 分
回答问题 15 分
实验报告 30 分
特色 考勤违
功能 纪情况 成绩
5分
5分
其它批改意见:
考核 内容
评价在实验 课堂中的表 现,包括实 验态度、编 写程序过程 等内容等。
□功能完善, □功能不全 □有小错 □无法运行
○正确 ○基本正确 ○有提示 ○无法回答
○完整
○较完整 ○一般 ○内容极少
○有 ○无
○无报告
○有 ○无
教师签字:
一、实验目的 掌握二叉排序树、AVL 树的查找、插入、删除等算法的思想及程序实现;能选择合适散列函数, 实现不同冲突处理方法的散列表的查找、建立。能运用折半查找、分块查找、二叉排序树、 散列表等查找算法解决具体应用问题。 较高要求:利用 B+树设计大数据集索引结构。
建立二叉排序树算法:
BSTNode* CreateBST(int low,int high) {
int mid = (low+high)/2; BSTNode *root; if(low<=high) {
root = (BSTNode*)malloc(sizeof(BSTNode)); root->data=R[mid]; root->lchild=CreateBST(low,mid-1); root->rchild=CreateBST(mid+1,high);
然后进行第二趟冒泡排序,即对前 n-1 个记录重复与第一趟冒泡排序类似的过程,结果使关键字次大 的记录被移到第 n-1 个记录位置上。
重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。所得录序列就是有序序 列。
冒泡排序算法:
void sort(int n) {
int i,j,buf; for (i=0; i<n-1; ++i) //比较 n-1 轮 {
4.哈希表查找
1)问题描述:针对某个集体的“人名”构造哈希表,解决按“人名”进行查找的索引结 构。
2)实验要求:要求表的平均查找长度不超过 R,完成相应的建表和查表程序。 3) 实现提示:假设人名为汉语拼音形式。代填入哈希表人名共 30 个,取平均查找长度 的上限为 2。哈希函数用除留余数法构造,用再散列法处理冲突。
for (j=0; j<n-1-i; ++j) //每轮比较 n-1-i 次, {
if (R[j] > R[j+1]) {
buf = R[j]; R[j] = R[j+1]; R[j+1] = buf; } } } return; } 待数组排好序以后在进行二叉排序树的建立,这道题我直接创建的是最小高度的二叉排序树,要创建 一颗高度最小的二叉排序树,就必须让左右子树的结点个数越接近越好。所以我直接采用中间值来作为二 叉树的根节点;将原数组分成左右均等或者相差一个数的两个新数组;然后递归的对这两个新数组进行相 同的处理,这样对于每一个根节点,其左右子树的高度相差绝对值不会超过 1。
建立二叉排序树算法:
BSTNode* CreateBST(int low,int high) {
int mid = (low+high)/2; BSTNode *root; if(low<=high) {
root = (BSTNode*)malloc(sizeof(BSTNode)); root->data=R[mid]; root->lchild=CreateBST(low,mid-1); root->rchild=CreateBST(mid+1,high); return root; } else return NULL; }
return root; } else
return NULL; }
测试结果:
4.哈希表查找。 数据结构为:
typedef struct Hash {
char data[50]; struct Hash *next; }Hash; typedef struct { int data; struct Hash *next; }FirstHash[30]; 将名字拼音字符串的各个字符所对应的 ASCII 码相加,所得的整数做为哈希表的关键字。用除留余数 法构建哈希函数,用伪随机探测再散列法处理冲突。 散列表的查找过程和建表过程类似。假设给定的值为 k,根据建表时设定的散列函数 H,计算出敢列地 址 H(k),若表中该地址对应的空间未被占用,则查找失败,把 k 插人该空单元中;否则将该地址中的值与 k 比较,若相等则查找成功,若不相等,则按事先设定的解决冲突的方法查找下一个地址。如此重复下去, 直至某个地址空间未被占用(查找失败把 k 插人该空单元)或关键字比较相等(查找成功)为止。
冒泡排序算法:
void sort(int n) {
int i,j,buf; for (i=0; i<n-1; ++i) //比较 n-1 轮 {
for (j=0; j<n-1-i; ++j) //每轮比较 n-1-i 次, {
if (R[j] > R[j+1]) {
buf = R[j]; R[j] = R[j+1]; R[j+1] = buf; } } } return; } 待数组排好序以后在进行二叉排序树的建立,要创建一颗高度最小的二叉排序树,就必须让左右子树 的结点个数越接近越好。所以我直接采用中间值来作为二叉树的根节点;将原数组分成左右均等或者相差 一个数的两个新数组;然后递归的对这两个新数组进行相同的处理,这样对于每一个根节点,其左右子树 的高度相差绝对值不会超过 1。
5. 拼写检查 1)问题描述:现在有一些英语单词需要做拼写检查,你的工具是一本词典。需要检查的
单词,有的是词典中的单词,有的与词典中的单词相似,你的任务是发现这两种情况。单词 A 与单词 B 相似的情况有三种:
① 删除单词 A 的一个字母后得到单词 B; ② 用任意一个字母替换单词 A 的一个字母后得到单词 B; ③ 在单词 A 的任意位置增加一个字母后得到单词 B。 2)实验要求:发现词典中与给定单词相同或相似的单词。
测试结果:
3. 对于给定的一个有序序列,创建一颗高度最小的二叉排序树。
数据结构为: typedef struct node {
int data; struct node *lchild,*rchild; }BSTNode; 与前一道题一样,先要对初始数组排序,这里采用冒泡排序法,首先从第一个记录开始,将第一个记 录的关键字与第二个记录的关键字进行比较,若两个关键字为逆序(R[0]>R[1]),则交换两记录位置;然后 比较第二个记录与第三个记录,若两关键字为逆序,同样交换两记录位置;依次类推,直至第 n-2 个记录 和第 n-1 个记录比较完为止。上述过程称作第一趟冒泡排序,其结果使得 n 个记录中关键字最大的记录被 移到最后一个位置上。 然后进行第二趟冒泡排序,即对前 n-1 个记录重复与第一趟冒泡排序类似的过程,结果使关键字次大 的记录被移到第 n-1 个记录位置上。 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。所得录序列就是有序序 列。
temp = temp->next; } if(temp == NULL)
cout << 0 << endl; else
cout << 1 << endl; }
测试结果:
四、收获与体会
本次实验联系了几种常用的查找算法、排序算法,基本熟悉了顺序查找和折半查找的思想;也着练习 了二叉排序树的创建,值的查找(位置)等,而且对遍历做了进一步练习;对哈希表也做了一些练习,用 取余法存储数据建哈希函数,用伪随机探测再散列法处理冲突,然后对哈希表进行查找。
2.构造二叉排序树,并进行中序遍历 1)问题描述:从键盘读入一串整数构造一棵二叉排序树,并对得到的二叉排序树进行中
序遍历,得到有序序列。 2)实验要求:该二叉排序树以二叉链表存储 3)实现提示:二叉排序树的构成,可从空的二叉树开始,每输入一个结点数据,就建立
一个新结点插入到当前已生成的二叉排序树中,所以它的主要操作是二叉排序树插入运算。 在二叉排序树中插入新结点,只要保证插入后仍符合二叉排序树的定义即可。
Βιβλιοθήκη Baidu
三、实验过程与实验结果
1.折半查找算法 由于折半查找有两个限制:①要求查找必须采用顺序存储结构,即顺序表;②表中的元素必须按关键
字有序排列。 由于本题一开始所给出的序列有序,所以定义两个变量 low 和 high,初始时分别指向 R[0]和 R[n-1]。
首先将给定值 k 与有序表 R[0]到 R[n-1]的中点 mid=(low+high)/2 上的关键字 R[ mid]进行比较,若相等, 则查找成功。若 k < R[ mid],则说明 k 有可能落在[0... mid-1]区间中,于是修改 high,指向 mid -1 位置,在 R[0]到 R[ mid -1]中继续查找。若 k > R[ mid], 则说明 k 有可能落在[mid +1...n-1]区间中, 于是修改 low,指向 mid +1 位置。在 R[ mid + 1]到 R[n-1]中继续查找。每通过次比较,区间的长度就缩 小一半,如此不断进行下去,直至找到关键字为 k 的元素(查找成功)或 low > high,即查找失败为止。
实验报告
学院(系)名称:计算机科学与工程学院
姓名
赵振宇
学号
20175302
专业
班级
2017 级 4 班 实验项目
实验四:查找算法应用
课程名称
数据结构与算法
课程代码
计算机科学与技术 0661913
实验时间
2019 年 6 月 3 日 第 3、4 节 实验地点
7-219
考核 标准
成绩 栏
实验过程 25 分
查找的主要算法:
counts = (int)checkname[i][1] % 29; if(h[counts]->next == NULL)
cout << 0 << endl; else {
Hash *temp = h[counts]->next; while(temp!= NULL && strcmp(temp->data,checkname[i]) != 0) {
测试结果:
2.构造二叉排序树,并进行中序遍历。
数据结构为: typedef struct node {
int data; struct node *lchild,*rchild; }BSTNode; 要构造一个二叉排序树,首先要对输入的数组进行排序,本题我先用冒泡排序对数组进行排序,它的 具体步骤为: 首先从第一个记录开始,将第一个记录的关键字与第二个记录的关键字进行比较,若两个关键字为逆 序(R[0]>R[1]),则交换两记录位置;然后比较第二个记录与第三个记录,若两关键字为逆序,同样交换两 记录位置;依次类推,直至第 n-2 个记录和第 n-1 个记录比较完为止。上述过程称作第一趟冒泡排序,其 结果使得 n 个记录中关键字最大的记录被移到最后一个位置上。
相关文档
最新文档