对于非常多应用来说,随机算法是最简单的或者最快的。既简单又快的有没有呢?

那须要深刻的洞察力或者革命性的突破。





什么是随机算法

随机算法与确定算法差别是:它还接收输入随机比特流来做随机决策。

对于同一个输入,每次执行所用的算法行为都不同,尽管结果都是一样的。





Foiling an adversary

能够构造一个输入使得一个确定性算法执行时间最长。

随机算法能够看作是从一族算法中随机选出来的一个算法。

高速排序O(NlgN)的精髓在于随机化划分。

高速的意思是常数因子是1.38。

标准库里面採用小规模插入排序,非递归化,三分能进一步提高20%的速度。

理想情况是均分两个子问题。

假设每次都分为9:1, 

T(n) = T(9n/10) + T(n/10) + cn。

则递归树高度是log_{10/9} n = ?

lgn。





假设输入是已经排好顺序的,则随机化

则打破这样的顺序。

有没有可能反而随机成一个升序或者降序呢?

概率是1/N!, 这么小的概率我们觉得不可能发生的(当然。严格实时系统除外)。

因此我们高概率的觉得执行时间是期望的。





线性时间的选择算法用在动态/在线输入情景时才有意义。

假设是静态输入,我们能够对整个输入做随机排列。

动态输入由于在某一个时刻仅仅看到部分,就不能这样干了。





划分

int randomPartition(int[] a, int p, int r) 实现上是非常精妙的。

是维持这个不变量:[p..i] <= x < [i+1, j)

我也是原样抄过来,对最先写出这段代码的程序猿致敬。

[] http://www.ece.northwestern.edu/~nickle/randAlg/Karp91.pdf

c2java select algorithm的更多相关文章

  1. 一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS.

    一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS. 选择算法也就是求一个无序数组中第K大( ...

  2. Randomize select algorithm 随机选择算法

    从一个序列里面选择第k大的数在没有学习算法导论之前我想最通用的想法是给这个数组排序,然后按照排序结果返回第k大的数值.如果使用排序方法来做的话时间复杂度肯定至少为O(nlgn). 问题是从序列中选择第 ...

  3. [转]网络时间的那些事及 ntpq 详解

    Gentoo(也许其他发行版也是?)中 "ntpq -p" 的 man page 只有简短的描述:“打印出该服务器已知的节点列表和它们的状态概要信息.” 我还没见到关于这个命令的说 ...

  4. iOS 3DES DES AES加密注意事项!!很重要,否则会加密失败

    今天做项目,需要进行3des加密. 加密的gkey:abcdefgh   giv:(偏移量)abcdefgh 加密后结果:p+X985x5bFS6dWjAnm6sdQ== 下面是代码: +(NSStr ...

  5. iOS加密算法总结

    常用加密算法: DES:Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的. DES(数据加密标准)原理: DES是一个分组加密算法,它以 ...

  6. NTP同步底层实现

    RFC http://www.ietf.org/rfc/rfc5905.txt https://www.eecis.udel.edu/~mills/ntp/html/select.html https ...

  7. Hive使用Calcite CBO优化流程及SQL优化实战

    目录 Hive SQL执行流程 Hive debug简单介绍 Hive SQL执行流程 Hive 使用Calcite优化 Hive Calcite优化流程 Hive Calcite使用细则 Hive向 ...

  8. 最全的ORACLE-SQL笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...

  9. Matplotlib数据可视化(6):饼图与箱线图

    In [1]: from matplotlib import pyplot as plt import numpy as np import matplotlib as mpl mpl.rcParam ...

随机推荐

  1. android中使用SharedPreferences存储数据

    使用SharedPreferences存储数据还是比较简单的 1.添加或修改数据(没有数据就添加,有数据就是修改): SharedPreferences.Editor editor = getShar ...

  2. Linux中找出占用内存最多的前N个进程

    一.使用ps命令 ps -aux | sort -k4nr | head -N *命令详解: 1. head:-N可以指定显示的行数,默认显示10行. 2. ps:参数a指代all——所有的进程,u指 ...

  3. TaskFactory设置并发量

    Task对象很多人知道了(使用Task代替ThreadPool和Thread, C#线程篇—Task(任务)和线程池不得不说的秘密(5)) 相对的还有TaskScheduler 这个调度器,可以自定义 ...

  4. dom4j解析以及生成xml字符串测试

    public static void main(String[] args) { String xmlStr = "<ybjcVo>"+ "<zbGri ...

  5. angularjs图片上传和预览 base64

    angularjs图片上传和预览 思路是从file中读取base64 Module.controller('controlName', ['$scope', '$http', function($sc ...

  6. 一、Django用Eclipse编写一个登录界面

    一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 Eclipse安装Python插件和Django的步骤直接省略. 创建de ...

  7. SpringBoot引入freemaker前端模板

    1.引入freeMarker的依赖包 <!-- 引入freeMarker的依赖包. --> <dependency> <groupId>org.springfram ...

  8. Python学习笔记六:文件处理

    一:打开文件 open(name,mode,[bufferSize]) name:文件路径 mode:文件打开方式 二:文件读取 read()方法:可以一次读取文件的全部内容,Python把内容读到内 ...

  9. Flash:移除匿名函数监听器EventListener

    private function handleCreationComplete():void { sampleButton.addEventListener(MouseEvent.CLICK, cre ...

  10. 〖Android〗dropbear一些操作命令备忘

    相关命令行: # 启动dropbear后台运行 /data/local/tmp/dropbear \ -A -N android -I -C -G -p \ -R /data/local/tmp/au ...