iOS标准库中经常使用数据结构和算法之哈希表

上一篇: iOS标准库中经常使用数据结构和算法之二叉排序树算法

🎲哈希表

系统提供一个全局的key为字符串的哈希表。并提供哈希表的建立、元素添加、元素查找、哈希表的销毁的能力。存储在哈希表中的元素是一个以下的标准结构:bash

//哈希表元素实体结构定义
typedef	struct entry {
	char *key;   //哈希表中的key,必须是字符串
	void	*data;  //哈希表中的值,是一个指针类型,其内容能够任意。
} ENTRY;
复制代码

1、哈希表的建立和销毁

功能:用于全局哈希表的建立和销毁操做。数据结构

头文件:#include <search.h>数据结构和算法

平台:BSD Unix函数

函数签名oop

//建立一个哈希表
 int hcreate(size_t nel);
//销毁一个哈希表
 void hdestroy(void);
复制代码

参数post

nel: [in]指定哈希表的初始容量尺寸,这个参数主要用于内存存储上的优化处理。优化

return:[out] 若是哈希表建立成功则返回0,不然返回非0。spa

描述指针

系统提供了一个全局的哈希表,所以这也是一个很是重要的缺点,由于咱们没法知道其余函数是否也正在使用这个哈希表。所以在特定时刻只有一个哈希表是有效的。我的的感受是这就是一个很是不合理的哈希表实现。

2、哈希表元素的添加和查询。

功能:用于哈希表元素的添加和查询。

头文件:#include <search.h>

平台:BSD Unix

函数签名

ENTRY * hsearch(ENTRY item, ACTION action);

复制代码

参数

item:[in] 要进行查询或者添加的条目,这是一个ENTRY类型的数据。若是咱们只是查询则只须要设置ENTRY中的key部分的值,而若是是添加则须要设置完整的key和data的值。

action:[in]指定要对哈希表执行的动做,这个类型是一个ACTION类型的枚举值,其定义以下:

typedef	enum {
	FIND, ENTER
} ACTION;
复制代码

当值设置为FIND时则只进行查找处理。 当值设置为ENTER是就先进行查找,若是不存在时就进行添加处理。

return:[out] 返回查找或者添加时在哈希表中的实体元素的指针。若是没有查找到或者添加失败则返回NULL。咱们不须要对返回的ENTRY指针进行内存释放处理,而是由系统来完成。

描述

对哈希表执行ENTER动做时,若是找到了则直接返回之前曾经插入到哈希表中的条目,若是没有找到则会在哈希表中建立一个新的条目,并返回新条目的指针。**这里须要注意的是在执行插入时要求ENTRY结构体中的key部分的内存必需要用malloc进行分配,由于哈希表在销毁时会对全部哈希表中的元素的key部分调用free处理。**也就是说对于哈希表的插入来讲key的内存咱们负责分配,而由系统负责销毁。这里也存在一个BUG就是当咱们对一个在哈希表中已经存在的key再次调用hsearch时会返回对应的ENTRY指针。可是咱们没法得知这个返回值究竟是新建立的仍是已经存在的。而咱们的key又是经过malloc分配出来的内存数据,所以就没法肯定咱们是否须要去释放这部分已经分配出来的key的内存。

示例代码

void main()
{
   //建立
   if (hcreate(10) != 0)
    {
         //插入
        ENTRY ent;
        ent.key = malloc(4);    //对于插入处理必须用malloc进行内存分配,并且咱们不须要去释放它。
        ent.data = (int*)10;   //这里值保存着整数类型。
        strcpy(ent.key, "Bob");
        ENTRY *p1 = hsearch(ent, ENTER);
        NSAssert(strcmp(p1->key, "Bob")==0, @"oops!");
        
        ent.key = malloc(6);
        ent.data = (int*)20;
        strcpy(ent.key, "Alice");
        ENTRY *p2 = hsearch(ent, ENTER);
        
       //查找
        ENTRY *p3 = hsearch(ent, FIND);
        NSAssert(p3 == p2);

        //销毁
        hdestroy();
    }
}
复制代码

因为这个哈希表的实现对插入重复元素时存在着BUG,以及又是全局惟一的,因此不建议使用它。

相关文章
相关标签/搜索