算法学习之查找算法:静态查找表(1)顺序表查找

引言:

对查找表一般的操作有:1、查询某个“特定的”数据元素是否在查找表中;2、检索某个“特定的”数据元素的各种属性;3、在查找表中插入一个数据元素;4、从查找表中删去某个数据元素。

静态查找表的操作只包括两种:1、查找某个“特定的”数据元素是否在查找表中;2、检索某个“特定的”数据元素的各种属性;

静态查找表又有四种表现形式:顺序表的查找、有序表的查找、静态树的查找、索引顺序表的查找。

静态查找涉及的关键字类型和数据元素类型统一说明:

/*典型关键字类型*/
typedef float   KeyType;     //实型
typedef int     KeyType;     //整型
typedef char    *KeyType;   //字符串型
/*数据元素类型*/
typedef struct{
         KeyType   key;     //关键字域
         .....                        //其他域
}SElemType;
/*对两个关键字的比较约定如下*/
//-----对数值型关键字
#define EQ(a, b)    ((a) == (b))
#define LT(a, b)    ((a)  <   (b))
#define LQ(a, b)    ((a)  >   (b))
//-----对字符型关键字
#define EQ(a, b)    (!strcmp((a), (b)))
#define LT(a, b)    (strcmp((a), (b)) < 0)
#define LQ(a, b)    (strcmp((a), (b)) <= 0)

顺序表结构定义如下:

typedef struct{

ElemType   *elem;   //数据元素存储空间基址,建表时按实际长度分配,0号单元留空

int                length; //表长度

}SSTable;

       顺序查找过程:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不相等,则表明表中没有所查记录,查找不成功。

假设顺序表长度为10,即length=11,elem所指各个数据为:10  25   36  49  52  15  68  45  90  80 .图示顺序查找如下:

elem--->    [0]   [1]    [2]    [3]  
 [4]    [5]    [6]    [7]  
 [8]    [9]    [10]

‘\0‘   10   25    36     49    52   15     68    45    90    80

elem的0号单元为空,假设查找元素在顺序表中,比如查找36,则首先将36放入elem的0号单元中,然后依次从80开始往前比较,直到遇到3号单元中的36,查找成功。示例如下:

elem--->    [0]   [1]    [2]    [3]    [4]    [5]    [6]    [7]    [8]    [9]    [10]

36  10   25    36     49    52   15     68    45    90    80      //将36放入0号单元,作为哨兵

elem--->    [0]   [1]    [2]    [3]    [4]    [5]    [6]    [7]    [8]    [9]    [10]

36   10   25    36     49    52   15     68    45    90    80    //将36与80比较,不等则继续向前

elem--->    [0]   [1]    [2]    [3]    [4]    [5]    [6]    [7]    [8]    [9]    [10]

36   10   25    36     49    52   15     68    45    90    80     //将36与90比较,不等则继续向前

。。。。。。。。。

依次往前移动比较元素,当比较到3号单元时,相等,则比较结束

elem--->    [0]   [1]    [2]    [3]    [4]    [5]    [6]    [7]    [8]    [9]    [10]

36   10   25    36    49    52   15     68    45    90    80 //将36与36比较,相等,比较结束,返回i

如果比较的值不在顺序表中,比如给定的值为5,首先将5放入0号单元,

elem--->    [0]   [1]    [2]    [3]    [4]    [5]    [6]    [7]    [8]    [9]    [10]

5      10   25    36     49    52   15     68    45    90    80      //将5放入0号单元,作为哨兵

当比较到5时,返回i的值为0。表示查找失败。

以静态查找表的顺序存储结构实现:

示例代码(C语言描述):

/*********************************************************************
Author:李冰 date:2014-9-20
Email:[email protected]
*********************************************************************/
#define EQ(a, b) ((a) == (b))

#define	ElemType	int
typedef struct{
	ElemType 	*elem;  //数据元素存储空间基址,建表时按实际长度分配,0号单元留空
	int 		length;  //表长度
}SSTable;

//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0
int Search_Seq(SSTable ST, ElemType key)
{
	int i;
	ST.elem[0] = key;      //“哨兵”
	for(i = ST.length; !EQ(ST.elem[i], key); --i);  //从后往前找

	return i;               //找不到时,i为0
}

       性能分析:我们知道当讨论一个程序的性能时一般从3个角度:时间复杂度、空间复杂度、和算法的其他性能。由于在查找过程中,通常只是需要一个固定大小的辅助空间来做比较,所以空间复杂度是一定的。而时间复杂度却是可变的:其关键字和给定值进行过比较的记录个数的平均值。

适用范围:顺序查找一般适用于查找数据比较少的情况下。

      优点:

1、算法实现简单且适应面广

2、对表的结构无任何要求,无论记录是否按关键字有序排列。

3、即适用于顺序表又适用于单链表。

     缺点:

1、平均查找长度较大,特别是当n很大时,查找效率较低。

2、速度慢,平均查找长度为 (n + 1) / 2,时间复杂度为 O(n)

时间: 2024-08-05 19:35:52

算法学习之查找算法:静态查找表(1)顺序表查找的相关文章

算法学习笔记 KMP算法之 next 数组详解

最近回顾了下字符串匹配 KMP 算法,相对于朴素匹配算法,KMP算法核心改进就在于:待匹配串指针 i 不发生回溯,模式串指针 j 跳转到 next[j],即变为了 j = next[j]. 由此时间复杂度由朴素匹配的 O(m*n) 降到了 O(m+n), 其中模式串长度 m, 待匹配文本串长 n. 其中,比较难理解的地方就是 next 数组的求法.next 数组的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀,也可看作有限状态自动机的状态,而且从自动机的角度反而更容易推导一些. "前

《数据结构》复习之线性表(顺序表和链表)

线性表的概念 线性表的比较 线性表的数据结构 顺序表的算法操作 双链表的补充 总结 1.线性表的概念 线性表的存储结构有顺序存储结构和链式存储结构两种.前者成为顺序表,后者称为链表. 顺序表: 顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示. 链表 在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下

数据结构Java实现02----线性表与顺序表

[正文] 本节内容: 线性结构 线性表抽象数据类型 顺序表 顺序表应用 一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有后继数据元素. 则称这样的数据结构为线性结构. 二.线性表抽象数据类型: 1.线性表抽象数据类型的概念: 线性表抽象数据类型主要包括两个方面:既数据集合和该数据集合上的操作集合. 数据集合: 可以表示为a0,a1,a2,...a

线性表之顺序表奇偶调整和单链表就地逆置

线性表之顺序表奇偶调整,就是指将顺序表的奇数与偶数位置互换,以最优方法解决,因为方法很多,比如,开辟一个新的顺序表分别存放奇偶数,也可以从头向后寻找奇偶数放置到尾部或头部,但这些都会增大时间与空间的消耗.最优法则是前后分别寻找奇偶不同类型数,满足前奇后偶(或前偶后期),交换两数位置,实现时间复杂度O(n),空间O(1)的方案. void AdjustSqlist(SeqList *L) { int i=0,j=L->last; int temp; while(i<j) { while(L-&g

线性表之顺序表C++实现

线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件#include<iostream> const int MaxSize = 100;//定义顺序表SeqList的模板类template<class DataType>class SeqList{public: //顺序表无参构造器(创建一个空的顺序表) SeqList(){ length = 0 } //顺序表有参构造器(创建一个长度为n的顺序表) SeqList(DataType array[], int

C#线性表之顺序表

线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素位置的前面都只有一个数据元素: (2)除最后一个位置的数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是一个接一个的排列.因此,可以把线性表想象为一种数据元素序列的数据结构. 线性表的接口如下所示. public interface I

数据结构Java实现01----线性表与顺序表

一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有后继数据元素. 则称这样的数据结构为线性结构. 二.线性表抽象数据类型: 1.线性表抽象数据类型的概念: 线性表抽象数据类型主要包括两个方面:既数据集合和该数据集合上的操作集合. 数据集合: 可以表示为a0,a1,a2,...an-1,每个数据元素的数据类型可以是任意的类型. 操作集合包括如下: 1

[C++] 数据结构(C):线性表之顺序表

1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + Status GetElement(SeqList L, int i, ElementType &e) (按位)取值  + int LocateElement(SeqList L, ElementType e) (按值)查找  + Status ListInsert(SeqList &L, int i, ElementType e) (按位)插入  + Status ListDelet

数据结构-线性表_顺序表

进入大学一年了,今日终于有勇气写写随笔并展示出来了. 如有不足之处,请大家指正. 今日我想写的就是我对数据结构-线性表_顺序表的理解. 不BB了,进入正题!!!!! 数据结构中的逻辑结构分为线性结构和非线性结构,而线性表就属于线性结构. 线性结构是 n 个数据元素的有序(次序)集合,它有下列几个特征: 集合中必存在唯一的一个 "第一个元素": 集合中必存在唯一的一个 "最后的元素": 除最后元素之外,其它数据元素均有唯一的 "后继": 除第一元素

线性表之顺序表(C语言实现)

线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一个元素有前驱元素,单无后继元素. 可以抽象为如下表述: 元素1 元素2 元素3 元素4 元素5 元素6 然而同一种逻辑结构在内存中却可以有两种存储方式:1.在内存中连续存储的线性表-----顺序表(如数组)                  2.在内存中离散存储的线性表-----链表(如单链表,双链