在C语言中,我们常常需要用到hash表,但是每次进行定义比较浪费时间,所以我们用uthash.h头文件来实现hash表的定义。
我们来看如下一个问题,给定一个数组,我们需要找到这个数组中的两个元素,使得他们的和为给定的target值,然后,返回这两个元素的位置。
通常,我们可以通过数组中的每两个元素进行逐对比较,这样的时间复杂度为
O(N2)
,但是如果我们用hash表进行查找,查找的时间为
O(1)
,这样总体的时间复杂度就可以控制在
O(N)
.
首先我们先下载头文件uthash.h,然后将这个头文件添加到搜索相关路径中去。
下面的代码说明了这一想法
//第一步:定义一个hashnode节点结构体,其中必须包括UT_hash_handle hh,然后就是键值(用来查找)和val值。
struct hashnode
{
int Key;
int val;
UT_hash_handle hh;
};
//第二步,定义一个函数实现这个功能
int * twoSum(int *Array ,int N,int target)
{
struct hashnode *hashtable=NULL;//定义一个hash表,其实就是一个hashnode指针
struct hashnode *temp_point=NULL;
int *result=malloc(sizeof(int)*2);
result[0]=0;
result[1]=0;
int i;
int temp_int;
for(i=0;i<N;i++)
{
temp_int=target-Array[i];
HASH_FIND_INT(hashtable,&temp_int,temp_point);//这个操作是用来在hashtable中寻找元素temp_int的,注意函数的第二项要用指针,函数第三项是用来返回一个hashnode节点指针的。
if(temp_point)
{
result[0]=i+1;
result[1]=temp_point->val;
break;
}
else
{
struct hashnode *add=malloc(sizeof(struct hashnode));
add->Key=Array[i];
add->val=i+1;
HASH_ADD_INT(hashtable,Key,add);//这个函数是查找函数,注意第二项就是用Key,这个函数可以找到这个Key就是add->Key.
}
}
return result;
}