算法分析与设计实践第六次作业

  1. 问题
    利用特定分治策略来找出一串数组中第k小的数字
  2. 解析
    分:将整个数组分为若干相等的块,各个块排序后找到其 中位数。再将各个块的中位数集合,形成一个新数组,再 次分块,不断分治后得到最终的中位数m。 治:找到m后,将原数组划分为3个组A1,A2,A3,分别包 含小于,等于,大于m的元素。这样可以得到3中情况: 1. 若A1的元素数量大于等于K,即第K个元素在第一组内: 在A1中递归查找第k小元素。 2. 若A1、A2元素个数之和大于等于K,即中项m为第K个元 素。返回m。 3. 第K个元素在第三组:在A3中递归寻找第(k-|A1、A2元素 数量之和|)小元素。
  3. 设计
    输入 n 个元素的数组 A[1…n] 和整数 k,1 ≤ k ≤ n
    输出 A 中的第 k 小元素
    算法描述 select(A, low, high, k)
  4. n ← high - low + 1----(Θ(1))
  5. if n < 44 then 将 A 排序 return (A[k])----(Θ(1))
  6. 令 q = ⌊n/5⌋。将 A 分成 q 组,每组5个元素。如果5不整除 n ,则排除剩余的元素。----(Θ(n))
  7. 将 q 组中的每一组单独排序,找出中项。所有中项的集合为 M。----(Θ(n))
  8. mm ← select(M, 1, q, ⌈q/2⌉) { mm 为中项集合的中项 } ----T(n/5)
  9. 将 A[low…high] 分成三组----(Θ(n))
    A1 = { a | a < mm }
    A2 = { a | a = mm }
    A3 = { a | a > mm }
  10. case
    |A1| ≥ k : return select(A1, 1, |A1|, k)
    |A1| + |A2| ≥ k : return mm
    |A1| + |A2| < k : return select(A3, 1, |A3|, k - |A1| - |A2|)
  11. end case
  12. 分析
    最好的情况下是O(n)
    最差的情况是O(n ²)
  13. 源码
    https://github.com/FPhoenixtree/-/blob/main/%E7%AE%97%E6%B3%95%E5%88%86%E6%9E%90%E4%B8%8E%E8%AE%BE%E8%AE%A1%E7%AC%AC%E5%85%AD%E6%AC%A1%E4%BD%9C%E4%B8%9A.cpp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值