使用散列查找浮点数组的模式

时间:2009-03-27 11:46:15

标签: algorithm language-agnostic hash

我最近读到,涉及散列的方法可能是查找浮点数数组模式的好方法。我对哈希或其应用程序知之甚少,而且文本没有进一步解释。

有谁知道这种方法会涉及什么?

2 个答案:

答案 0 :(得分:4)

在这个意义上,the mode并不是一个统计数据,似乎被定义为“最常出现的价值”。

根据该描述,使用哈希表实现此功能的显而易见的方法似乎是使用数字作为键,并使用频率计数器作为存储的值。

然后循环遍历每个数字,在Python伪代码中,这将是:

array = [1.0, 1.2, 0.4, ...] # A bunch of numbers
counts = {}
for a in array:
  if a in counts:
    counts[a] += 1
  else:
    counts[a] = 1

然后你需要提取最大值,并找到相应的键:

sorted([(v, k) for k, v in counts.items()])[-1][1]

这将创建(值,键)对的排序列表,按值排序,然后从最后一个(1)对中提取键([-1])。

我没有使用defaultdict或等价物,为了说明我认为if非常有帮助。

注意:我不保证这是解决问题的规范方法。如果有人让我解决问题(也许暗示使用哈希是一个好主意),这就是我所做的,在我的头脑中。

答案 1 :(得分:3)

J

   NB. random array of floating-point numbers
   ] y =: 10 (?@$%]) 5
0 0.6 0.2 0.4 0.4 0.8 0.6 0.6 0.8 0
   NB. count occurrences
   ({:,#)/.~ y
  0 2
0.6 3
0.2 1
0.4 2
0.8 2
   NB. order by occurrences
   (\:{:"1)({:,#)/.~ y
0.6 3
  0 2
0.4 2
0.8 2
0.2 1
   NB. pick the most frequent
   {.{.(\:{:"1)({:,#)/.~ y
0.6

我建议不要使用散列,因为它假定了精确的比较 - 从来不是对浮点数的好假设。你总是希望做某种epsilon comparison。如果您的数组包含一些0.2(00000000)0.2(00000001)元素,这些元素应该被认为是相同的,但不是因为它们来自不同的计算,该怎么办?

方便的是, J 默认情况下总是进行epsilon比较。太方便了,因为它隐藏在/.~中,我必须编写更多代码才能演示如何在Python等其他语言中执行此操作...

epsilon = 0.0001
def almost_equal(a, b):
    return -epsilon <= a-b <= epsilon

array = [0.0, 0.6, 0.2, 0.4, 0.4, 0.8, 0.6, 0.6, 0.8, 0.0]

# more efficient would be to keep this in sorted order,
# and use binary search to determine where to insert,
# but this is just a simple demo
counts = []
for a in array:
    for i, (b, c) in enumerate(counts):
        if almost_equal(a, b):
            counts[i] = (b, c + 1)
            break
    else:
        counts.append((a, 1))

# sort by frequency, extract key of most frequent
print "Mode is %f" % sorted(counts, key = lambda(a, b): b)[-1][0]