Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【数据结构实验】查找(二)基于线性探测法的散列表

【数据结构实验】查找(二)基于线性探测法的散列表

作者头像
Qomolangma
发布于 2024-07-30 02:54:48
发布于 2024-07-30 02:54:48
25100
代码可运行
举报
文章被收录于专栏:深度学习深度学习
运行总次数:0
代码可运行

1. 引言

本实验将通过C语言实现基于线性探测法的散列表

2. 实验原理

2.1 散列表

  散列表(Hash Table)是一种常用的数据结构,用于快速存储和查找数据。在散列表中,通过散列函数将关键字映射到一个索引位置,然后将数据存储在该位置上。然而,由于不同的关键字可能映射到相同的索引位置,就会发生散列冲突。线性探测法是一种解决冲突的方法,它在发生冲突时,顺序地检查下一个位置,直到找到一个空闲的位置或者遍历完整个散列表。

2.2 线性探测法

  基于线性探测法的散列表查找是一种解决散列冲突(Hash Collision)的方法之一。具体的线性探测法查找过程如下:

  1. 根据关键字计算散列值,得到初始的索引位置。
  2. 如果该位置为空,表示没有发生冲突,查找失败,返回结果。
  3. 如果该位置不为空,比较关键字是否匹配,如果匹配,则查找成功,返回结果。
  4. 如果不匹配,则继续检查下一个位置(通过线性探测法的方式,即加1),直到找到一个空闲位置或者遍历完整个散列表。
  5. 如果找到空闲位置,表示查找失败,返回结果。
  6. 如果遍历完整个散列表,表示查找失败,返回结果。

  需要注意的是,线性探测法可能会导致聚集(Clustering)现象,即相邻的位置都被占用,导致查找效率下降。为了解决这个问题,可以采用其他的解决冲突方法,如链表法(Chaining)或二次探测法(Quadratic Probing)。

3. 实验内容

3.1 实验题目

   编写算法构造教材图 8.47 的拉链表,输出散列表每个槽对应的单链表,并编程计算查找成功时的平均查找长度。

(一)输入要求
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    char *A[30]={
        "THE","OF","AND","TO","A",
        "IN","THAT","IS","WAS","HE",
        "FOR","IT","WITH","AS","HIS",
        "ON","BE","AT","BY","I",
        "THIS","HAD","NOT","ARE","BUT",
        "FROM","OR","HAVE","AN","THEY",
    };
  • 散列函数自选。
(二)输出要求
  1. 输出散列表,空位输出“NULL”;
  2. 编程计算并输出查找成功时的平均查找长度。

3.2 算法实现

三、实验设计

散列表数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char *TABLE[31] = { "\0" };

  数组 TABLE,包含 31 个元素,每个元素是一个字符串指针。

插入函数 L

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void L(char *TABLE[31], char *K, int M)
{
    int i = B[N];
    while (TABLE[i])
    {
        sum++;
        if (strcmp(TABLE[i], K) == 0)
            return;
        i = (i + 1) % M;
    }
    if (N < M - 1)
    {
        TABLE[i] = K;
        N++;
        return;
    }
    return;
}

  插入函数 L 用于在散列表中插入数据。当发生冲突时,使用线性探测法沿着数组查找下一个可用的位置。

主函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(){
    char *A[30] = { /* ... */ };
    char *TABLE[31] = { "\0" };
    int i;
    for (i = 0; i < 30; i++){
        L(TABLE, A[i], 31);
    }
    for (i = 0; i < 31; i++){
        if (TABLE[i])
            printf("%d:%s\n", i, TABLE[i]);
        else
            printf("%d:NULL\n", i);
    }
    N = 0;
    sum = 0;
    for (i = 0; i < 30; i++){
        L(TABLE, A[i], 31);
        N++;
    }
    printf("\n平均查找长度为%f", (float)sum / 30);
}

3.3 代码整合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
#include<string.h>
int B[31]={
    25,9,11,27,1,7,9,26,5,13,
    27,29,2,18,18,1,7,21,27,9,
    6,13,21,22,3,22,29,26,15,0
};
int sum=0,N=0;
void L(char *TABLE[31],char *K,int M)
{
    int i=B[N];
    while(TABLE[i])
    {
        sum++;
        if(TABLE[i]==K)	return;
        i=(i+1)%M;
    }
    if(N<M-1)
    {
        TABLE[i]=K;
        N++;
        return;
    }
    return;
}
int main(){
    char *A[30]={
        "THE","OF","AND","TO","A",
        "IN","THAT","IS","WAS","HE",
        "FOR","IT","WITH","AS","HIS",
        "ON","BE","AT","BY","I",
        "THIS","HAD","NOT","ARE","BUT",
        "FROM","OR","HAVE","AN","THEY",
        };
    char *TABLE[31]={"\0"};
    int i;
    for(i=0;i<30;i++){
        L(TABLE,A[i],31);
    }
    for(i=0;i<31;i++){
        if(TABLE[i])
            printf("%d:%s\n",i,TABLE[i]);
        else
            printf("%d:NULL\n",i);
    }
    N=0;
    sum=0;
    for(i=0;i<30;i++){
        L(TABLE,A[i],31);
        N++;
    }
    printf("\n平均查找长度为%f",(float)sum/30);
}

4. 实验结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
中序遍历:
0:
1:A
2:WITH
3:ON
4:BUT
5:WAS
6:THIS
7:IN
8:BE
9:OF
10:THAT
11:AND
12:I
13:HE
14:HAD
15:OR
16:HAVE
17:AN
18:AS
19:HIS
20:THEY
21:AT
22:NOT
23:ARE
24:FROM
25:THE
26:IS
27:TO
28:FOR
29:IT
30:BY

平均查找长度为3.600000
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【数据结构与算法】哈希表实现:闭散列 && 开散列
​ 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在 查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为 O(N),平衡树中为树的高度,即 O(
利刃大大
2025/05/01
630
【数据结构与算法】哈希表实现:闭散列 && 开散列
数据结构与算法-散列表
无论是顺序表还是树表,查找数据元素时要进行一系列的键值比较的过程,为了减少比较次数,就需要使数据元素的存储位置和键值之间建立某种联系,为此我们就需要使用散列技术动态查找表。首先我们需要熟悉几个基本一概念:
越陌度阡
2020/11/26
8750
数据结构与算法-散列表
查找----基于散列表(线性探测法)
上一篇:基于散列表(拉链法)的查找 参照数据结构--符号表API实现。 除了拉链法,实现散列表的另一种方式就是用大小为M的数组保存N个键值对。 线性探测法:当碰撞发生时,直接检测散列表中的下一位置。这样线性探测可能发生三种结果: 命中--该位置的键和被查找的键相同 未命中--键为空(该位置没有键) 继续查找--该位置的键和被查找的键不同 开放地址类的散列表的核心思想是与其将其内存用作链表,不如将它们作为散列表中的空元素。这些空元素可以作为查找结束的标志。 使用两个平行数组来保存键值对。 线性探测法的核心方法
SuperHeroes
2018/05/30
2.7K0
【数据结构实验】查找(一)基于散列表的查找算法
  散列表(Hash Table)是一种常见的数据结构,通过使用哈希函数将关键字映射到一个固定大小的数组中。这样可以通过计算关键字的哈希值,将其直接映射到数组的索引,实现快速的数据查找。
Qomolangma
2024/07/30
1840
【数据结构实验】查找(一)基于散列表的查找算法
数据结构小记【Python/C++版】——散列表篇
散列表通常使用顺序表来存储集合元素,集合元素以一种很分散的分布方式存储在顺序表中。
Coder-ZZ
2023/02/23
6410
数据结构小记【Python/C++版】——散列表篇
Java数据结构与算法解析(十二)——散列表
散列表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。
老马的编程之旅
2022/06/22
1.3K0
Java数据结构与算法解析(十二)——散列表
散列表(三):冲突处理的方法之开地址法(线性探测再散列的实现)
s1mba
2017/12/28
3.8K0
散列表(三):冲突处理的方法之开地址法(线性探测再散列的实现)
散列表
http://blog.csdn.net/yyxaf/article/details/7527878 搜索关键词:散列函数、散列表、哈希函数、哈希表、Hash函数、Hash表 散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O(1)。 散列表的概念 1、散列表 设所有可能出现的关键字集合记为U(简称全集)。实际发生(即实际存储)的关键字集合记为K(|K|比|U|小得多)。 散列方
用户1624346
2018/04/17
1K0
【数据结构实验】树(一)构建二叉查找树(BST)
  二叉查找树(Binary Search Tree,BST)是一种常用的数据结构,它在计算机科学和信息处理中有着广泛的应用。BST的特点是对于树中的每个节点,其左子树的所有节点值小于当前节点的值,而右子树的所有节点值大于当前节点的值。
Qomolangma
2024/07/30
1410
【数据结构实验】树(一)构建二叉查找树(BST)
散列表
是根据键 (Key) 而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
周三不加班
2019/09/03
7300
散列表
数据结构基础详解:哈希表【理论计算篇】开放地址法_线性探测法_拉链法详解
散列表,又称哈希表。是一种数据结构,特点是:数据元素的关键字与其存储地址直接相关。
小徐在进步
2024/10/08
6080
数据结构基础详解:哈希表【理论计算篇】开放地址法_线性探测法_拉链法详解
算法原理系列:散列表
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/70053254
用户1147447
2019/05/26
5130
【自考】数据结构第六章查找,期末不挂科指南,第10篇
查找表 是由同一类型的数据元素 构成的集合,它是一种以查找为“核心”,同时包括其他运算的非常灵活的数据结构。
梦想橡皮擦
2020/01/13
6650
【自考】数据结构第六章查找,期末不挂科指南,第10篇
JS数据结构之哈希表(散列表)
散列表(或哈希表,HashMap)是一种最优时间复杂度可以达到O(1)的数据结构,其原理是根据指定键的hash值来确定它在表中的大致位置,之后再去寻找。在介绍这个数据结构如何实现之前,先让我们看看散列函数的相关知识。
kifuan
2022/10/24
1.3K0
JS数据结构之哈希表(散列表)
【经验分享】数据结构——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
的哈希表,插入一组关键字 [10, 22, 31, 4, 15, 28],并使用线性探测解决冲突。
命运之光
2024/08/17
2760
PHP数据结构-散列表查找
上篇文章的查找是不是有意犹未尽的感觉呢?因为我们是真真正正地接触到了时间复杂度的优化。从线性查找的 O(n) 直接优化到了折半查找的 O(logN) ,绝对是一个质的飞跃。但是,我们的折半查找最核心的一个要求是什么呢?那就是必须是原始数据是要有序的。这可是个麻烦事啊,毕竟如果数据量很庞大的话,排序又会变得很麻烦。不过别着急,今天我们要学习的散列表查找又是另一种形式的查找,它能做到什么程度呢?
硬核项目经理
2021/06/10
5700
数据结构:查找
衡量标准:查找过程中对关键字的平均比较次数——平均查找长度ASL。设查找到第i个元素的概率为p,比较次数为c,则查找成功的ASL_{succ}=\sum^n_{i=1}p_ic_i
ttony0
2022/12/26
1K0
数据结构:查找
由散列表到BitMap的概念与应用(一)
散列表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触散列表时,它的优点多得让人难以置信。不论散列表中有多少数据,插入和删除只需要接近常量的时间即O(1)的时间级。实际上,这只需要几条机器指令。
aoho求索
2018/12/05
2.2K0
数据结构-散列表(上)
Word 这种文本编辑器你平时应该经常用吧,那你有没有留意过它的拼写检查功能呢?一旦我们在 Word 里输入一个错误的英文单词,它就会用标红的方式提示“拼写错误”。Word 的这个单词拼写检查功能,虽然很小但却非常实用。你有没有想过,这个功能是如何实现的呢?
acc8226
2022/05/17
9380
数据结构-散列表(上)
散列表(上)——开放定址法
散列表,又称哈希表,hash表。散列表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。这个源于散列表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。
AI那点小事
2020/04/20
1.4K0
推荐阅读
相关推荐
【数据结构与算法】哈希表实现:闭散列 && 开散列
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验