先附上challenge要求:

博主最近在刷coursera普林斯顿大学算法课part1部分的作业,Programming Assignment2最后的这个extra challenge当初想了一段时间。最开始的想法就是创建一个RandomizedQueue对象,然后先让前k个String入队,后面的每读一个String以一定概率让它入队,不过之前需要让RandomizedQueue出队一个String。标准输入读完之后,得到一个k个String的RandomizedQueue,然后随机出队打印。这样可以满足extra challenge对于内存的要求。但是比较让人苦恼的是前面的入队概率一直想不出合适的,试过等值概率和一些渐变序列都失败了,造成的结果就是最后的k个值可能的组合不是均匀分布的,那么最后的输出的k个值的排列也一定不是均匀分布的,不满足题目要求。

后来在看Elementary sort部分的时候,老师介绍了一种随机打乱数组顺序的方法,而且据说已经被证明可以产生均匀分布的随机排列(代码如下)

public static void shuffle(Object[] a)
{
  int N = a.length;
  for (int i = 0; i < N; i++)
  {
  int r = StdRandom.uniform(i + 1);
  exch(a, i, r); //交换数组中的 i 和 r 项
  }
}

当时就想着这种思路能不能应用在那个extra challenge上,后来把算法稍微做了修改发现还真可以。

先简要叙述一下算法思路:

1首先标准输入前k项入队

2检查标准输入有无剩余项,若有转3,没有转4

3读取下一个输入(第n项),随机产生一个在1~n之间的随机数r,如果r <= k,则从RandomizedQueue随机出队一项,然后这次读取的String入队,否则转2

4结束

这个算法能够从n个String中随机产生均匀分布的k项组合,下面附上简单的证明过程(主要利用数学归纳法)

最后附上算法代码:

public static void main(String[] args){
int k = Integer.parseInt(args[0]);
RandomizedQueue<String> x = new RandomizedQueue<String>();
// use only one RandomizedQueue object of maximum size at most k
for (int i = 0; i < k; i++)
x.enqueue(StdIn.readString());
int n = k;
while (!StdIn.isEmpty()){
String string = StdIn.readString();
n++;
if (StdRandom.uniform(n) < k){
x.dequeue();
x.enqueue(string);
}
}
for (int i = 0; i < k; i++)
StdOut.println(x.dequeue());
}

coursera普林斯顿算法课part1里Programming Assignment 2最后的extra challenge的更多相关文章

  1. 普林斯顿算法课第四周作业_8Puzzle

    作业地址:http://coursera.cs.princeton.edu/algs4/assignments/8puzzle.html 作业难点: 1.如何求一个Puzzle的解? 根据作业提示,使 ...

  2. 普林斯顿算法课第五周作业_KdTree

    作业地址:http://coursera.cs.princeton.edu/algs4/assignments/kdtree.html 作业难点: 1.如何构建KdTree,使用什么样的数据结构? 根 ...

  3. 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 3.Programming Assignment : Planar data classification with a hidden layer

    Planar data classification with a hidden layer Welcome to the second programming exercise of the dee ...

  4. Coursera Algorithms Programming Assignment 2: Deque and Randomized Queue (100分)

    作业原文:http://coursera.cs.princeton.edu/algs4/assignments/queues.html 这次作业与第一周作业相比,稍微简单一些.有三个编程练习:双端队列 ...

  5. Algorithms : Programming Assignment 3: Pattern Recognition

    Programming Assignment 3: Pattern Recognition 1.题目重述 原题目:Programming Assignment 3: Pattern Recogniti ...

  6. 技术期刊 · 天光台高未百尺 | Uber 工程师的 JS 算法课;大数据时代的个人隐私;设计师的 Github;告别 PPT 工程师;从零开始实现的像素画

    蒲公英 · JELLY技术期刊 Vol.42 这是一个最好的时代,多样化的平台给了所有人成长发展的机会,各种需求和解决需求的人让人大开眼界:但这也并不是完美的时代,"前端还需要懂什么算法?& ...

  7. Programming Assignment 2: Deques and Randomized Queues

    编程作业二 作业链接:Deques and Randomized Queues & Checklist 我的代码:Deque.java & RandomizedQueue.java & ...

  8. Algorithms: Design and Analysis, Part 1 - Programming Assignment #1

    自我总结: 1.编程的思维不够,虽然分析有哪些需要的函数,但是不能比较好的汇总整合 2.写代码能力,容易挫败感,经常有bug,很烦心,耐心不够好 题目: In this programming ass ...

  9. 课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 2、编程作业常见问题与答案(Programming Assignment FAQ)

    Please note that when you are working on the programming exercise you will find comments that say &q ...

随机推荐

  1. Codeforces Round #383 (Div. 2)C. Arpa's loud Owf and Mehrdad's evil plan

    C. Arpa's loud Owf and Mehrdad's evil plan time limit per test 1 second memory limit per test 256 me ...

  2. awk命令练习

    文件 file.txt的内容格式: 文件中包含名字,电话号码和过去三个月里的捐款 具体内容如下: Mike Harrington:[510] 548-1278:250:100:175 Christia ...

  3. Android 开发笔记___FrameLayout

    xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:la ...

  4. visual filters 滤镜 ie

    滤镜ie9开始就废弃了,用来对ie4-8实现一些多媒体动画之类的效果.可以添加到标准的HTML控件上,例如text,图片   包含:1.界面滤镜  (Procedural Surfaces)2.静态滤 ...

  5. zip 安装mysql 和遇到的坑

    在官网下载了mysql 社区版的,官方网址:https://dev.mysql.com/downloads/mysql/ 解压后发现里面没有安装快捷方式,才知道是zip解压,dos窗口安装.这就比界面 ...

  6. 疑似CPU或者内存故障导致进程崩溃

    我们有一个服务跑在微软云的所有宿主机上.最近发现某一台机器上该服务进程持续崩溃.崩溃原因是访问了一个无效指针,对应的代码如下 serviceListIniBuffer.AppendF("Se ...

  7. MySQL锁学习之UPDATE

    ##==============================================================================## 学MySQL也蛮长时间了,可一直停 ...

  8. MySQL原理相关

    1.索引 http://blog.codinglabs.org/articles/theory-of-mysql-index.html

  9. 判断pdf、word文档、图片等文件类型(格式)、大小的简便方法

    判断pdf.word文档.图片等文件类型(格式).大小的简便方法 很久没发文了,今天有时间就写一下吧. 关于上传文件,通常我们都需要对其进行判断,限制上传的类型,如果是上传图片,我们甚至会把图片转化成 ...

  10. Spring4 事务管理

    Spring4 事务管理 本章是Spring4 教程中的最后一章,也是非常重要的一章.如果说学习IOC是知识的入门,那学习事务管理就是知识的提升.本章篇幅可能有一丢丢长,也有一丢丢难,需要读者细细品味 ...