`
hm4123660
  • 浏览: 282402 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
Dea4ce76-f328-3ab2-b24a-fb268e1eeb75
数据结构
浏览量:69994
社区版块
存档分类
最新评论

查找算法--顺序表查找

阅读更多

    查找又称检索,是指在某种数据结构中找出满足给定条件的元素。若在查找的同时对表做修改运算(如插入删除),则相应的表称为动态查找表,否则,称为静态查找表。我们分别从线性表查找,树表查找和哈希表查找来分析总结查找算法。

 

线性表查找

 线性表是最简单的一种表的组织方式,我们不考虑在查找的同时对表做修改,即在静态表上进行查找

1)顺序查找

基本思路:

      从表中一端开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至顺序扫描结束,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功

 

基本代码:

 

int SeqSearch(int a[],int len,int key)
{
       int i
       for( i=0;i<len;i++)
       {
            if(a[i]==key)
                break;
       }
       if(i<len)
           return i;//查找成功,返回下标
       else
          return -1;//查找失败,返回-1
}

 特点:

 

   顺序查找成功时的查找平均长度为(n+1)/2,即为表长的一半,查找不成功的查找长度为n,顺序查找的优点是算法简单,且对表的结构没有任何要求。缺点就是查找效率低,当n较大时不宜采用顺序查找。

 

2)二分查找(折半查找)

基本思路:

           将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。

基本代码:

    

int BinSearch(int a[],int len,int key)
{
	int low=0,high=len-1,mid;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(a[mid]==key)//查找成功
			return mid;
		else if(a[mid]>key)
			high=mid-1;
		else
			low=mid+1;

	}
	return -1;//查找失败
}

 

 

特点:

      二分查找成功时的平均查找长度为:log2(n+1)-1 。二分查找虽然高效,但是要将表按关键字排序,而排序本身就是一种很费时的运算。二分查找必须采用顺序存储结构,为保表的有序性,在顺序表中插入或删除都必将移动大量数据。因此,二分查找特别适合用于那种一建立就很少改动,而又经常需要查找的线性表

 

 

3)分块查找(索引顺序查找)

基本思想

      分块查找是一种介于顺序查找和二分查找之间的查找方式。查找时,首先查找索引表,因为索引表是有顺序的表,故可二分查找或顺序查找确定待查的记录在哪一块;然后在确定的块中进行顺序查找(因为块内无序,只能顺序查找)

 

结构展示:



 基本代码

    int Search_Index(SSTable &ST,IndexTable &ID,int k)  
    {  
        int low,high,mid;  
        int p;//p用来保存查找的关键字所属的索引中的位置  
        int s,t;//s,t分别用来保存查找的关键字所在块的起始和终点位置  
        low=0;  
        high=ID.length-1;  
        while(low<=high && p<0)  
        {//该循环是用对半查找的方法,对索引表进行查找,从而定位要查找的元素所在的块  
            mid=(low+high)/2;  
            if(k>ID.elem[mid-1].key && k<ID.elem[mid].key)  
                p=mid;//判断关键字对应哪个索引位置,就是k比前一个值大,比后一个值小,  
                        //那个大的就是k对应的索引位置  
            else  
            {  
                if(k<ID.elem[mid].key)  
                    high=mid-1;  
                else if(k>ID.elem[mid].key)  
                    low=mid+1;  
                else  
                    p=mid;  
            }  
        }  
        s=ID.elem[p].stadr;  
        if(p==ID.length-1)  
            t=ST.length;//这里对p的判断很重要,p若是索引中最后一个位置,则t应该为ST的表长  
        else  
            t=ID.elem[p+1].stadr-1;  
        while(k!=ST.r[s]&&s<=t)//这里在块里进行顺序查找  
            s++;  
        if(s>t)  
            return 0;  
        else  
            return s;  
    }  
 

 

 

特点:

       分块查找实际上是两次查找过程,分块查找的效率结余顺序查找和二分查找之间。分块查找的优点是,在表中插入或删除一个记录时,只要找到记录所属的块,就在该块内进行插入和删除运算。因为块内数据存放是无序的,所以无需移动大量记录。分块查找主要代价(缺点)是要增加一个辅助数组的存储空间和将初始表分块排序的运算。

 

总结

      当用线性表作为表组织形式时,其中以二分查找效率最高。但由于二分查找要求表中记录有序,且不能以链表形式存储,因此,在标的插入和删除操作频繁时,为维护标的有序性,需要移动大量记录。这些大量的移动引起的额外时间开销就抵消了二分查找的优点了。所以二分查找只适用于静态表查找。若要对动态表进行高效查找,可用树表查找,下片博客将介绍树表查找。

 

  • 大小: 35 KB
2
1
分享到:
评论

相关推荐

    算法-数据结构和算法-3-顺序表.rar

    在这个压缩包“算法-数据结构和算法-3-顺序表.rar”中,我们重点探讨的是顺序表的概念、实现及其在实际问题中的应用。 顺序表是一种线性数据结构,它将元素存储在一块连续的内存区域中,每个元素都有一个唯一的索引...

    实验十二------顺序和二分查找算法

    顺序和二分查找算法 ...顺序查找算法和二分查找算法都是查找算法中重要的一种,它们都可以用来查找目标元素,但是它们的时间复杂度不同,二分查找算法的时间复杂度远远小于顺序查找算法的时间复杂度。

    数据结构-查找算法-C语言

    (1)掌握顺序查找,二分法查找和索引查找的算法思想及程序实现方法。 (2)掌握二叉排序树、AVL树的查找、插入、删除、建立算法的思想及程序实现方法。 (3)掌握散列存储结构的思想,能选择合适散列函数,实现...

    折半查找算法在顺序表中插入一个元素讲解.pdf

    折半查找算法在顺序表中插入一个元素讲解 折半查找算法是一种常用的查找算法,它可以在已经排好序的顺序表中快速地找到某个元素。下面我们来详细讲解折半查找算法在顺序表中插入一个元素的过程。 折半查找算法的...

    基于python的查找算法-顺序查找Sequential Search

    相比于其他高级查找算法,如二分查找、哈希表查找等,顺序查找的效率较低。但这些高级算法通常需要数据已经排序或特定的数据结构,而顺序查找则没有这样的限制。 例如,**二分查找**适用于已排序的数组,它的时间...

    算法-理论基础- 线性表- 顺序表(包含源程序).rar

    这个压缩包“算法-理论基础- 线性表- 顺序表(包含源程序).rar”包含了关于线性表特别是顺序表的理论知识和实际源代码,是学习数据结构与算法的重要资源。 线性表的顺序存储结构,也称为顺序表,是最简单也是最...

    数据结构与算法-实验一顺序表

    理解并掌握顺序表的基本操作对于学习数据结构与算法至关重要。 顺序表的主要操作包括: 1. 初始化线性表:创建一个新的顺序表,通常需要指定初始容量。在这个实验中,`seqList` 类的构造函数允许我们指定一个初始...

    查找算法集(顺序查找、二分查找、插值查找、动态查找)

    在给定的代码中,顺序查找算法函数nsq_Order_Search和sq_Order_Search分别实现了无序数组和有序数组的顺序查找。它们的参数包括被查找数组、数组元素个数和被查找的关键值。函数返回的值是目标元素在数组中的下标,...

    综合查找算法(顺序查找、折半查找、二叉排序树、哈希表)-数据结构课程设计

    本文将详细探讨四种常见的查找算法:顺序查找、折半查找、二叉排序树查找以及哈希表查找,并结合提供的"综合查找算法"课程设计项目,解析其在实际应用中的特点和优势。 **顺序查找**是最基础的查找算法,适用于任何...

    数据结构与算法-学生成绩管理(顺序)_C-C++_

    总之,这个项目是学习数据结构与算法的好例子,它涉及到数组操作、数据结构设计、内存管理以及基本的排序和查找算法。通过分析和理解这段代码,你可以加深对C/C++编程以及数据结构基础的理解,这对于任何软件开发者...

    数据结-构查找算法二分查找二叉顺序数哈希查找

    本章主要探讨了三种常见的查找算法:线性表的查找、树表的查找和哈希表的查找,以及它们的性能分析。 1. **二分查找**: 二分查找,也称为折半查找,适用于有序的线性表,如数组。算法的基本思路是将查找区间不断...

    数据结构与算法 -李春葆 实验报告-顺序表

    《数据结构与算法》实验报告主要探讨了顺序表这一线性表的实现方式,通过具体的C语言编程实现,包括顺序表的初始化、查找、插入和删除等基本操作。以下是相关知识点的详细说明: 1. **线性表的逻辑结构**: 线性表...

    C语言实现顺序表的顺序查找和折半查找

    在上面的代码中,我们实现了两种折半查找算法:非递归算法和递归算法。在main函数中,我们首先输入数组的元素个数和数组元素,然后输入要查询的数,并使用BinSearch1或BinSearch2函数来查找该元素。 本文详细介绍了...

    数据结构--索引顺序表查找

    ### 数据结构——索引顺序表查找 #### 一、引言 在计算机科学与软件工程领域,数据结构作为核心组成部分之一,在程序设计中扮演着极其重要的角色。它不仅能够优化算法性能,还能够提高程序的可读性和可维护性。其中...

    数据结构和算法-思维导图.pdf

    - 线性表查找和树结构查找,广度优先搜索和深度优先搜索,A*启发式搜索,贪心算法,分治算法,回溯算法,枚举算法,动态规划算法。 - 常见的位运算公式和多个hash函数映射。 5. **查找和搜索**: - 二叉搜索树、...

    二分查找算法

    如果数组或链表未排好序,可以使用其他查找算法,例如顺序查找算法或哈希表查找算法等。 在实际应用中,二分查找算法广泛应用于数据库查询、搜索引擎、文件系统等领域,例如在数据库中查找特定的记录、在搜索引擎中...

    C 语言几种常见的查找算法

    本篇文章总结了几种常用的查找算法,包括静态查找、顺序查找、索引顺序表查找、折半查找和次优查找树等。这些算法都是在C语言中实现的,旨在帮助读者更好地理解和应用这些查找算法。 一、静态查找 静态查找是指在...

    查找算法代码C++——包括顺序、二分、BST、哈希

    本资源提供了C++实现的四种主要查找算法:顺序查找、二分查找、BST(二叉搜索树)查找以及哈希查找。下面将详细阐述这四种查找算法及其在C++中的实现。 1. **顺序查找**: 顺序查找是最基础的查找方法,适用于任何...

Global site tag (gtag.js) - Google Analytics