C
charlyisme
Unregistered / Unconfirmed
GUEST, unregistred user!
最近学习LZW算法,对于该算法经典实现中用于查找后代节点的hash查找有一些不懂的方法请教:
通过结点的哈希数组来维护字典指针,从而可以有效的向下搜索树
让TABLE_SIZE是一个质数,来避免冲突,而其性能则依赖于TABLE_SIZE至少比2的BITS次幂大20%。
这里取5021 而BITS=12
程序中解决冲突的方法是再hash法
unsigned int find_child_node(int parent_code,int child_character)
{
int index;
int offset;
index=(child_character<<(BITS-8))^parent_code;
if(index==0) offset=1;
else
offset=TABLE_SIZE-index;
for(;{
if(dict[index].code_value==UNUSED2)
return(index);
if(dict[index].parent_code==parent_code&&dict[index].character==(char)child_character)
return(index);
index-=offset;
if(index<0)
index+=TABLE_SIZE;
}
}
我的问题是:index=(child_character<<(BITS-8))^parent_code;为什么用这样一个方法来得到后代节点的偏移量,这个hash函数是如何得来的?而程序中“依赖于TABLE_SIZE至少比2的BITS次幂大20%”又是基于什么原理?
呵呵,弄不懂,我自己肯定直接定义256个后代节点了事,看不懂这个hash算法,哪位高人给我讲讲为什么,而不是是什么。
通过结点的哈希数组来维护字典指针,从而可以有效的向下搜索树
让TABLE_SIZE是一个质数,来避免冲突,而其性能则依赖于TABLE_SIZE至少比2的BITS次幂大20%。
这里取5021 而BITS=12
程序中解决冲突的方法是再hash法
unsigned int find_child_node(int parent_code,int child_character)
{
int index;
int offset;
index=(child_character<<(BITS-8))^parent_code;
if(index==0) offset=1;
else
offset=TABLE_SIZE-index;
for(;{
if(dict[index].code_value==UNUSED2)
return(index);
if(dict[index].parent_code==parent_code&&dict[index].character==(char)child_character)
return(index);
index-=offset;
if(index<0)
index+=TABLE_SIZE;
}
}
我的问题是:index=(child_character<<(BITS-8))^parent_code;为什么用这样一个方法来得到后代节点的偏移量,这个hash函数是如何得来的?而程序中“依赖于TABLE_SIZE至少比2的BITS次幂大20%”又是基于什么原理?
呵呵,弄不懂,我自己肯定直接定义256个后代节点了事,看不懂这个hash算法,哪位高人给我讲讲为什么,而不是是什么。