给定数据流< 4,1,3,5,1,3,2,6,7,0,9 >,若哈希函数形如h(x)= (ax + b) mod 8,其中a和b是任意给定的常数。假设给定如下哈希函数:
(1) h(x) = (3x + 2) mod 8;
(2) h(x) = (7x + 5) mod 8;
(3) h(x) = (5x + 3) mod 8。
请利用Count-Min sketch算法估计频繁项。
程序
'''
CountMinSketch 实现 已完成
'''
import numpy as np
def h(a,b,x):
return np.mod((a*x+b),8)
d_two=np.array([],[])
a = np.array([3,7,5])
b = np.array([2,5,3])
x = np.array([4,1,3,5,1,3,2,6,7,0,9])
x_h=[]
def select(t,p):
count=[0,0,0,0,0,0,0,0]
for i in x:
l = h(a[t],b[t],i)
##print(i,"的哈希值为:",l)
count[l]=count[l]+1
return(count[p])
#print(select(0))
'''
hash_0=select(0)
hash_1=select(1)
hash_2=select(2)
'''
for j in range(0,11):
##print(select(k))
print('数',x[j],'的哈希值为',h(a[0],b[0],x[j]),h(a[1],b[1],x[j]),h(a[2],b[2],x[j]))
for k in x:
print('数',k,'的出现次数为',select(0,h(a[0],b[0],k)))
'''
for k in range(0,len(hash_0)):
print(min(hash_0[k],hash_1[k],hash_2[k]))
'''
结果
因为给定的这三个哈希函数对解决哈希冲突毫无作用,可以看到9和1的哈希函数值都是一样的,这里我不太理解,就只用了其中一个哈希函数的值来做索引了
可以看出由于哈希函数冲撞会导致频率结果偏大