08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205
查找算法
查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行查找。
查找算法通常需要两个输入:
1、被查找的序列
2、要查找的关键词
查找算法的输出参数和返回值:
1、返回类型为Error_code 的值用以表示是否查找成功
2、如果查找成功,返回 success, 输出参数 position 定位到目标所在位置
3、如果查找失败,返回not present,输出参数可能是未定义或不同于已有位置的任何值
顺序查找算法
顺序查找算法的思路很简单:从表的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
【实验说明】
题目:编写一个程序,对顺序表{3,6,2,10,1,8,5,7,4,9},采用顺序查找关键字5的过程。要求输出:
1)原顺序表;2)查找到关键字的位置;3)进行比较的次数。
1.首先要编写类表List。需要满足最基本的操作插入insert(),获取retrieve(),以及得到大小size()。
2.我们观察题目要求,表中虽然存储的是简单的整数,但如果我们使用List<int>对象显然无法记录比较次数,所以我们自己写一个类Key通过其内部int类型的数据成员来记录存于表中的值,并模仿int基本的逻辑操作,即编写重载逻辑运算符,同时增加一个静态数据成员comparisons用于记录其比较操作的次数。
3.准备工作做好之后开始编写顺序查找算法。算法的思路很简单,也较易实现,从表中第一个元素开始比较,发现目标则返回元素所在表中位置;若遍历之后没有目标,则查找失败,返回-1表示表中没有目标元素。
4.按题目要求编写最后的输出函数。
【相关代码】
函数sequential_search
int sequential_search(const List<int> &the_list,
const Key &target)
/*Post: If an entry in the_list is equal to target, then return the position
of this entry.
Otherwise return -1
*/
{
int position;
int s=the_list.size();
for(position=0;position<s;position++){
int data;
the_list.retrieve(position,data);
if(data==target){
return position;
}
}
return -1;
}
二分查找算法
二分查找前提是表是按递增或递减顺序的规范表。此次实验中我们使用的是递增表。
二分查找从表中间开始查找目标元素。如果找到一致元素,则查找成功。如果中间元素比目标元素小,则仍用二分查找方法查找表的后半部分(表是递增排列的),反之中间元素比目标元素大,则查找表的前半部分。
【实验说明】
题目:编写一个程序,对有序表{1,2,3,4,5,6,7,8,9,10},采用二分查找关键字9的过程。要求输出:
1)原顺序表;2)查找到关键字的位置;3)进行比较的次数。
1.二分查找算法的前提是表必须是有序的,如题目中是递增方式排列的表。实现表的有序一方面是用户规范输入,另一方面我们也可以编写有序的类来方便用户的输入。
所以从List中派生类Oredered_list,重新编写函数Error_code insert(int position,const Record &data),使插入的位置不满足表的有序条件时,不能插入。
同时编写插入的重载函数 Error_code insert(const Record &data),可以直接插入到合适的位置,方便用户输入。
2.仍使用题目1中的Key来表示目标
3.实现二分查找算法。通过书中的学习,我们直接使用添加相等判断的二分查找算法。即每次从表的中间元素开始比较,如果得到目标则返回元素所在表中位置;如果中间元素小于目标元素,则对右半部分继续二分查找;反之对前半部分表进行二分查找。若最后都没有目标元素,返回-1用以表示表中没有目标元素。
4.仍使用题目1编写的输出函数将结果输出。
/*注意这里因为Ordered_list是从List中派生而来,所以虽然print_out函数中第一个参数类型是List<int>,仍可以使用,而不用编写重载函数*/
【相关代码】
函数binary_search
int binary_search(const Ordered_list<int> &the_list,
const Key &target)
/*Post: If an entry in the_list is equal to target, then return the position
of this entry.
Otherwise return -1
*/
{
int position;
int data;
int bottom=0,top=the_list.size()-1;
while(bottom<=top){
position=(bottom+top)/2;
the_list.retrieve(position,data);
if(data==target)
return position;
if(data<target)bottom=position+1;
else top=position;
}
return -1;
}
【过程记录】
实验截图:
【结果分析】
A.实现顺序查找算法
1.顺序查找算法思路很简单,就是一种遍历的思想,一个个查找目标元素,实现也很简单。
2.对于有n个元素的表适用顺序查找。比较次数:不成功:比较n次。成功查找:最好的情况为1次,即第一个元素即为目标元素;最差的情况为n次;平均比较次数(n+1)/2次。
所以当表很大时,顺序查找的代价是很大的。
3.顺序查找算法不会有重复的比较出现,即一旦找到即成功,但同时这种代价是当表中有重复的目标元素时(比如有多个目标元素)我们只能得到第一个元素的位置。
B.实现二分查找算法
1.二分查找法思路:递增排列的表,首先从中间元素开始查找,如果元素比目标元素小,则查找后半部分表,反之查找前半部分表,并重复这一过程。这样每次查找中我们都把表的长度减半。
2.二分查找在实现中有量bottom和top,每次减半的过程体现在bottom和top的改变上,在代码的实现上可以使用单纯的循环或者用函数递归的思想。
递归思想更容易理解,但编写之后我们发现函数是尾递归,尾递归通常可以用简单的循环实现,循环在操作来说没有了函数调用的过程,更节省时间和空间。
3.编码中小小地方的改动可能对程序有很大的改观。
如上述两种二分查找binary_search_1(不比较等于的情况)binary_search_2(添加等于情况)
分享到:
相关推荐
这里我们将深入探讨两种常见的查找算法:二分查找和顺序查找。 **一、顺序查找** 顺序查找是最基础的查找算法之一。它的工作原理是从数据集(如数组或列表)的第一个元素开始,逐个比较目标值与当前元素,直到找到...
本实验主要探讨了三种基本的查找算法:顺序查找、折半查找(二分查找)和索引查找,这些算法都是在数组或集合中寻找特定元素的重要方法。下面将详细解释这三种查找算法,并结合C语言编程环境进行深入分析。 1. **...
文件名中的"Sun数据结构第8章查找(第22-25讲).ppt"和"Sun数据结构第9章排序(第25-27讲).ppt"表明,内容可能详细涵盖了查找算法的各个方面,包括二分查找的原理、实现和优化,以及排序算法的介绍、实现步骤和性能...
**折半查找**,也称为二分查找,适用于有序数组。它通过不断将查找区间减半来缩小搜索范围,平均时间复杂度为O(log n)。折半查找的优势在于效率高,但前提是数据必须事先排序,且不支持动态插入和删除操作。 **二叉...
一、实验目的: 熟悉各种查找算法及其复杂性,能够根据实际情况选择合适的存储结构。 二、实验要求: 1、掌握查找的基本方法。 2、提交实验报告,报告...编程分别对有序顺序表的顺序查找,二分查找算法进行实现。
本实验报告主要关注两种查找算法的实现:顺序查找和二分查找,这两种方法在不同的场景下各有优势。 首先,顺序查找是最基础的查找算法之一。在含有n个元素的顺序表中,顺序查找的策略是从头到尾逐个比较,直到找到...
查找算法有顺序查找、二分查找,其中二分查找在有序列表中尤其高效。图算法如深度优先搜索(DFS)和广度优先搜索(BFS)常用于遍历图结构,而Dijkstra算法和A*算法则用于求解最短路径问题。 在Python中实现这些数据...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
2. **查找算法**:如线性查找、二分查找和哈希查找,用于在数据集合中找到特定元素。 3. **图算法**:如Dijkstra算法(单源最短路径)和Floyd-Warshall算法(所有对最短路径)。 4. **动态规划**:解决多阶段决策...
在本教程中,我们将深入探讨几个关键的数据结构:栈、队列、二叉树、顺序查找、二分查找以及图的遍历。这些基础知识对于理解和编写高效的算法至关重要。 1. 栈(Stack) 栈是一种后进先出(LIFO)的数据结构,类似...
数据结构中的查找算法是计算机科学中非常基础且重要的部分,主要目标是在数据集中找到特定的元素。本章主要探讨了三种常见的查找算法:线性表的查找、树表的查找和哈希表的查找,以及它们的性能分析。 1. **二分...
数据结构中的查找算法是计算机科学中的重要组成部分,它涉及到如何高效地在大量数据中寻找特定信息。查找操作,也就是检索,通常在数据元素的集合,即查找表中进行。查找的效率与查找对象的组织方式和所采用的查找...
本篇文章将详细地介绍几种常用的查找算法及其应用场景,包括顺序查找、二分查找、插值查找、斐波那契查找等线性结构的查找方法以及树表查找、分块查找、哈希查找等非线性结构的查找方法。 #### 二、线性结构查找...
7. 查找算法:查找算法包括顺序查找、二分查找、哈希查找等。哈希表通过计算哈希值实现快速查找,平均时间复杂度可达到O(1)。二分查找则适用于有序数据集,时间复杂度为O(log n)。 以上内容只是数据结构与算法领域...
- **二分查找**:适用于已排序的数据集,效率远高于顺序查找。 #### 5. 堆栈与队列 - **堆栈概念**:遵循先进后出(LIFO)原则,常用于解决递归问题。 - **队列特性**:遵循先进先出(FIFO)原则,适用于任务调度场景。...
折半查找,也称作二分查找,是一种更高效的查找算法,适用于已排序的数据集。其核心思想是在每次查找时,都将查找区间减半,通过比较目标值与当前区间的中间元素来决定下一步的查找方向。如果目标值等于中间元素,则...
- **依赖数据结构**:二分查找只适用于顺序存储的有序数组,对于链表或其他非顺序存储结构,不适用。 - **预处理需求**:如果数据无序,需先进行排序,这会增加额外的时间成本。 ### **应用场合** 二分查找广泛...
总之,通过本次实验,学生能够深入理解二分查找算法的工作原理及其在有序数据集上的高效性,并且能够熟练掌握顺序表的基本操作和二分查找的具体实现细节,这对于后续学习更复杂的数据结构和算法具有重要的意义。
本主题将深入探讨几种常见的查找算法,包括二分查找(Binsearch)、二叉搜索树(BSTree)、哈希查找(Hash)以及顺序查找(Seqsearch)。这些算法在不同的场景下有着各自的优点和适用性,理解并掌握它们对于优化程序...