说明

Hash table翻译过来就是Hash表,是一种提供了类似于关联数组的数据结构,可以通过key执行搜索、插入和删除操作。Hash表由一些列桶(buckets)组成,而每一个bucket都是由key-value的形式组成。存储时都是以key-value存储的,因为当要定位一个value时,需要把key传给一个散列函数(hash函数),这个函数返回一个数(索引),代表查找的value位于哪一个bucket中。同理,当我们要从所有的buckets中取回key-value时,一样是先把key传给散列函数,再由返回的索引取到value

在数组中,通过下标(索引)获取值时,复杂度为O(1),所以Hash表上查找和存储数据会很快。

我们这个简易的Hash表会使用字符串作为keyvalue,这种方法也适用于任意其他类型的keyvalue。本教程只支持ASCII中的字符串,unicode 类型比较复杂已经超出了本教程的范围。

本教程中的Hash表支持的API

本教程中,关联数组是一个未排序过的key-value集合,不允许重复的key,支持一下操作:

  • search(a, k): 如果关联数组a中存在k对应的v,就返回v,不存在就返回NULL
  • insert(a, k, v): 向关联数组a中插入k-v
  • delete(a, k): 根据k删除一条记录,如果k不存在则什么也不做

本教程代码目录结构

本教程中所有的代码都会按如下目录结构存放:

.
├── build
└── src
├── hash_table.c
├── hash_table.h
├── prime.c
└── prime.h

src 目录存放我们的源代码,build 目录存放编译过的二进制文件。

教程中的一些名词解释

本文中所涉及到的一些名词解释:

  • 关联数组:实现了上面的API的一种抽象数据结构,也称映射(Map)符号表(symbol table)字典(dictionary)

  • Hash表:使用了散列函数实现关联数组的一种数据结构,也称为哈希映射,映射,哈希或字典

关联数组可以用许多不同的底层数据结构实现。可以通过简单地将值存储在数组中并在搜索时迭代数组来实现(非高性能的)。关联数组和散列表经常被混淆,因为关联数组经常被实现为散列表。

下一章:hash表结构


原文地址:https://github.com/jamesroutley/write-a-hash-table/tree/master/01-introduction

[译]C语言实现一个简易的Hash table(1)的更多相关文章

  1. [译]C语言实现一个简易的Hash table(4)

    上一章我们解释了Hash table中最重要的hash函数,并用伪代码和C语言实现了一个我们自己的hash函数,hash函数中碰撞是无法避免的,当发生碰撞时我们改如何有效的处理呢?这章我们就来讲解下. ...

  2. [译]C语言实现一个简易的Hash table(3)

    上一章,我们讲了hash表的数据结构,并简单实现了hash表的初始化与删除操作,这一章我们会讲解Hash函数和实现算法,并手动实现一个Hash函数. Hash函数 本教程中我们实现的Hash函数将会实 ...

  3. [译]C语言实现一个简易的Hash table(2)

    上一章,简单介绍了Hash Table,并提出了本教程中要实现的几个Hash Table的方法,有search(a, k).insert(a, k, v)和delete(a, k),本章将介绍Hash ...

  4. [译]C语言实现一个简易的Hash table(5)

    上一章中,我们使用了双重Hash的技术来处理碰撞,并用了C语言实现,贲张我们将实现Hash表中的插入.搜索和删除接口. 实现接口 我们的hash函数将会实现如下的接口: // hash_table.h ...

  5. [译]C语言实现一个简易的Hash table(7)

    上一章我们讲了如何根据需要动态设置hash表的大小,在第四章中,我们使用了双重哈希来解决hash表的碰撞,其实解决方法有很多,这一章我们来介绍下其他方法. 本章将介绍两种解决hash表碰撞的方法: 拉 ...

  6. [译]C语言实现一个简易的Hash table(6)

    上一章中,我们实现了Hash表中的插入.搜索和删除接口,我们在初始化hash表时固定了大小为53,为了方便扩展,本章将介绍如何修改hash表的大小. 设置Hash表大小 现在,我们的hash表是固定大 ...

  7. 用Java语言编写一个简易画板

    讲了三篇概博客的概念,今天,我们来一点实际的东西.我们来探讨一下如何用Java语言,编写一块简易的画图板. 一.需求分析 无论我们使用什么语言,去编写一个什么样的项目,我们的第一步,总是去分析这个项目 ...

  8. 用java语言写一个简易版本的登录页面,包含用户注册、用户登录、用户注销、修改密码等功能

    package com.Summer_0421.cn; import java.util.Arrays; import java.util.Scanner; /** * @author Summer ...

  9. PHP内核探索之变量(3)- hash table

    在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量 ...

随机推荐

  1. Java基础之PDF文件的合并

    1.首先下载一个jar包:pdfbox-app-1.7.1.jar 2.代码如下: package com; import java.io.File; import java.io.IOExcepti ...

  2. python数据处理与机器学习

    提纲 numpy: #genformtxt import numpy as np #genformtxtdata=np.genfromtxt("genfromtxtdata") # ...

  3. CSS3 transition介绍

    transition从效果上看是一种平滑过渡的动画,本质上是在线性时间内将属性从开始值过渡到结束值.例如获得焦点,点击鼠标等动作导致CSS属性值的变化是瞬间完成的,感觉有点生硬.用transition ...

  4. 使用 grep 的 -o 和 -E 选项进行正则的精确匹配

    sed 命令可以很好的进行行匹配,但从某一行中精确匹配某些内容,则使用 grep 命令并辅以 -o 和 -E 选项可达到此目的.其中 -o 表示“only-matching”,即“仅匹配”之意.光用它 ...

  5. 转自csdn:计算机启动过程

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信 息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中 包含了CPU的相关信息.设备启动顺序信息 ...

  6. 设计模式之Proxy(代理)

    设计模式之Proxy(代理) 板桥里人banq http://www.jdon.com 2002/04/21/ 理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水, ...

  7. OC继承

    1.成员访问类型 private:私有成员,不能被外部函数访问(使用),也不能被子类继承: protected:保护成员,不能被外部函数访问,可以被子类继承: public:公有成员,可以被外部函数访 ...

  8. 阿里云 CentOS 镜像和 EPEL 源

    配置阿里云网络yum源 阿里云镜像源地址http://mirrors.aliyun.com/ 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.re ...

  9. vue笔记2

    vue项目目录 <pre> ├── build // 构建服务和webpack配置 ├── config // 项目不同环境的配置 ├── dist // 项目build目录 ├── in ...

  10. layui渲染form表单

    有时ajax请求的数据返回时,页面已经加载了,此时就无法展示ajax加载的内容,如果要局部刷新表单,则加上如下代码: layui.use('form', function() { var form = ...