计算和查找事件的有效方法(乐透分析)

时间:2012-06-30 06:43:33

标签: java grouping

我想要实现两件事:     1)从lotto结果中找出对号并存储到Hash表中。     2)以有效的方式循环通过乐透,计算频率并将频率结果添加到对号哈希表。

我想建立一个程序,能够告诉我对号频率。

For a list / array of number , example :
    4, 12, 20 , 32, 48, 50
    2, 22, 20 , 32, 38, 40
    4, 12, 20 , 25, 33, 44
    1, 11, 20 , 31, 48, 50
    1, 12, 20 , 36, 47, 51

我想要的结果:

    Pair Number     |      Repeat Times
    4, 12                          2
    4, 20                          2
    12, 20                         3
      .                            .
      .                            .

列出所有可能的配对编号automatics
列表/数组中不需要的数据。 是否有其他建议存储数据以便于分组?地图?

除了循环之外,是否有任何有效的方法对重复数进行分组和计数?

感谢任何建议和建议。

1 个答案:

答案 0 :(得分:0)

为了清楚起见,假设您开始使用n个由c元素组成的集合(在本例中为数字)。您的问题是找到所有集合中大小为2的所有唯一子集的聚合频率(即跨越所有集合)。

为此,循环遍历每个集合并考虑该集合中的每对元素并将其频率保持在哈希表中。考虑一对时,如果它已经存在于哈希表中,则将其值加1;否则,将其添加到值为1的哈希表中。您的代码将类似于下面伪代码的类似内容。

hashtable h
for s in sets:
   for i in s.size():
       for j > i in s.size():
            pair p = (s[i],s[j])
            if h.exists(p):
                h[p]++
            else:
                h.put(p,1)

由于此方法具有三次嵌套循环,其限制为ncc,因此此算法在O(nc^2)时间内执行。

考虑一个极端情况,其中每个可能的大小为2的子集都是唯一的。在这种情况下,您的频率表将包含n × c choose 2个元素。在big-O表示法中,此值减少到O(nc^2)。因此,最佳解决方案并不比O(nc^2)好,这正是上述算法的速度。