一步一步写算法(之hash表)

一步一步写算法(之hash表)

【 声明:版权全部,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

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

    打个比方来说,全部的数据就好像许很多多的书本。假设这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显得非常的无序和凌乱,在你找到自己须要的书之前,你要经历很多的查询过程;而假设你对全部的书本进行编号,而且把这些书本按次序进行排列的话,那么假设你要寻找的书本编号是n,那么经过二分查找,你非常快就会找到自己须要的书本;可是假设你每个种类的书本都不是非常多,那么你就能够对这些书本进行归类,哪些是文学类,哪些是艺术类,哪些是工科的,哪些是理科的,你仅仅要对这些书本进行简单的归类,那么寻找一本书也会变得非常easy,比方说假设你要找的书是计算机方面的书,那么你就会到工科一类其中去寻找,这样查找起来也会显得麻烦。

    不知道这样举例你清楚了没有,上面提到的归类方法事实上就是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表能够和二叉树形成复合结构,至于为什么,建议朋友们好好思考一下?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119039.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • css自动换行属性与保留空白属性冲突_css换行样式

    css自动换行属性与保留空白属性冲突_css换行样式word-break属性规定自动换行的处理方法。提示:通过使用word-break属性,可以让浏览器实现在任意位置的换行。所有主流浏览器都支持word-break属性。语法:word-break:normal|break-all|keep-all;normal使用浏览器默认的换行规则。break-all允许在单词内换行。keep-all只能在半角空格或连字符处换行。word-break:break-all所有的都换行,右侧换行没有空隙。word-wrap属性允许

    2025年6月27日
    3
  • 新东方尹圆圆老师的博客上找来的「建议收藏」

    新东方尹圆圆老师的博客上找来的「建议收藏」这些网站是从新东方尹圆圆老师的博客上找来的,希望大家好好利用:1.http://www.texun.cn/addrso/index.htm特训网:EnglishLearningWebsites2.http://broadcast-live.com/LiveRadioandTVfromAroundtheWorld3.http://www.nxenglish…

    2025年11月8日
    4
  • 【记录】mac使用PyCharm中Python版本不对应的解决方法

    【记录】mac使用PyCharm中Python版本不对应的解决方法在使用PyCharm进行tensorflow学习时,发现mac中还有Python2.7的旧版本,并且说明建议使用新版本。经过搜索以及多个方法的试错,突然发现我用的是macOSBigSur,而惊喜的是已经出的新版本macOSMonterey已经把Python2.7移除了,也许是因为这个原因,在安装了Monterey后,就可以非常顺利的使用Python3.7以及anaconda和tensorflow2.0了。然而在之后的一天我使用anaconda运行py程序时发现了这个问题:Process

    2022年8月27日
    7
  • CEGUI环境的搭配[通俗易懂]

    CEGUI环境的搭配[通俗易懂]提前准备工具及安装包:1、CMake:一款编译工具下载地址2、CEGUI的源码及依赖项第一个箭头所指,代表是Windows系统的源码包,第二个则是Unix和Linux系统的源码包。配置环境步骤(针对windows平台,图形化操作)Linux下,或者Windows下dos命令也可以完成相应操作,输入相关命令即可。将源码包以及依赖项进行解压如:然后打…

    2022年7月24日
    12
  • 行存储 VS 列存储[通俗易懂]

    行存储 VS 列存储[通俗易懂]概述目前大数据存储有两种方案可供选择:行存储(Row-Based)和列存储(Column-Based)。业界对两种存储方案有很多争持,集中焦点是:谁能够更有效地处理海量数据,且兼顾安全、可靠、完整性。从目前发展情况看,关系数据库已经不适应这种巨大的存储量和计算要求,基本是淘汰出局。在已知的几种大数据处理软件中,Hadoop的HBase采用列存储,MongoDB是文档型的行存储,Lexst是二进制型…

    2022年7月14日
    14
  • qt tabwidget样式_qt tablewidget使用

    qt tabwidget样式_qt tablewidget使用QTabWidget::pane{border-top:2pxsolid;border-color:#f5f5f5;}QTabBar::tab{min-width:200px;min-height:25px;color:#333333;font:17px”MicrosoftYaHei”;border:0pxsolid;}QTabB…

    2022年9月23日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号