zoukankan      html  css  js  c++  java
  • 一步一步写算法(之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表能够和二叉树形成复合结构,至于为什么,建议朋友们好好思考一下?


  • 相关阅读:
    'Undefined symbols for architecture i386,clang: error: linker command failed with exit code 1
    The codesign tool requires there only be one 解决办法
    XCode iOS project only shows “My Mac 64bit” but not simulator or device
    Provisioning profile XXXX can't be found 的解决办法
    UIView 中的控件事件穿透 Passthrough 的实现
    Xcode4.5出现时的OC新语法
    xcode 快捷键(持续更新)
    打越狱包
    php缓存与加速分析与汇总
    浏览器的判断
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4052664.html
Copyright © 2011-2022 走看看