一个算法问题--熟悉LZW压缩算法的朋友请进(200分)

  • 主题发起人 主题发起人 charlyisme
  • 开始时间 开始时间
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&amp;&amp;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算法,哪位高人给我讲讲为什么,而不是是什么。
 
呵呵,提提个人理解。
index=(child_character<<(BITS-8))^parent_code
这个hash函数的设计在于利用parent_code与child_code这两个因素本身得到其后代的偏移量。
为什么要移(BIT-8)位?因为char是8位,那么就要移动BITS-8才能达到指定位数的表项了。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部