我目前正在尝试验证是否存在长度为N且整数为k的未排序数组A,是否存在某个元素出现n / k次或更多次。
我对这个问题的想法是计算模式,然后将其与n / k进行比较。但是,我不知道如何快速计算这种模式。我的最终结果需要是n log(k),但我真的不知道如何做到这一点。我能找到的最快的是n k ......
答案 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)