散列/散列函数「建议收藏」

散列/散列函数「建议收藏」散列是一种用于以常数平均时间执行插入、删除和查找的技术。每个关键字被映射到从0-TableSize-1这个范围中的某个数,并且被放到适当的单元中。这种映射就叫做散列函数我认为,先用散列函数将我们所要进行操作的集合整合成散列表,是对之后的操作的一种便利。放到实际中去,我们要进行操作的集合不仅仅只是数字,例如图书馆中的书籍分类等等。而且就算是一组不连续差距较大的数字,要执行后序的插入删除和查找都是很不方

大家好,又见面了,我是你们的朋友全栈君。

散列是一种用于以常数平均时间执行插入、删除和查找的技术。

每个关键字被映射到从0-TableSize-1这个范围中的某个数,并且被放到适当的单元中。这种映射就叫做散列函数

我认为,先用散列函数将我们所要进行操作的集合整合成散列表,是对之后的操作的一种便利。放到实际中去,我们要进行操作的集合不仅仅只是数字,例如图书馆中的书籍分类等等。而且就算是一组不连续差距较大的数字,要执行后序的插入删除和查找都是很不方便的。我们可以通过某种规定,将每个关键字放到合适的为止上去,编写散列函数。但是难免会遇到两个关键词被单列到同一个值的情况,(称为冲突),如何解决冲突是一个很关键的问题,之后另开博。

对于一般的数字,可以通过模运算

一个简单的代码实现如下(不涉及冲突)

#include<stdio.h>

int main()
{
    //自定义数组,存放初始的数字集合 
    int a[9] = {
  
  22,23,25,21,20,27,24,28,26};
    int b[9];
    int i;
    for(i = 0; i < 9; i++)
    {
        b[a[i]%10] = a[i];   //通过模10运算,将关键字散列合适的位置 
    }
    for(i = 0; i < 9; i++)   //输出散列表 
    printf("%d ", b[i]);
    return 0;
} 

输出结果如图

这里写图片描述

如果关键字是字符串,另一个很容易想到的办法是将字符中的ASCII码值加起来
伪代码如下:

Index
Hash(const char *key, int TableSize)
{
    unsigned int HashVal = 0;
    while(*key != '\0')   //循环将字符中的ASCII值加起来
        HashVal += *key++;
    return HashVal % TableSize;  //对TableSize取余并返回其值
}

虽然这种方法简单又很容易得到答案,但是对于很大的表,此函数并不会很到的分配关键字。设所有关键字最多8个字符长,由于char类型的值最多是127,因此这个散列函数之恩那个取值在0到27*8之间,若TableSize超过了1w,显然这并不是一种均匀的分配。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146415.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java线程(五):Timer和TimerTask

    Timer和TimerTask可以做为实现线程的第三种方式,前两中方式分别是继承自Thread类和实现Runnable接口。Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。…

    2022年4月7日
  • 二代身份证号码验证器[超简单]

    二代身份证号码验证器[超简单]一代身份证号码是十五位,2013年1月1日开始,咱们中国全面停止使用一代身份证了。二代身份证号码:1-6位:表示行政区划的代码。 1、2位,所在省(直辖市,自治区)代码; 3、4位,所在地级市(自治州)代码; 5、6位,所在区(县,自治县,县级市)的代码; 7-14位:表示出生年、月、日 15-16位:所在地派出所代码 17位:性别。奇数(1、3、5、7、9)男性,偶数(2、4、6、8、0)女性 18位:校验位,存在十一个值:0,1,2,3,4,5,6,7,8,9,X,..

    2022年6月27日
  • 关于ActionContext.getContext()的使用方法心得

    关于ActionContext.getContext()的使用方法心得

    2021年12月7日
  • pycharm的虚拟环境

    pycharm的虚拟环境选中file==》closeproject退出项目进入下方的情况现在我们在桌面新创建一个文件test.py可以看到可以执行test.py右键选中test.py,选择pycharm的方式打开test.py,会发现无法调试,出现NoPythonInterpreter的错误,为什么命令行可以执行test.py,pycharm执行test.py文件就不可以了呢?这是为什么呢?我们新建一个项目来查看原因第一个location为你项目的路径,可以点击右边的文件夹进行选择。第二个locatio.

    2022年8月25日
  • 学习笔记——pycharm修改编码方式

    学习笔记——pycharm修改编码方式pycharm编辑器修改编码方式,防止乱码。工具/原料 pycharm编辑器 方法 打开编辑器找到File->settings,我们将在这里修改编码方式。 点击settings会弹出设置界面我们将在设置界面设置我们的编码方式。 找到settings->Editor->FileEncondings,FileEncondings就是我们要修改编码方式的地方。我们点击会出现对应的修改窗口。 点击F

    2022年8月25日
  • vscode 前端常用插件推荐「建议收藏」

    1.vscode简介vscode是微软开发的的一款代码编辑器,就如官网上说的一样,vscode重新定义(redefined)了代码编辑器。 当前市面上常用的轻型代码编辑器主要是:sublime,notepad++,editplus,atom这几种。 比起notepad++、editplus,vscode集成了许多IDE才具有的功能,比起它们更像一个代码编辑器; 比起sublime,…

    2022年4月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号