数据结构之散列表查找-程序员宅基地

技术标签: 数据结构与算法  

数据结构之--散列表查找

定义:通过某个函数f,使得

    ​    ​    ​存储位置=f(关键字)

    ​    ​    ​这样我们可以通过查找关键字不需要比较久可以获得需要记录的存储位置。这就是一种新的存储技术--散列技术。

    ​    ​    ​散列技术在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。

    ​    ​    ​这里我们把这种对应关系f称为散列函数,又称为哈希函数。按照这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或者哈希表。那么关键字对应的记录存储位置我们称为散列地址。

图解

    ​    ​    ​    ​    ​    ​

#include "stdio.h"    

#include "stdlib.h"   

#include "io.h"  

#include "math.h"  

#include "time.h"

#define SUCCESS 1

#define UNSUCCESS 0

#define OK 1

#define HASHSIZE 12

#define NULLKEY -32768

#define MAXSIZE 100 /* 存储空间初始分配量 */ 

typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ 

typedef struct{

  int *elem;/* 数据元素存储基址,动态分配数组 */

  int count;/*  当前数据元素个数 */

}HashTable;

int m=0; /* 散列表表长,全局变量 */

 

/* 插入关键字进散列表 */

Status InitHashTable(HashTable *H){

  int i;

  m=HASHSIZE;

  H->count=m;

  H->elem=(int *)malloc(m*sizeof(int));

  for(i=0;i<m;i++) //给每一个链表元素

    H->elem[i]=NULLKEY;

  return OK;

}

/* 散列函数 */

int Hash(int key){

  return key%m; /* 除留余数法 */

}

/*将传过来的元素经过散列值转换之后插入到链表H中*/

void InsertHash(HashTable *H,int key){

  int addr=Hash(key); //将传过来的值经过散列值转换

  while(H->elem[addr]!=NULLKEY)//循环从查找插入,插入在没有值的地方

  addr=(addr+1)%m;

  H->elem[addr]=key;

}

/* 散列表查找关键字 */

Status SearchHash(HashTable H,int key,int *addr){

  *addr=Hash(key);

  while(H.elem[*addr]!=key){/* 如果不为空,则冲突 */

    *addr=(*addr+1)%m;/* 开放定址法的线性探测 */

    if(H.elem[*addr]==NULLKEY || *addr==Hash(key)){/* 如果循环回到原点 */

      return UNSUCCESS;/* 则说明关键字不存在 */

    }

  }

  return SUCCESS;

}

 

void main(){

  int arr[HASHSIZE]={12,67,56,16,25,37,22,29,15,47,48,34};

  int i,p,key,result;

  HashTable H;

  key=39;

  InitHashTable(&H);

  for(i=0;i<m;i++)

    InsertHash(&H,arr[i]);

  result=SearchHash(H,key,&p);

  if (result)

    printf("查找 %d 的地址为:%d \n",key,p);

  else

    printf("查找 %d 失败。\n",key);

  for(i=0;i<m;i++){

    key=arr[i];

    SearchHash(H,key,&p);

    printf("查找 %d 的地址为:%d \n",key,p);

  }

}

 

运行结果:

 

转载于:https://www.cnblogs.com/zhengjunfei/p/4720039.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/alzqgx343175/article/details/102321483

智能推荐

Linux系统编程(一):基本概念_posix unix和linux-程序员宅基地

文章浏览阅读378次。Linux系统编程(一):基本概念_posix unix和linux

Python小游戏开发-贪食蛇捕蛙-程序员宅基地

文章浏览阅读284次,点赞5次,收藏6次。每个程序员都有一个游戏梦,都想开发一款让别人爱不释手的游戏。游戏开发引擎很多像Unity 3D,cocos2d,白鹭(Egret),LayaBox,threeJs等等。一个偶然的机会,看到gitee上举办趣味魔改贪吃蛇游戏,出于程序员的自信心的驱使,加上爱折腾的心思便果断报名参加了。今天和大家一起看看Python小游戏的开发。Python有一个游戏开发的库pygame,可以非常简单方便地开发游戏。先看一下游戏运行的效果:游戏有几个角色1. 贪吃蛇(Snake)2. 青蛙(Food)

怎么在unity3D工程中导入Newtonsoft.Json_unity newtonsoft.json-程序员宅基地

文章浏览阅读3.7k次。怎么在unity3D工程中导入Newtonsoft.Json_unity newtonsoft.json

大文件切片上传,断点续传_分片上传文件, waiting for server response 耗时太长-程序员宅基地

文章浏览阅读103次。分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,文件切片和核心是使用 Blob 对象的 slice 方法blob.slice(startByte, endByte),上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。文件妙传,秒传指的是文件在传输之前计算其内容的散列值,也就是 Hash 值,将该值传到后台,如果后台存在 Hash 值一致的文件,认为该文件上传完成。3、由于各种网络原因上传失败,且失败之后需要从头开始。_分片上传文件, waiting for server response 耗时太长

博图sodt定时器的用法_西门子plc定时器指令 西门子S7-1200系列PLC定时器指令-程序员宅基地

文章浏览阅读4.9k次。定时器指令是在PLC程序设计中非常常见的一种指令,S7-1200系列PLC的定时器的指令格式及使用方式都不同于S7-200系列PLC。S7-1200系列PLC的采用的是IEC标准的定时器指令,用户程序中可以使用的定时器数仅受CPU存储器容量限制,每个定时器均使用16个字节的 IEC_TIMER 数据类型的DB结构来存储功能框或线圈指令顶部指定的定时器数据,如下图所示。S7-1200系列PLC的定时..._sodt

hibernate实体属性为布尔类型时命名应注意的地方-程序员宅基地

文章浏览阅读237次。一个对象中的属性有布尔类型时,命名的时候尽量不要把前缀定为is,因为在使用HQL查询的时候,属性必须去掉is前缀,然后小写首字母才能查询出结果,否则查询不到任何数据;例如,有一个User对象,里面有一个标识这个用户是否激活的属性,然后将其命名为isActivated,在查询的时候,根据HQL的规则,使用 user.isActivated = true去查询,将得到错误的提示:isActivat..._hibernate不能包含is

随便推点

java开发C语言编译器:JVM 的基本操作指令介绍及其程序运行原理_jvm和c语言-程序员宅基地

文章浏览阅读1.2k次。本文介绍了java虚拟机所能运行的基础指令,同时讲解了虚拟机是如何基于堆栈和队列配合相关基础指令,运行字节码程序的。最后我们给出了一段C语言代码,并详细讲解了我们的编译器如何把代码编译成能在java虚拟机上执行的java汇编语言_jvm和c语言

图像算法:Difference of Gaussian(DOG) 高斯函数差分-程序员宅基地

文章浏览阅读2.5w次,点赞17次,收藏103次。概念Difference of Gaussian(DOG)是高斯函数的差分。它是可以通过将图像与高斯函数进行卷积得到一幅图像的低通滤波结果,即去噪过程,这里的Gaussian和高斯低通滤波器的高斯一样,是一个函数,即为正态分布函数。同时,它对高斯拉普拉斯LoG的近似,在某一尺度上的特征检测可以通过对两个相邻高斯尺度空间的图像相减,得到DoG的响应值图像。基本理论首先,高斯函数..._difference of gaussian

数据库学习笔记第一弹——MySQL8.0和MySQL5.7的下载、安装与配置(图文详解步骤2022)-程序员宅基地

文章浏览阅读1k次,点赞10次,收藏9次。数据库学习笔记第一弹——MySQL8.0和MySQL5.7的下载、安装与配置

C语言枚举类 口袋中有红、黄、蓝、白、黑5种颜色的球若干个_利用枚举类型编写程序:口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋-程序员宅基地

文章浏览阅读3.2k次。口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中先后取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况#include<stdio.h>int main(){ enum Color {red, yellow, blue, white, black};//枚举类声明,分别对应0,1,2,3,4 enum Color i, j, k, pri..._利用枚举类型编写程序:口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋

php 心跳检测,Swoole 实例四(心跳检测)-程序员宅基地

文章浏览阅读1k次。服务器端 server.php

windows学习历程-IPC之互斥对象_windows ipc 互斥锁-程序员宅基地

文章浏览阅读458次。利用互斥对象实现线程的互斥对于互斥对象的操作包括:(1)创建互斥对象(CreateMutex)CreateMutex函数功能: 创建互斥量来确保一个线程独占对一个资源的访问。互斥量对象包含一个使用计数、线程ID以及一个递归计数。线程ID用来标识当前占用这个互斥量的是系统中的那个线程,递归计数表示这个线程占用该互斥量的次数。互斥量可以确保正在访问内存块中的任何线程会独占对_windows ipc 互斥锁

推荐文章

热门文章

相关标签