《算法导论的Java实现》 10 中位数和顺序统计学

10 中位数和顺序统计学

10.1 最大元素和最小元素
伪代码:


Java代码:


输出:
26

code后感
这可能是《算法导论》里面最简单的程序之一。但是《算法导论》一书的最大特点就是,算法本身不难,或者说,像我现在这样的工作:把伪代码用某种具体语言去实现一遍,是非常容易的事儿。
但是算法的分析,却绝不简单。比如,要证明MINIMUM算法是最优的;再比如,去分析伪代码的第4行,赋值次数的期望值,都是不太容易的事儿。对于普通的程序员来说,也许未必就一定要掌握这些,只要记住一些结论也就可以了————第4行被执行的期望值是Θ(lg n)。


10.2 以线性期望时间做选择
伪代码:


Java代码:


输出:
41


code后感
我有点晕: 快速排序的随机化版本的函数RANDOMIZED-PARTITION居然可以用在这里。用线性时间得到数组里面的最大或者最小值,实在是一个小学生都会做的事儿————一个一个比较就可以了。
但是,用线性时间得到数组第N大的值,就不那么容易了。《算法导论》里面说,“一般选择性问题看起来要比寻求最小元问题跟难些。但是令人惊奇的是,两个问题的渐近时间是一样的:都是Θ(n)”。
这真的很令人惊奇,可以想象一下,让一个小学生去从10个数字里面选出第3小的那个。他会怎么做呢?小学生也许会先找到最小的,再找到次小的,最后找到第3小的那个。
如果这样,那么算法复杂度肯定是n的二次方了。
RANDOMIZED-SELECT的神奇之处在于它的渐近时间居然是Θ(n)!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值