【转载】一步一步写算法(之hash表)
转载自:http://blog.csdn.net/feixiaoxing/article/details/6885657
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,但是数据查找十分麻烦;二叉树中的
数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。
打个比方来说,所有的数据就好像许许多多的书本。如果这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显得非常的无序和凌乱,在你找
到自己需要的书之前,你要经历许多的查询过程;而如果你对所有的书本进行编号,并且把这些书本按次序进行排列的话,那么如果你要寻找的书本编号是n,那么
经过二分查找,你很快就会找到自己需要的书本;但是如果你每一个种类的书本都不是很多,那么你就可以对这些书本进行归类,哪些是文学类,哪些是艺术类,哪
些是工科的,哪些是理科的,你只要对这些书本进行简单的归类,那么寻找一本书也会变得非常简单,比如说如果你要找的书是计算机方面的书,那么你就会到工科
一类当中去寻找,这样查找起来也会显得麻烦。
不知道这样举例你清楚了没有,上面提到的归类方法其实就是hash表的本质。下面我们可以写一个简单的hash操作代码。
a)定义hash表和基本数据节点
- typedef struct _NODE
- {
- int data;
- struct _NODE* next;
- }NODE;
- typedef struct _HASH_TABLE
- {
- NODE* value[10];
- }HASH_TABLE;
b)创建hash表
- HASH_TABLE* create_hash_table()
- {
- HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
- memset(pHashTbl, 0, sizeof(HASH_TABLE));
- return pHashTbl;
- }
c)在hash表当中寻找数据
- NODE* find_data_in_hash(HASH_TABLE* pHashTbl, int data)
- {
- NODE* pNode;
- if(NULL == pHashTbl)
- return NULL;
- if(NULL == (pNode = pHashTbl->value[data % 10]))
- return NULL;
- while(pNode){
- if(data == pNode->data)
- return pNode;
- pNode = pNode->next;
- }
- return NULL;
- }
d)在hash表当中插入数据
- STATUS insert_data_into_hash(HASH_TABLE* pHashTbl, int data)
- {
- NODE* pNode;
- if(NULL == pHashTbl)
- return FALSE;
- if(NULL == pHashTbl->value[data % 10]){
- pNode = (NODE*)malloc(sizeof(NODE));
- memset(pNode, 0, sizeof(NODE));
- pNode->data = data;
- pHashTbl->value[data % 10] = pNode;
- return TRUE;
- }
- if(NULL != find_data_in_hash(pHashTbl, data))
- return FALSE;
- pNode = pHashTbl->value[data % 10];
- while(NULL != pNode->next)
- pNode = pNode->next;
- pNode->next = (NODE*)malloc(sizeof(NODE));
- memset(pNode->next, 0, sizeof(NODE));
- pNode->next->data = data;
- return TRUE;
- }
e)从hash表中删除数据
- STATUS delete_data_from_hash(HASH_TABLE* pHashTbl, int data)
- {
- NODE* pHead;
- NODE* pNode;
- if(NULL == pHashTbl || NULL == pHashTbl->value[data % 10])
- return FALSE;
- if(NULL == (pNode = find_data_in_hash(pHashTbl, data)))
- return FALSE;
- if(pNode == pHashTbl->value[data % 10]){
- pHashTbl->value[data % 10] = pNode->next;
- goto final;
- }
- pHead = pHashTbl->value[data % 10];
- while(pNode != pHead ->next)
- pHead = pHead->next;
- pHead->next = pNode->next;
- final:
- free(pNode);
- return TRUE;
- }
总结:
1、hash表不复杂,我们在开发中也经常使用,建议朋友们好好掌握;
2、hash表可以和二叉树形成复合结构,至于为什么,建议朋友们好好思考一下?
【转载】一步一步写算法(之hash表)的更多相关文章
- 十一、从头到尾彻底解析Hash 表算法
在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver ...
- Hash表及hash算法的分析
Hash表中的一些原理/概念,及根据这些原理/概念: 一. Hash表概念 二. Hash构造函数的方法,及适用范围 三. Hash处理冲突方法,各自特征 四. ...
- 一步一步写算法(之prim算法 下)
原文:一步一步写算法(之prim算法 下) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉 ...
- 一步一步写算法(之prim算法 中)
原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...
- 一步一步写算法(之prim算法 上)
原文:一步一步写算法(之prim算法 上) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面我们讨论了图的创建.添加.删除和保存等问题.今 ...
- 一步一步写算法(之挑选最大的n个数)
原文:一步一步写算法(之挑选最大的n个数) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 从一堆数据中挑选n个最大的数,这个问题是网上流传的 ...
- 一步一步写算法(之n!中末尾零的个数统计)
原文:一步一步写算法(之n!中末尾零的个数统计) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在很多面试的题目中,求n!结果中零的个数也是 ...
- 一步一步写算法(之hash表)
[ 声明:版权全部,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链 ...
- 一步一步写平衡二叉树(AVL树)
平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵 ...
随机推荐
- 使用Excel制作万年历(可打印)
先来看看A4纸打印效果,其他功能后续继续完善中. 年份数据字典(农历节日) 农历节日表 年度 春节 元宵节 龙抬头 端午节 六月六 七月七 七月十五 仲秋节 除夕 2010年02月14日 2010年0 ...
- HOWTO - Basic MSI安装包在安装运行过程中如何获取完整源路径
有朋友问到如何在一个Windows Installer安装包中获取安装包源路径,就是在安装包运行过程中动态获取*.msi所在完整路径. 这个问题分两类,如果我们的安装包只是一个*.msi安装文件,那么 ...
- java综合
java环境变量配置:http://jingyan.baidu.com/article/f96699bb8b38e0894e3c1bef.html 1.导入项目 当下载了包含Eclipse 项目的源代 ...
- 通过生产者消费者模式例子讲解Java基类方法wait、notify、notifyAll
wait(),notify()和notifyAll()都是Java基类java.lang.Object的方法. 通俗解释wait():在当前线程等待其它线程唤醒.notify(): 唤醒一个线程正在等 ...
- 从《BLAME!》说开去——新一代生产级卡通真实感混合的渲染方案
<BLAME!>是Polygon Pictures Inc.(以下简称PPI)创业33周年以来制作的第一部CG剧场电影,故事来自于贰瓶勉的同名漫画作品(中文译名为<探索者>或者 ...
- libev代码
就是贴上来: ev.c: /* * libev event processing core, watcher management */ /* this big block deduces confi ...
- 安装redis监控
在修改登录中心的时候,数据存储在redis里面,需要对redis进行监控,使用的是Redis-Live 参考文章: http://www.nkrode.com/article/real-time-da ...
- JS区别不同浏览器(微信、手机等)
最近一直在忙于自己公司的旅游产品,设计方面太广并且要兼容各种设备和场景,包括PC.Mobile.Pad.还有各种支付.由于微信支付和支付宝存在竞争,所以需要区别不同的浏览器,并且WEB项目还要出现在A ...
- 如何启动ResourceManager和NodeManager
登录到bigtop1上,vagrant ssh bigtop1 将/usr/lib/hadoop/libexec/init-hdfs.sh文件内容替换为: #!/bin/bash -ex # # Li ...
- WIN7,WIN8,WIN8.1,64位客户端使用32位的ODBC配置
运行64位的ODBC管理器,点开始-->运行-->odbcad32回车即可打开,但打开后看不到32位的驱动, 如果要运行32位的ODBC管理器,该怎么办呢,其实很简单, 只要执行C:\Wi ...