哈希表的使用,懂哈希表的请进来给意见,谢谢!!!!!(50分)

  • 主题发起人 主题发起人 L.Ming
  • 开始时间 开始时间
L

L.Ming

Unregistered / Unconfirmed
GUEST, unregistred user!
两个记录弄数组的比较,大家都说用哈希表,但是以前没有用过哈希表,<数据结构>看了,大致有个了解,但是也不懂得在DELPHI中如何使用,所以想请大家给个源码例子,作为参考,最好是比较相近的例子,记录型的.我的记录类型是这样的:
TSets = set of [1..248]
TData = record packed
Grea: TSets;
Esps: TSEts;
end;
AData: array[1..1000000] of TSets;
BData: array[1..100000000] of TSets;
AData,BData里面无重复记录,现在求AData里面有多少个BData的记录,反过来求也行.一样的.大家最好能以这个给个例子,这样也比较容易理解
 
网络时代!?
 
有没搞错啊,
哈希表是和具体数据类型相关的,不是想用就行,
比如你的数据确定只有s[A..Z] 这些数据组成(ascii 65-90)
那么哈希函数可以是 int h := h + (ord(s) - 65 ) * (i + 1)
//0--26
实际上是将有效值换算成某个数字,利用cpu计算数字快于
string或其他复杂数据类型的特性,提高计算速度,
但错误的哈希计算公式会导致出错误,哈希表一般用于查找数据
而不是绝对精确的计算,如果是那样,你必须做一个不出错的
哈希公式。
 
bsense说的对,只要是哈希表,总是避免不了冲突的!
delphi有个THashedStringList类,用用试试!
另:
AData: array[1..1000000] of TSets;
BData: array[1..100000000] of TSets;
这种声明或许会内存错误的,栈空间会用完的!
AData: array of TSets;
BData: array of TSets;
setlength(adata,1000000)
setlength(bdata,100000000);
在堆上分配就没有问题了!
 
可能是俺水平的问题,D的哈希在多线程时取值总会偶尔出点小错,后来用VC重写,则非常正常,所以后来不用D写哈希
 
THashedStringList又怎么用呢?不会只是用于字符的吧?
 
这里表达的是一个统计问题,怎么会有人建议你使用哈希?
请把对你提出使用哈希建议的那个人的建议放出来让我也学习学习,太强了,闻所未闻。
 
要做这样的统计是非常简单的。

首先是把大数据转化到小数据,基本上只需要用到小学的数学知识。
比如 AData 一共有 1000000 个数据,但它的数据类型是 TStes,也就表示这些数据的共同
点是:所有数据的值都在 1..248 之间。因为我们只是统计,不需要知道精确的 AData 中
某个数据的具体数值,因此可以把这个 AData 缩小压缩成 248 个数据。

BData 也采用相同的方法压缩到 248 个数据。

之后,只要对一共 496 个数据进行处理就完成了。
 
不是呀,小雨哥,怎么可能是248个数据处理呢?假如AData[1] = [1,2,3],AData[2] = [2,3,4,5,6,8],这样的数据不可能压缩得成248个吧?一个集合不可能只有1个元素吧?
 
“AData[1] = [1,2,3],AData[2] = [2,3,4,5,6,8]”,你的命题给 AData 是这样赋值?

你的命题用代码表示我觉得好像是这样的:
type
TSets = 1..248;
var
AData: array[1..1000000] of TSets;
BData: array[1..100000000] of TSets;

这样的话,明显可以看出 AData 和 BData 分别有 1000000 个和 100000000 个元素,
每个元素都只能在 1..248 之间取值。

这样的数据统计不就是 248 个值的使用频度统计吗?感觉你对数据不敏感啊。
 
接受答案了.
 

Similar threads

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