02-2.2.3 顺序表的查找

按位查找

GetElem(L, i)按位查找操作——获取表L中第i个位置的元素的值
采用静态分配方式:

#define MaxSize 10//定义最大长度
typedef struct{
	ElemType data[MaxSize];//用静态的“数组”存放数据元素
	int length;//顺序表的当前长度
}SqList;//顺序表的类型定义(静态分配方式)

ElemType GetElem(SqList L, int i){
	return L.data[i-1];
}

采用动态分配方式:

#define InitSize 10//顺序表的初始长度
typedef struct{
	ElemType *data;//指示动态分配数组的指针
	int MaxSize;//顺序表的最大容量
	int length;//顺序表的当前长度
}SeqList;//顺序表的类型定义(动态分配方式)

ElemType GetElem(SeqList L, int i){
	return L.data[i-1];
}

如果一个ElemType6B,即sizeof(ElemType)==6,指针data[0]指向的地址为2000
那么data[1]的地址就是2006data[2]的地址就是2012


再次理解,为什么malloc函数返回的存储空间起始地址要转换为与数据元素的数据类型相对应的指针[[2.2.1 顺序表的定义#^4b2725]]

按位查找的时间复杂度

ElemType GetElem(SeqList L, int i){
	return L.data[i-1];
}

时间复杂度O(1)
由于顺序表的各个数据元素在内存中连续存放,因此可以根据起始地址和数据元素大小立即找到第i个元素——“随机存取”特性[[2.2.1 顺序表的定义#^0b5def]]

按值查找

LocateElem(L, e)按值查找操作——在表L中查找具有给定关键字值的元素

#define InitSize 10
typedef struct{
	ElemType *data;
	int MaxSize;
	int length;
}SeqList;

//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SeqList L, ElemType e){
	for(int i=0; i<L.length; i++)
		if(L.data[i]==e)
			return i+1;//数组下标为i的元素值等于e,返回其位序i+1
	return 0;//退出循环,说明查找失败 
}

提问: 如果说定义的是结构类型的数据元素是不是也可以用==运算符呢?
答案: 不能,甚至无法编译。如果需要对比,需要自己编写代码,对于结构中的分量进行单独对比,如下面代码所示。

if(a.num == b.num && a.people == b.people){
	printf("相等");
}else{
	printf("不相等");
}

注意:
在考研初试中,手写代码可以直接用==
无论是ElemType是基本数据类型还是结构类型

按值查找的时间复杂度

//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SeqList L, ElemType e){
	for(int i=0; i<L.length; i++)
		if(L.data[i]==e)
			return i+1;//数组下标为i的元素值等于e,返回其位序i+1
	return 0;//退出循环,说明查找失败
}

代码分析:
最好情况:目标元素在表头,循环1次,最好时间复杂度=O(1)
最坏情况:目标元素在表尾,循环n次,最坏时间复杂度=O(n)
平均情况:假设目标元素出现在任何一个位置的概率都相同,都是 1 n \frac{1}{n} n1
i=0,循环1次;i=1,循环2次;……;i=n-1,循环n
平均循环次数= 1 ∗ 1 n + 2 ∗ 1 n + 3 ∗ 1 n + . . . + n ∗ 1 n 1*\frac{1}{n}+2*\frac{1}{n}+3*{1}{n}+...+n*\frac{1}{n} 1n1+2n1+31n+...+nn1
= n ( n + 1 ) 2 1 n \frac{n(n+1)}{2}\frac{1}{n} 2n(n+1)n1
= n + 1 2 \frac{n+1}{2} 2n+1
平均时间复杂度=O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beast Cheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值