顺序表的按位查找
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];
}
GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。
动态分配:
#define InitSize 10
//顺序表的初始长度
typedef struct{
ElemType *data;
//指示动态分配数组的指针
int MaxSize;
//顺序表的最大容量
int length;
//顺序表的当前长度
} SeqList;
//顺序表的类型定义(动态分配方式)
动态分配
ElemType GetElem(SeqList L, int i){
return L.data[i-1];
}
ElemType *data //和访问普通数组的方法一样
按位查找时间复杂度
ElemType *data
ElemType GetElem(SeqList L, int i){
return L.data[i-1];
}
时间复杂度:O(1)
👉👉👉
由于顺序表的各个数据元素在内存中连续存放,
因此可以根据起始地址和数据元素大小立即找到
第 i 个元素——“随机存取”特性。
顺序表的按值查找
#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; //退出循环,说明查找失败
}
LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。
//在顺序表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;
//退出循环,说明查找失败
}
Tips
:
《数据结构》考研初试中,手写代码可以直接用“
==
”,无论
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
目标元素在第
1
位,循环
1
次;在第
2
位,循环
2
次;
……
;在第
n
位,循环
n
次
平均循环次数 = 1
= 1⋅ 1/n + 2 ⋅ 1/n + 3 ⋅ 1/n+ …… + n ⋅ 1/n = n(n+1)/2 ⋅1/n=(n+1)/2
平均时间复杂度
= O(n)
关注最
深层循环语句的执 型
次数与问
题规模 n 的关系
问题规模
n = L.length
(表长)
总结一下: