散列表,又名哈希表、Hash表。这是一个神奇的数据结构,它的复杂度是常数级别,由于我非常喜欢这个数据结构,在此简单介绍一下。

(没有学过Hash表的同学,我推荐一个教程:http://www.cnblogs.com/jiewei915/archive/2010/08/09/1796042.html

让我们回忆一下之前学过的数据结构,列个表,与Hash表做个比较(表中c表示常数):

 

插入时间

删除时间

查找时间

编程复杂度

信息剖析度

无序数组

1

N

N

有序数组

N

N

logN

无序链表

1

N

N

☆☆☆

平衡树

logN

logN

logN

☆☆☆☆☆

Hash表

常数

常数

常数

☆☆

☆☆☆

这表中前四列很好理解(平衡树之所以给五颗星,是因为我假设大家树写得好看,如果代码不漂亮,恐怕多少颗星都有可能,甚至你写不对就是∞颗星……),而第五列新手可能比较陌生,这里解释一下。

例如你对N个元素写个无序结构,啥都不用想,存进去就好了;写个有序结构,也仅仅需要想想两个元素之间如何比大小即可(例如3<5、"ab"<"aca"),我们对这N个数本身的信息剖析得非常少。因此,像这种信息剖析度低的数据结构,你基本啥都不用想,拿来就可以写代码了。

但Hash表却并不是如此,我们需要对数据进行更深入的分析(例如数是不是整数、字符串有多长),否则你的Hash表就可能出错(例如有负数时,你直接去模)、复杂度退化为线性等等(例如很多数都是一个大素数K的整数倍,而你却正好选择了让每个数模K去Hash)。因此,养成分析数据的习惯,才能知道自己在具体题目中是否可以使用散列表、如何使用散列表。

好了,就介绍这么多。最后,既然我说Hash表的编程复杂度只有两颗星,那么下面给出我的代码(Hash表有很多种,我最常用的就是大素数Hash+链表存重,代码简单而且适用性强):

题目:sjtuoj 1224

清爽版:Hash表的代码,清爽版对于新手来说很容易搞乱,因此仅给出类版。

类版:

1、裸Hash表(本题内存足够大,所以能过)

2、模大素数+拉链(对于本题来说,比较NC的做法,感谢HQ同学提示可以直接采用裸Hash表AC)

 #include <cstring>

 // 裸Hash 类版
class Hash
{
int H[];
int k(int num) { return num+; }
int num(int k) { return k-; }
public:
Hash() { memset(H,,sizeof(H)); } // 此代码中,由于这个Hash表比较大,会定义在全局,故无需初始化
void in(int num) { ++H[k(num)]; }
int count(int num) { return H[k(num)]; }
}; // 模大素数+拉链表 类版
class Hash
{
struct hash
{
int num;
hash *next;
}*H[],New[];
int L;
hash* make(int num) { New[L].num=num; return New+L++; }
int k(int num) { return (num+)%; }
public:
Hash():L() { memset(H,,sizeof(H)); } // 此代码中,由于这个Hash表比较大,会定义在全局,故无需初始化
void in(int num)
{
hash *u=make(num);
u->next=H[k(num)]; H[k(num)]=u;
}
int count(int num)
{
int s=;
for(hash *u=H[k(num)];u;u=u->next)
if(u->num==num) ++s;
return s;
}
};

《数据结构》C++代码 散列表的更多相关文章

  1. 用js来实现那些数据结构12(散列表)

    上一篇写了如何实现简单的Map结构,因为东西太少了不让上首页.好吧... 这一篇文章说一下散列表hashMap的实现.那么为什么要使用hashMap?hashMap又有什么优势呢?hashMap是如何 ...

  2. JavaScript数据结构——字典和散列表的实现

    在前一篇文章中,我们介绍了如何在JavaScript中实现集合.字典和集合的主要区别就在于,集合中数据是以[值,值]的形式保存的,我们只关心值本身:而在字典和散列表中数据是以[键,值]的形式保存的,键 ...

  3. 数据结构--hashtable(散列表)

    散列 散列又叫hash.是通过关键字把数据映射到指定位置的一种数据结构.理想的散列表,是一个包含关键字的固定大小的数组 哈希表存储的是键值对,其查找的时间复杂度与元素数量多少无关,哈希表在查找元素时是 ...

  4. 散列表的实现 -- 数据结构与算法的javascript描述 第八章

    散列表(哈希表 散列是一种常用的数据存储技术,散列后的数据可以快速地插入或取用. 散列表需要一个散列值(key)来存储指定数据,取数据也是依靠此. 散列值可以依靠计算数据的 ASCII码来获得,但是这 ...

  5. 深入浅出数据结构C语言版(14)——散列表

    我们知道,由于二叉树的特性(完美情况下每次比较可以排除一半数据),对其进行查找算是比较快的了,时间复杂度为O(logN).但是,是否存在支持时间复杂度为常数级别的查找的数据结构呢?答案是存在,那就是散 ...

  6. Java数据结构与算法解析(十二)——散列表

    散列表概述 散列表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 散列表的思路很简单,如果所有的键都是整数,那么就可以使用一个简单 ...

  7. 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))

    本文根据<大话数据结构>一书,实现了Java版的一个简单的散列表(哈希表). 基本概念 对关键字key,将其值存放在f(key)的存储位置上.由此,在查找时不需比较,只需计算出f(key) ...

  8. 为什么我要放弃javaScript数据结构与算法(第七章)—— 字典和散列表

    本章学习使用字典和散列表来存储唯一值(不重复的值)的数据结构. 集合.字典和散列表可以存储不重复的值.在集合中,我们感兴趣的是每个值本身,并把它作为主要元素.而字典和散列表中都是用 [键,值]的形式来 ...

  9. Python与数据结构[4] -> 散列表[0] -> 散列表与散列函数的 Python 实现

    散列表 / Hash Table 散列表与散列函数 散列表是一种将关键字映射到特定数组位置的一种数据结构,而将关键字映射到0至TableSize-1过程的函数,即为散列函数. Hash Table: ...

随机推荐

  1. 解决使用phpmyadmin导出导入数据库时提示的“超出长度”、“超时”问题

    IIS请求筛选模块被配置为拒绝超过请求内容长度的请求 1. 修改IIS的applicationhost.config a.文件位置: %windir%/system32/inetsrv/config/ ...

  2. IOS OAuth授权分析

    一.黑马微博 ---> 用户的微博数据1.成为新浪的开发者(加入新浪微博的开发阵营)* 注册一个微博帐号,登录http://open.weibo.com帐号:643055866@qq.com密码 ...

  3. Uva 11582 巨大的斐波那契数 模运算

    题目链接:https://vjudge.net/contest/156903#problem/A 题意:计算 f(a^b)%n 分析: 1.斐波那契数列是 f(i+2) = f(i+1) + f(i) ...

  4. 关于 npm install 命令

    使用 `npm install` 命令安装模块时 ,有以下几种形式: 安装模块到项目 node_modules 目录下,不会将模块依赖写入 dependencies 或 devDependencies ...

  5. link链接外部样式表

    一个完整的link标签: <link href="[css adress]" rel="stylesheet" type="text/css&q ...

  6. Centos7下MySql5.7安装及配置

    安装MySql 软件包: mysql-community-libs-5.7.22-1.el7.x86_64.rpm mysql-community-common-5.7.22-1.el7.x86_64 ...

  7. poj_1995_Raising Modulo Numbers

    Description People are different. Some secretly read magazines full of interesting girls' pictures, ...

  8. 基于centos7实现的nfs

    NFS NFS(Network FileSystem,网络文件系统),最早由Sun公司所发展出来的,主要是通过网络让不同的主机.不同的操作系统,可以彼此分享个别档案,因此我们也可以简单把NFS看成是一 ...

  9. Hbase学习指南

    本篇Hbase组件基于CDH5进行安装,安装过程:https://www.cnblogs.com/dmjx/p/10037066.html Hbase简介 HBase是一个高可靠.高性能.面向列.可伸 ...

  10. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...