首页 > 编程语言 >算法与数据结构实验五 查找

算法与数据结构实验五 查找

时间:2022-12-12 15:34:15浏览次数:41  
标签:typedef ElementType int 列表 算法 查找 Key 数据结构 散列

实验项目名称:实验    查找  

一、 实验目的
1.掌握散列表的建立
2.掌握散列查找算法的实现。

二、 实验内容

6-2 线性探测法的查找函数

试实现线性探测法的查找函数。

函数接口定义:

Position Find( HashTable H, ElementType Key );

其中HashTable是开放地址散列表,定义如下:

#define MAXTABLESIZE 100000  /* 允许开辟的最大散列表长度 */

typedef int ElementType;     /* 关键词类型用整型 */

typedef int Index;           /* 散列地址类型 */

typedef Index Position;      /* 数据所在位置与散列地址是同一类型 */

/* 散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素 */

typedef enum { Legitimate, Empty, Deleted } EntryType;

 

typedef struct HashEntry Cell; /* 散列表单元类型 */

struct HashEntry{

    ElementType Data; /* 存放元素 */

    EntryType Info;   /* 单元状态 */

};

 

typedef struct TblNode *HashTable; /* 散列表类型 */

struct TblNode {   /* 散列表结点定义 */

    int TableSize; /* 表的最大长度 */

    Cell *Cells;   /* 存放散列单元数据的数组 */

};

函数Find应根据裁判定义的散列函数Hash( Key, H->TableSize )从散列表H中查到Key的位置并返回。如果Key不存在,则返回线性探测法找到的第一个空单元的位置;若没有空单元,则返回ERROR。

裁判测试程序样例:

#include <stdio.h>#define MAXTABLESIZE 100000  /* 允许开辟的最大散列表长度 */typedef int ElementType;     /* 关键词类型用整型 */typedef int Index;           /* 散列地址类型 */typedef Index Position;      /* 数据所在位置与散列地址是同一类型 *//* 散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素 */typedef enum { Legitimate, Empty, Deleted } EntryType;typedef struct HashEntry Cell/* 散列表单元类型 */struct HashEntry{    ElementType Data; /* 存放元素 */    EntryType Info;   /* 单元状态 */};typedef struct TblNode *HashTable/* 散列表类型 */struct TblNode {   /* 散列表结点定义 */    int TableSize; /* 表的最大长度 */    Cell *Cells;   /* 存放散列单元数据的数组 */};HashTable BuildTable(); /* 裁判实现,细节不表 */Position Hash( ElementType Key, int TableSize ){    return (Key % TableSize);}#define ERROR -1Position Find( HashTable H, ElementType Key );int main(){    HashTable H;    ElementType Key;    Position P;    H = BuildTable();     scanf("%d", &Key);    P = Find(H, Key);    if (P==ERROR)        printf("ERROR: %d is not found and the table is full.\n", Key);    else if (H->Cells[P].Info == Legitimate)        printf("%d is at position %d.\n", Key, P);    else        printf("%d is not found.  Position %d is returned.\n", Key, P);    return 0;}/* 你的代码将被嵌在这里 */

输入样例1:(注:-1表示该位置为空。下同。)

11

11 88 21 -1 -1 5 16 7 6 38 10

38

输出样例1:

38 is at position 9.

输入样例2:

11

11 88 21 -1 -1 5 16 7 6 38 10

41

输出样例2:

41 is not found.  Position 3 is returned.

输入样例3:

11

11 88 21 3 14 5 16 7 6 38 10

41

输出样例3:

ERROR: 41 is not found and the table is full.

7-1 整型关键字的散列映射

给定一系列整型关键字和素数P,用除留余数法定义的散列函数H(Key)=Key将关键字映射到长度为P的散列表中。用线性探测法解决冲突。

输入格式:

输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。

输出格式:

在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。

输入样例:

4 5

24 15 61 88

输出样例:

4 0 1 3

三、 设计文档

 

 

四、 源程序

6-2 线性探测法的查找函数

Position Find( HashTable H, ElementType Key ){

    int x=Hash(Key,H->TableSize);

    int a=0;

    while(a<H->TableSize){

        if( H->Cells[x].Info==Empty//题目里还给了个Deleted,没有测试点不鸟它了

           ||H->Cells[x].Data == Key){//可不能等于Legitimate

            return x;

        }

        x=(x+1)%H->TableSize;

        a++;

    }

    return ERROR;

}

 

 

 

 

 

 

7-1 整型关键字的散列映射

//输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数)

//分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。

#include <iostream>

using namespace std;

const int MAX = 1000;

 

int main()

{

    int N,P;

    cin >> N >> P; //P为散列表的长度

    int data[MAX];//输入数据

    for(int i = 0;i<N;i++)

    {

        cin >> data[i];

    }

    int HashList[P];

    int index[MAX];

    for(int i = 0;i<P;i++)

        HashList[i] = -1;

    for(int i = 0;i<N;i++)

    {

        int d,j = 0;//j为移动的位置

        d = data[i]%P;

        if(data[i]==HashList[d])

        {

            index[i] = d;

            continue;

        }

        while((HashList[d]!=-1)&&(j<P)&&(data[i]!=HashList[d]))//说明该位置没有元素

        {

            j++;

            d = (d+1)%P;

        }

        HashList[d] = data[i];

        index[i] = d;

    }

    for(int i = 0;i<N-1;i++)

    {

        cout << index[i] << ' ';

    }

    cout << index[N-1];

    return 0;

}

 

标签:typedef,ElementType,int,列表,算法,查找,Key,数据结构,散列
From: https://www.cnblogs.com/DREAM2021/p/16976178.html

相关文章

  • 算法与数据结构实验六 内部排序
    实验项目名称:实验六    内部排序 一、 实验目的1.掌握插入排序的方法及效率分析2.掌握选择排序的方法及效率分析3.掌握交换排序的方法及效率分析4.掌握归并排序的......
  • 卡尔曼滤波算法-通俗理解
    简单来说,卡尔曼滤波器是一个“optimalrecursivedataprocessingalgorithm(最优化自回归数据处理算法)”。对于解决很大部分的问题,他是最优,效率最高甚至是最有用的。他的广......
  • Linux查找find命令全面剖析
    Linux查找find命令全面剖析1.文件查找在文件系统上查找符合条件的文件1.1简述locate命令非实时查找(数据库查找)依赖于事先构建的索引,索引的构建是在系统较为空闲时自动......
  • TIANCHI天池-OGeek算法挑战赛-完整方案及代码(亚军)
    首先很幸运拿到TIANCHI天池-OGeek算法挑战赛大赛的亚军,同时非常感谢大佬队友的带飞,同时希望我的分享与总结能给大家带来些许帮助,并且一起交流学习。(作者:王贺,知乎:鱼遇雨欲语......
  • 每日算法之把数组排成最小的数
    JZ45把数组排成最小的数描述输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3,32,321],则打印出这三......
  • 第一章算法概述总结
    代码规范类及其排版格式声明属性依次序是public:、protected:、private:。关键字public,protected,private不要缩进,声明的函数和变量缩进一个制表符。类声明前应加上注释,注......
  • 常见数据结构与算法的Python实现
    有人问我数据结构与算法怎么学?怎么用Python实现常见的数据结构算法?我找到一个github标星66.6k+的仓库,把各种常见算法用Python实现了,而且还有动图演示,非常值得推荐。(黄海广)仓......
  • 推荐:常见算法的python实现(github上25000多star)
    近日在github上发现一个25000多star的仓库,把各种常见算法用python实现了,而且还有动图演示,非常值得推荐。仓库说明这个仓库用python语言实现了绝大部分算法,主要是用于教学目......
  • 《3D计算机视觉:原理、算法及应用》一本全搞定
       1966年,人工智能学家Minsky在给学生布置的作业中,要求学生通过编写一个程序让计算机告诉我们它通过摄像头看到了什么,这也被认为是计算机视觉(ComputerVision,CV)最早的......
  • 数据算法之数据结构
      packagecom.Lucky.DataStructure;/*数据结构:逻辑结构+储存结构+储存结构的运算逻辑结构分为:线性结构1:1树状结构......