L21 Balancing

Outline:

  • 找前k大元素
  • 找离medium最近的k个元素
  • Weighted medium
  • 找unique

Ref:

  • 算法设计与分析(Algorithm design and analysis) by 黄宇

找前k大元素

(不是第k大)

  • nlogn: 排序​
  • n+klogn​​: 建堆,k次getMax
  • n+k2​​​​:建堆+从堆的前k层里面选k次(共有 2k​​​个元素,对这个堆的fixHeap代价是log2k=k​​​,找k次,即k×k​)
  • n+klogk: 先select出第k大的元素,代价Θ(n);再以此为partition,对前k个元素排序,代价Θ(klogk)

找离medium最近的k个元素

左界:L=n/2k

右界: R=n/2+k

  • 先 selcect(L),找出左界的位置,然后partition(L);对右界同理;最后对中间的部分做操作(方法有很多)

Weighted medium

x1,x2,,xn​两两可比

w1,w2,,wn, wi>0​, ​ wi=1

找出weighted medium xk​, 使得xi<xkwi<12​, $ _{x_i > x_k} 2,<,$​​)​

  • O(n): 先select得到medium(注意,不是 Weighted medium); 再以此partition, 算出左右两边的weight,看哪边大于1/2,对子问题递归判断

找unique

所有元素只有一个和其他不一样,找出这个元素.

critical operation: compare(a, b)= Y ( a = b ) / N ( a != b)

  • 可以用adversary argument 找出下界