# 一、实验目的及要求
- 集合结构的表示及实现。
- 查找和排序算法的实现。
- 文件的存取操作
- 系统功能:图书采编、图书查询、图书流通和个人信息等功能
- 程序能对输入数据的容错性进行检查,保证数据的合法性。
- 用户界面的友好性:程序可提供菜单供用户选择和相应的交互信息。
# 二、算法原理概述
## 2.1 查找
### 2.1.1 查找算法分类:
- 静态查找和动态查找;
- 静态或者动态都是针对查找表而言的。
- 动态表指查找表中有删除和插入操作的表。
- 无序查找和有序查找。
- 无序查找:被查找数列有序无序均可;
- 有序查找:被查找数列必须为有序数列。
### 2.1.2 查找的基本概念
- 查找:在数据集合中,寻找满足某种条件的数据元素的过程称为查找。
- 查找表(查找结构);用于查找的数据集合称为查找表。
- 关键字是数据元素中某个数据项的值,用它可以标识一个数据元素,若此关键字可以唯一地标识一个记录,用词关键字为主关键字。
- 平均查找长度是所有查找过程中进行关键字的比较次数的平均值。
对于 n 个元素的表,给定值 key 与表中第 i 个元素相等,需进行 n-i+1 次关键字的比较。
平均查找长度(Average Search Length,ASL):需和指定 key 进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。
对于含有 n 个数据元素的查找表,查找成功的平均查找长度为:ASL = Pi*Ci 的和。
Pi:查找表中第 i 个数据元素的概率。
Ci:找到第 i 个数据元素时已经比较过的次数。
### 2.1.3 常见的查找算法
1.顺序查找
前提:顺序查找适合于存储结构为顺序存储或链接存储的线性表。
基本思想:顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值 k 相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于 k 的结点,表示查找失败。
复杂度分析:
查找成功时的平均查找长度为:(假设每个数据元素的概率相等) ASL = 1/n(1+2+3+…+n) = (n+1)/2 ;
当查找不成功时,需要 n+1 次比较,时间复杂度为 O(n);
所以,顺序查找的时间复杂度为 O(n)。
C++ 实现源码:
```c++
//顺序查找
1. int SequenceSearch(int a[], int value, int n)
2. {
3. int i;
4. for(i=0; i<n; i++)
5. if(a[i]==value)
6. return i;
7. return -1;
8. }
```
2.二分查找
前提:元素必须是有序的,如果是无序的则要先进行排序操作。
基本思想:也称为是折半查找,属于有序查找算法。用给定值 k 先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据 k 与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
复杂度分析:最坏情况下,关键词比较次数为 log(n+1),且期望时间复杂度为 O(logn);
注:折半查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用。——《大话》
C++ 实现源码如下:
```c++
1. //二分查找(折半查找),版本1
2. int BinarySearch1(int a[], int value, int n)
3. {
4. int low, high, mid;
5. low = 0;
6. high = n-1;
7. while(low<=high)
8. {
9. mid = (low+high)/2;
10. if(a[mid]==value)
11. return mid;
12. if(a[mid]>value)
13. high = mid-1;
14. if(a[mid]<value)
15. low = mid+1;
16. }
17. return -1;
18. }
19.
20. //二分查找,递归版本
21. int BinarySearch2(int a[], int value, int low, int high)
22. {
23. int mid = low+(high-low)/2;
24. if(low > high)
25. return -1;
26. if(a[mid]==value)
27. return mid;
28. if(a[mid]>value)
29. return BinarySearch2(a, value, low, mid-1);
30. if(a[mid]<value)
31. return BinarySearch2(a, value, mid+1, high);
32. }
```
3.分块查找
分块查找又称索引顺序查找,它是顺序查找的一种改进方法。
算法思想:将 n 个数据元素"按块有序"划分为 m 块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序";即第 1 块中任一元素的关键字都必须小于第 2 块中任一元素的关键字;而第 2 块中任一元素又都必须小于第 3 块中的任一元素,……
算法流程:
step1 先选取各块中的最大关键字构成一个索引表;
step2 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。
4.树表查找
最简单的树表查找算法——二叉树查找算法。
基本思想:二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树。
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树 Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 任意节点的左、右子树也分别为二叉查找树。
二叉查找树性质:对二叉查找树进行中序遍历,即可得到有序的数列。
二叉查找树平均查找性能不错,为 O(logn),但是最坏情况会退化为 O(n)。在二叉查找树的基础上进行优化,我们可以使用平衡查找树
5.哈希查找
什么是哈希表(Hash)?
我们使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素"分类",然后将这个元素存储在相应"类"所对应的地方。但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了"冲突",换句话说,就是把不同的元素分在了相同的"类"之中。后面我们将看到一种解决"冲突"的简便做法。
总的来说,"直接定址"与"解决冲突"是哈希表的两大特点。
什么是哈希函数?
哈希函数的规则是:通过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中,越分散,则以后查找的时间复杂度越小,空间复杂度越高。
算法思想:如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。可以将其扩展到可以处理更加复杂的类型的键。
算法流程:
- 用给定的哈希函数构造哈希表;
- 根据选择的冲突处理方法解�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:课程论文word+代码及可执行exe文件+项目截图 (1)集合结构的表示及实现。 (2)查找和排序算法的实现。 (3)文件的存取操作 (4)系统功能:图书采编、图书查询、图书流通和个人信息等功能 (5)程序能对输入数据的容错性进行检查,保证数据的合法性。 (6)用户界面的友好性:程序可提供菜单供用户选择和相应的交互信息。 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/125456225
资源推荐
资源详情
资源评论
收起资源包目录
基于C语言的图书信息管理系统.zip (23个子文件)
截图
图片6.png 123KB
图片2.png 52KB
SC0}B5%)N0GSD3C03}SS{8W.png 124KB
图片3.png 76KB
图片1.png 1.73MB
图书管理系统.png 33KB
E(PPG79AWZH)){_[465TL[S.png 33KB
7$X]8~@LWCH7HG~@V%[1RK2.png 37KB
图片4.png 64KB
图片9.png 112KB
`LXCPIDJB)B~[NP2IEQ6O5A.png 226KB
图片10.png 56KB
图片7.png 123KB
图片8.png 56KB
图片5.png 56KB
基于C语言的图书信息管理系统 代码及可执行exe文件
LibraryManageSystem.exe 168KB
READEME.txt 120B
LICENSE 1KB
LibraryManageSystem.cpp 41KB
library.txt 312B
README.md 31KB
user.txt 44B
基于C语言的图书信息管理系统 课程论文.doc 2.58MB
共 23 条
- 1
资源评论
- m0_688832862024-05-22资源不错,对我启发很大,获得了新的灵感,受益匪浅。
shejizuopin
- 粉丝: 1w+
- 资源: 1299
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功