Big Shot IT公司采访拼图

时间:2014-10-05 00:59:12

标签: performance algorithm

上周,我参加了一些大型IT公司的采访。一个问题让我有点疑惑。下面是对问题的准确描述。(来自其中一个面试问题网站)

鉴于数据集,

A,B,A,C,A,B,A,D,A,B,A,C,A,B,A,E,A,B,A,C,A,B,A,D,A,B,A,C,A,B,A,F

可以缩减为

(A; 16); (B; 8); (C; 4); (D; 2); (E; 1); (F; 1):

使用(值,频率)格式。

总共m个这些元组,没有特定的顺序存储。设计一个O(m)算法,该算法返回数据集的第k阶统计量。 m是元组的数量,而不是n,它是数据集中元素的总数。

1 个答案:

答案 0 :(得分:2)

您可以使用Quick-Select来解决此问题。

天真:

  1. 从数组中选择一个元素(称为pivot)
  2. 小于或等于阵列左侧的枢轴,右侧更大的那些。
  3. 如果枢轴位于k位置,那么您就完成了。如果它大于k,则重复阵列左侧的算法。如果它小于k,则在阵列的右侧重复算法。
  4. 有几个细节:

    1. 您需要随机选择枢轴(如果您对预期的O(m)感到满意作为成本),或使用确定性中值算法。
    2. 如果有很多值等于枢轴,你需要小心不要花费O(m ^ 2)时间。一种简单的方法是做第二遍将阵列分成3部分而不是2部分:小于枢轴的那些,等于枢轴的那些,以及大于枢轴的那些。