第九章:查找(1)静态查找表

1、抽象数据类型静态查找表的定义为:



2、顺序表的查找:

以顺序表或线性表表示静态查找表。

//数据元素定义
typedef struct{
	KeyType key;        //关键字域
//  ..                  //其他域
}SElemType;

//----------静态查找表的顺序存储结构-------
typedef struct{
	SElemType *elem;            //数据元素存储空间基址,建表时按实际长度分配, 0 号单元留空
	int length;                 //表长度
}SSTable;


3、代码部分:

--------------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>
#include<stdlib.h>

//---对数值型关键字
#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)
*/

#define OK 1
#define ERROR 0
typedef int KeyType;

//数据元素定义
typedef struct{
	KeyType key;        //关键字域
//  ..                  //其他域
}SElemType;

//----------静态查找表的顺序存储结构-------
typedef struct{
	SElemType *elem;            //数据元素存储空间基址,建表时按实际长度分配, 0 号单元留空
	int length;                 //表长度
}SSTable;

//创建顺序查找表
int Create(SSTable *ST){
	int i,n;
	printf("请输入你要创建的表的长度: \n");
	scanf("%d",&n);
	ST->elem=(SElemType *)malloc((n+1)*sizeof(SElemType));
	if(!ST->elem) return 0;
	printf("请输入 %d 个数据。\n",n);
	for(i=1;i<=n;i++)
		scanf("%d",&(ST->elem[i].key));
	ST->length=n;
	return 1;
}

//在顺序表中查找其关键字等于key的数据元素,若找到,则函数值为该元素在表中的位置,否则为0 ,指针变量time记录所需和关键字进行比较的次数。
int Search(SSTable ST,KeyType key,int *time){
	int i;
	ST.elem[0].key=key;            //哨兵
	for(i=ST.length ; !EQ(ST.elem[i].key,key) ; --i,*time++);   //从后往前查找
		return i;
	return OK;
}

//主函数
void main(){
	int i,time;
	char ch;
	SSTable ST;
	KeyType key;
	if(Create(&ST)){
		printf("创建成功!\n");
		do{
			printf("请输入你要查找的关键字:\n");
			scanf("%d",&key);
			i=Search(ST,key,&time);
			if(i!=0){
				printf("查找成功!\n");
				printf("位置是 %d \n",i);
				printf("比较的次数是 %d",time);
			}
			else{
				printf("\n查找失败\n");
				printf("查找次数 是 %d",time);
				printf("/nContinue(y/n):/n");/*是否继续,y或Y继续查询,其它退出查询*/
				ch=getchar();
			}
		}while(ch=='y'||ch=='Y');
	}
	else
		printf("建表失败!\n");
}

4、解释:

        在查找之前对 ST.elem[0] 的关键字赋值 key ,目的在于免去查找过程中每一步都要检测整个表是否查找完毕。


5、性能分析:

       衡量一个算法的好坏的量度有 3 条:

      (1)时间复杂度

      (2)空间复杂度

      (3)算法的其他性能


6、扩展:

       有时,表中各个记录的查找概率并不相等。例如;将全校学生的兵力档案建立一张表存放在计算机中,则体弱多病同学的病例记录的查找概率必定高于健康同学的病例记录。因此,对记录的查找概率不等的查找表若能预先得知每个记录的查找概率,则应先对记录的查找概率进行排序,使表中记录按查找概率由小到大重新排序,以便提高查找效率。

      然而一般情况下,记录的查找概率预先无法测定。为了提高查找效率,我们可以在每个记录中附设一个访问频度域,并使顺序表中的记录始终保持按访问频度非递减有序的次序排列,使得查找概率大的记录在查找过程中不断后移,以便在以后的卓次查找中减少比较次数。或者在每次查找之后都将刚查找到的记录直接移至表尾。


7、顺序表的缺点:

  


猜你喜欢

转载自blog.csdn.net/qq_40191710/article/details/79610744