求数组按元素重复出现次数多少重新排列算法(200分) ( 积分: 200 )

  • 主题发起人 主题发起人 peerson
  • 开始时间 开始时间
哈希链表表示法。
记录定义
type
PHashTable = ^THashTable;
THashTable = record
Value ;
Pointer;
Count : integer;
next1 : PHashTable;
//拥有相同Hash值的元素
next : PHashTable;
//不同hash值的元素
end;
 
除了数字的数量之外,楼主可能还应该给出大致的“不重复数”的数量级——10w? 100w?
120s也许并不慢——不过,考虑到时间换空间或者空间换时间——在机器允许的范围内,
可以在物理内存大小的范围内让算法的内存占用尽可能多一些,这样可以减少冲突的发生。
1000w的Integer数据,占用空间约40M,如果我们不考虑任何冲突,或者,仅允许Hash后
相同的值至多对应两个不同的实际值,就可以大幅度的减少指针的使用——而代价仅仅是对
这40M的信息进行不止一次的遍历。如果算法一开始就分配一个512M甚至更多的严格限制冲
突Hash表,就能在头两次遍历后消灭99%以上的元素,然后再用普通的Hash表处理剩下的钉
子户。
允许两次冲突的Hash表元素可以是这样的:
THashItem = record
Value1 : Pointer;
Count1 : integer;
Value2 : Pointer;
Count2 : integer;
end;

——事先对这40M数据进行内存数组的复制,然后遍历副本数组,每遍历一次,就将成功
Count的数组元素清零,以后遍历只处理非零的元素。——如此往复几次,到剩下的非零元
素足够少,就可以使用普通hash表了。我估计遍历40M数据应该非常快,多次遍历全部加起
来也会远小于120秒 :)
 
还是楼上了解俺啊!
俺想问的就是元素值都有些什么,楼主告诉我:
“元素的定义:
type
Myel:array of Integer;
Myel的长度在所有元素中是相同的,但每次使用中可能不同,所以需要在hashtable中设定这个长度”
这对设计哈希函数基本上没什么帮助哎。
 
感谢版主和大家的帮助,已经通过改造hashtable解决问题,结帖了。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部