计算统计模式

时间:2009-02-04 18:11:25

标签: algorithm statistics selection mode

我目前正在尝试验证是否存在长度为N且整数为k的未排序数组A,是否存在某个元素出现n / k次或更多次。

我对这个问题的想法是计算模式,然后将其与n / k进行比较。但是,我不知道如何快速计算这种模式。我的最终结果需要是n log(k),但我真的不知道如何做到这一点。我能找到的最快的是n k ......

5 个答案:

答案 0 :(得分:6)

使用哈希表计算每个值的频率:

uint[int] counts;
foreach(num; myArray) {
     counts[num]++;
}

int mostFrequent;
uint maxCount = 0;
foreach(num, count; counts) {
    if(count > maxCount) { 
        mostFrequent = num;
        maxCount = count;
    }
}

答案 1 :(得分:2)

设置m = n / k向上舍入。做一个快速排序,但丢弃长度小于m的子列表。

像quicksort一样,你可以运气不好,并反复选择靠近两端的枢轴。但如果您随机选择枢轴,这种情况发生的可能性很小。

递归时会有O(log(k))级别,每个级别需要O(n)次。

答案 2 :(得分:1)

只需遍历数组并将计数保存在哈希/字典中(并在找到n / k后返回true,否则为false)将为O(n)

编辑,例如:

counts = {}
for n in numbers:
    if ( counts.has_key( n ) ):
        counts[ n ] += 1
    else:
        counts[ n ] = 1
    if ( counts[ n ] >= n / k ):
        return true
return false

答案 3 :(得分:1)

在F#.net中计算具有单一模式

的数据集(整数)的统计模式
let foundX (num: int, dList) = List.filter (fun x -> x = num) dList
let groupNum dList =
    dList
    |> (List.map (fun x -> foundX (x, dList)))
    |> (List.maxBy (fun x -> x.Length))

let Mode (dList: int List) = 
    let x = groupNum dList
    x.Head

//using Mode
let data = [1;1;1;1;1;1;1;1;2;2;3;3;3;1;4;4;4;4;4]
Mode data;;`

答案 4 :(得分:0)

伪代码:

 found = false
 value = null
 B = new hashtable
 for (i =0, j = A[i]; i < |A| and !found; ++i, j=A[i])
    if B contains key j
       B[j] = B[j] + 1
       if B[j] > |A|/k
          found = true
          value = j
       endif
    else 
       B[j] = 1
    endif
 end for

假设您的哈希表实现有O(1)插入/查找,这应该是O(n)