近期刷Leetcode发现凡是找字符串中反复字符或者数组中找反复数据的时候就不知道从何下手了。

  所以决定学习一下哈希表解题。哈希表的原理主要是解决分类问题,hash表是介于链表和二叉树之间的一种中间结构。

链表使用十分方便,可是数据查找十分麻烦;二叉树中的数据严格有序,可是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同一时候不占用太多的内容空间。使用也十分方便。

  定义hash数据结构,我採用的解决冲突的方法是分离链接法。

  

  1. //单链表结构
  2. typedef struct listnode* position;
  3. typedef struct listnode* list;
  4. struct listnode{
  5. ElementType data;
  6. position next;
  7. };
  8. //hash表结构
  9. typedef struct hashtbl* hashtable;
  10. struct hashtbl {
  11. int tablesize;
  12. list *thelists;
  13. };

哈希散列函数index = key%tablesize

  1. index HashFunc(const ElementType key,int tablesize)
  2. {
  3. //unsigned int hashval = 0;
  4. //while(*key != '\0')
  5. //hashval = (hashval << 5) + *key++;
  6. //return hashval % tablesize;
  7. return key % tablesize;
  8. }

创建hash表,并初始化

  1. hashtable InitializeHashTable(int tablesize)
  2. {
  3. hashtable H;
  4. H = (hashtable)malloc(sizeof(hashtable));
  5. if(NULL == H) return NULL;
  6. H->tablesize = tablesize;
  7. H->thelists = (list*)malloc(sizeof(list) * H->tablesize);
  8. int i = 0;
  9. for(i=0;i<H->tablesize;i++)//链表是有表头的单链表
  10. {
  11. H->thelists[i] = (list)malloc(sizeof(struct listnode));
  12. H->thelists[i]->next = NULL;
  13. }
  14. return H;
  15. }

删除hash表

  1. void DeleteHashTable(hashtable H)
  2. {
  3. position P,tem;
  4. int i = 0;
  5. for(i=0;i<H->tablesize;i++)
  6. {
  7. P = H->thelists[i]->next;
  8. while(P != NULL)
  9. {
  10. tem = P;
  11. free(tem);
  12. P=P->next;
  13. }
  14. }
  15. free(H->thelists);
  16. free(H);
  17. }

往hash表中插入新元素

  1. position Find(ElementType key,hashtable H)
  2. {
  3. position P;
  4. list L;
  5. L = H->thelists[ HashFunc( key, H->tablesize) ];
  6. P = L->next;
  7. while(P != NULL && P->data != key)
  8. P = P->next;
  9. return P;
  10. }
  11. void Insert(ElementType key,hashtable H)
  12. {
  13. position pos,newnode;
  14. list L;
  15. pos = Find(key,H);
  16. if(pos == NULL)
  17. {
  18. newnode = (position)malloc(sizeof(position));
  19. L = H->thelists[ HashFunc( key, H->tablesize) ];
  20. newnode->data = key;
  21. newnode->next = L->next;
  22. L->next = newnode;
  23. }
  24. }

打印hash表中全部的元素

  1. void PrintHashTable(hashtable H)
  2. {
  3. position P;
  4. int i = 0;
  5. for(i=0;i<H->tablesize;i++)
  6. {
  7. P = H->thelists[i]->next;
  8. printf("H->thelists[%d] = ",i);
  9. while(P != NULL)
  10. {
  11. printf(" %d",P->data);
  12. P=P->next;
  13. }
  14. printf("\n");
  15. }
  16. }

測试main函数

  1. int main()
  2. {
  3. int num[10] = {3,45,5,64,7,9,8,3,75,75};
  4. hashtable H;
  5. H = InitializeHashTable(10);
  6. int i = 0;
  7. for(i=0;i<10;i++)
  8. {
  9. Insert(num[i],H);
  10. }
  11. PrintHashTable(H);
  12. DeleteHashTable(H);
  13. }

头文件

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. typedef int ElementType;
  5. typedef unsigned int index;

測试结果。能够看到图片中散列后在hash表中一样位置的都保存下来了,形成一个链表如数据75 5 45;可是同样的数据仅仅保存一份,比方3和3,75和75



哈希表(散列)HashTable实现的更多相关文章

  1. JavaScript 哈希表(散列表)应用

    查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...

  2. JavaScript 哈希表(散列表)实现和应用

    查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...

  3. js 实现数据结构 -- 散列(HashTable)

    原文: 在Javascript 中学习数据结构与算法. 概念: HashTable 类, 也叫 HashMap 类,是 Dictionary 类的一种散列表实现方式. 散列算法的作用是尽可能快地在数据 ...

  4. [转]net中哈希表的使用 Hashtable

    本文转自:http://www.cnblogs.com/gsk99/archive/2011/08/28/2155988.html 以下是PetShop中DBHelper中的使用过程: //创建哈希表 ...

  5. Java 哈希表(google 公司的上机题)

    1 哈希表(散列)-Google 上机题 1) 看一个实际需求,google 公司的一个上机题: 2) 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该 ...

  6. 哈希表 HashTable(又名散列表)

    简介 其实通过标题上哈希表的英文名HashTable,我们就可以看出这是一个组合的数据结构Hash+Table. Hash是什么?它是一个函数,作用可以通过一个公式来表示: index = HashF ...

  7. C# 哈希表HashTable的简单使用

    本人C#程序菜鸟级别的存在,写博客一方面是为了知识的共享,另一方面也是为了督促自己:大神,可以忽略这篇文文的.废话到此...... 哈希表是可以直接进行访问的数据结构,在形式上是类似字典的.不同的是, ...

  8. java资料——哈希表(散列表)(转)

    哈希表       散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度. ...

  9. [PHP] PHP数组的实现哈希表(HashTable)结构

    PHP中使用最为频繁的数据类型非字符串和数组莫属,使用哈希表实现的PHP数组.1.数据结构:保存哈希表容器,保存数据的容器2.哈希函数实现:需要尽可能的将不同的key映射到不同的槽(bucket)中, ...

  10. 查找->动态查找表->哈希表

    文字描述 哈希表定义 在前面讨论的各种查找算法中,都是建立在“比较”的基础上.记录的关键字和记录在结构中的相对位置不存在确定的关系,查找的效率依赖于查找过程中所进行的比较次数.而理想的情况是希望不经过 ...

随机推荐

  1. ⑿bootstrap组件 缩略图 警告框 进度条 基础案例

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...

  2. 使用SuperSocket打造逾10万长连接的Socket服务

    SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作 ...

  3. Layui框架+PHP打造个人简易版网盘系统

    网盘系统   大家应该都会注册过致命的一些网盘~如百度云.百科介绍:网盘,又称网络U盘.网络硬盘,是由互联网公司推出的在线存储服务,服务器机房为用户划分一定的磁盘空间,为用户免费或收费提供文件的存储. ...

  4. 一、VueJs 填坑日记之基础概念知识解释

    概述在最开始听说vuejs这个词是在2016年,当时天真的认为自己是个后端开发工程师不需要学习太多的前端知识,不过紧接着在2017年在公司就用到了vuejs.对于初学者(尤其是干后端的初学者)来说,刚 ...

  5. RabbitMQ之Topics(多规则路由)

    Exchange中基于direct类型无法基于多种规则进行路由. 例如分析syslog日志,不仅需要基于severity(info/warning/critical/error)进行路由,还需要基于a ...

  6. Ajax跨域 CROS处理

    Ajax跨域方法有多种 这里介绍CROS跨域的实际案例 场景:A域名 请求 B域名: 暂且 A为客户端 B为服务端: 请求的服务端必须自己能控制 或者服务器端头部已经添加 Access-Control ...

  7. 在VirtualBox 虚拟机中安装CentOS7 64位实验基础系统

    1.将CentOS-7-x86_64-Minimal ISO加载入虚拟机,选择安装CentOS 7 2.启动欢迎画面,保持默认,选择 继续 3.安装参数设置 3-1.设置时区以便同步时间,将时区更改为 ...

  8. matlab之“audioread”函数帮助文档翻译

    课 程 设 计 (1)  原文 audioread Read audio file Syntax [y,Fs] = audioread(filename) [y,Fs] = audioread(fil ...

  9. SpringBoot错误求解决

    .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | ...

  10. 字节、十六进制字符串相互转换(asc2hex、hex2asc)

    //================================================================== /** 功能: 将16进制数组转换成asc字符数组(短转长) ...