顺序表查找/折半查找和开放地址发与链地址法建立哈希表

本文详细介绍了查找的概念和定义,特别是针对顺序表、折半查找和哈希表查找方法的分析。顺序表查找效率最低,平均查找长度为O(n)。折半查找适用于有序表,平均查找长度为O(log2(n+1))。哈希表查找通过Hash函数减少查找时间,但可能出现冲突。文章探讨了多种处理冲突的方法,如开放地址法(线性探查和二次探查)和链地址法,并提供了相关代码实现。
摘要由CSDN通过智能技术生成

顺序表查找/折半查找和开放地址发与链地址法建立哈希表

1.查找的概念
查找(或检索)是在给定信息集上寻找特定信息元素的过程。
待查找的数据单位(或数据元素)称为记录。记录由若干数据项(或属性)组成,如学生记录:
在这里插入图片描述
其中,“学号”、“姓名”、“性别”、“年龄”等都是记录的数据项。若某个数据项的值能标识(或识别)一个或一组记录,称其为关键字(key)。若一个key能唯一标识一个记录,称此key为主key。如“学号”的值给定就唯一对应一个学生,不可能多个学生的学号相同,故“学号”在学生记录里可作为主key。若一个key能标识一组记录,称此key为次key。如“年龄”值为20时,可能有若干同学的年龄为20岁,故“年龄”可作次key。下面主要讨论对主key的查找。

2.查找的定义
设记录表L=(R1 R2……Rn),其中Ri(l≤i≤n)为记录,对给定的某个值k,在表L中确定key=k的记录的过程,称为查找。若表L中存在一个记录Ri的key=k,记为Ri.key=k,则查找成功,返回该记录在表L中的序号i(或Ri 的地址),否则(查找失败)返回0(或空地址Null) 。

3.查找的方法
查找方法很多,有顺序查找、折半查找、分块查找、树表查找及Hash表查找等等。查找算法的优劣将影响到计算机的使用效率,应根据应用场合选择相应的查找算法。

4.顺序表查找算法分析
①所谓顺序表(Sequential Table),是将表中记录(R1 R2……Rn)按其序号存储于一维数组空间。其特点是相邻记录的物理位置也是相邻的。
记录Ri的类型描述如下:
typedef struct
{ keytype key; //记录key//
…… //记录其他项//
}Retype;
②顺序表查找特点:
可以对无序记录表查找,但是效率是最低的,查找某记录几乎要扫描整个表,当表长n很大时,会令人无法忍受。
平均查找长度: ASL=O(n)。
③代码的实现

#include <stdio.h>

#define N 13

int seqsearch(int *m,int x);
int main(int argc,const char *argv[])
{
   
	int m[N] = {
   11,17,26,49,52,77,89,99,110,117,567,2333,434354};
	int x,pos;
	char ch;
	while(1)
	{
   
		printf("Please input the value that you want to search:");
		scanf("%d",&x);
		while(getchar() != '\n');
		pos = seqsearch(m,x);
		if(-1 == pos)
			printf("Not find the x\n");
		else
			printf("Value %d at %d\n",x,pos);

		printf("Continue to input y or Y :");
		scanf("%c",&ch);
		while(getchar() != '\n');
		if('y' == ch || 'Y' == ch)
			continue;
		else
			break;
	}
	return 0;
}

int seqsearch(int *m,int x)
{
   
	int i = N-1;
	for(;i>=0;i--)
	{
   
		if(m[i] == x)
		{
   
			return i;
		}
	}
	return -1;
}

5.折半查找算法分析
当记录的key按关系≤或≥有序时,则对给定值k,逐步确定待查记录所在区间,每次将搜索空间减少一半(折半),直到查找成功或失败为止。
算法思想:
②设两个指针(或游标)low、high,分别指向当前待查找表的上界(表头)和下界(表尾)。对于表(R1 R2……Rn),初始时low=0、high=n-1,令:mid=⌊(low+high)/2⌋
③折半查找特点:
只能对有序记录表查找,效率相对较高。
平均查找长度: ASL=O(log2(n+1)),大大优于O(n)。
④代码实现

#include <stdio.h>

#define N 13

int binsearch(int *m,int x);
int main(int argc, const char *argv[])
{
   
	int m[N] = {
   11,17,26,49,52,77,89,99,110,117,567,2333,434354};
	int x,pos;
	char ch;
	while(1)
	{
   
		printf("Please input the value that you want to search:");
		scanf("%d",&x);
		while(getchar() != '\n');
		pos = binsearch(m,x);
		if(-1 == pos)
			printf("Not find the value\n");
		else
			printf("Value %d at %d\n",x,pos);
		
		printf("Continue to input y or Y :");
		scanf("%c",&ch);
		while(getchar() 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值