1. 题目重述

完成三个程序,分别是双向队列,随机队列,和随机队列读取文本并输出k个数。

2. 分析

2.1 双向队列

题目的性能要求是,操作时间O(1),内存占用最大48n+192byte。

当使用单向链表时,尾端删除需要从链表头遍历,才能知道新的链表头,操作时间无法满足。

当使用变长数组时,当头尾均为1/4时,内存使用为~56N,不满足情况。

选用双向链表实现。

2.2 随机队列

题目性能要求时,操作时间O(1), 内存占用最大48n+192byte。

由于是随机操作,所以链表不适用,链表只能遍历,不能随机访问,操作时间无法满足。

使用变长数组,数组可以随机访问,占用内存为~8N到~32N,满足题目要求。

但是但是,数组不能从中间删除内容,这个地方卡了我很久,最后看了书上的提示才想到。这里存在了思维定式,考虑题目要求,这个随机队列不存在对内容顺序的需求,所以不需要维护队列的顺序。数组虽然不能从中间删除,但是可以删除末尾元素,这就意味着,只需要将末尾数据拷贝到当前位置,并缩短实际元素的长度,也就删除了此元素。

2.3 队列读取并输出

这里就是建立一个随机队列,然后enqueue,再dequeue k个就好了。这个思路无法完成extra的要求,关于extra如何实现见下文。

3. 实现

具体实现见代码DequeRandomizedQueuePermutation

下面分析自己在实现中的bug。

3.1 双向队列

  1. 第一遍实现在插入和删除时没有更新size。只会照葫芦画葫芦,教程里没讲的就不会写
  2. 在只有一个元素时,删除头部指针没有更新尾部指针,删除尾部也没更新头部。造成访问溢出。

3.2 随机队列

  1. 首先,思维定式,看了queue的变长数组实现,总觉得随机队列需要记录真实数据的头、尾位置。然而实际上随机队列删除元素的方式和队列不同,即使从头部删除文件,也不会使数组在前侧有未使用的元素。
  2. dequeue时没有考虑内存缩减。在内存缩减是,最开始比较的是N和size的大小,这俩就是一个啊!!实际应该比较的是申请的数组的大小和N的大小。
  3. 删除元素时,应该将S[N - 1]的内存拷贝到被删除的位置,不是S[N]!数组是从0开始的啊!退群吧

至此,已经可以拿到100分了。可喜可贺可喜可贺。

4. extra

extra是针对随机队列读取并输出k个数的,这里要求随即队列的对象数目仅仅为k。按照之前思路2.3的分析,若输入队列拥有n个对象,则随机队列中对象数目为n,不满足要求。

具体使用的方法是使用水塘抽样

我在查了资料之后将理应有的分析写一下,期望自己以后能有这么清晰的思路。

  1. 最后从队列中输出k个数,也就意味着每个数被输出的概率为$k/n$。
  2. 那么将每个读取的数目按照$k/n$的概率加入到队列中,(自己能做到这一步就够了,这次是脑子里什么都没有)。
  3. 但是这里n不知道。之后就是数学方法了,这个我只能看懂,确实不知道怎么推的。概率学的不好

Deques and Randomized Queues的更多相关文章

  1. Programming Assignment 2: Deques and Randomized Queues

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

  2. Programming Assignment 2: Randomized Queues and Deques

    实现一个泛型的双端队列和随机化队列,用数组和链表的方式实现基本数据结构,主要介绍了泛型和迭代器. Dequeue. 实现一个双端队列,它是栈和队列的升级版,支持首尾两端的插入和删除.Deque的API ...

  3. AlgorithmsI PA2: Randomized Queues and Deques RandomizedQueue

    RandomizedQueue 有几个关键点: 1. 选择合适的数据结构,因为需要任意位置删除元素,Linked list 做不到,必须使用resizing arrays. 2. resizing 的 ...

  4. AlgorithmsI PA2: Randomized Queues and Deques Subset

    本题的bonus是 因此方法是queue的size 达到了K, 就停止增加元素,保证queue.size() 最大时只有k. Java code: import edu.princeton.cs.al ...

  5. AlgorithmsI PA2: Randomized Queues and Deques Deque

    本次作业考察利用array 或者linked list 实现规定时间复杂度的queue 和stack, 不能使用java 自带的stack 和queue. 目的是让我们掌握自己设计的函数的复杂度. D ...

  6. 2. An Array of Sequences

    1. Overview of Built-In Sequences Container sequences: list, tuple, and collections.deque can hold i ...

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

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

  8. [LeetCode] Implement Stack using Queues 用队列来实现栈

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  9. Ring buffers and queues

    Ring buffers and queues The data structure is extremely simple: a bounded FIFO. One step up from pla ...

随机推荐

  1. JobConf

    /**  * A map/reduce job configuration. * 翻译:一个map/reduce作业配置 * <p><code>JobConf</code ...

  2. 【每日Scrum】第三天(4.24) TD学生助手Sprint2站立会议

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 今天主要看了多事件处理的内容然后改了下界面, 和小楠重写架构,使代码更加简洁,并增加了几个界面 架构太难,数据库字段总出问题 Y 刘静 添加事 ...

  3. windows下taskkill命令简介

    1.简介 使用该工具可以按照进程 ID (PID) 或映像名称终止任务. 2.语法 TASKKILL [/S system [/U username [/P [password]]]]        ...

  4. Qt Creator设置黑色主题背景

    黑色的主题看起来比較炫酷一点.也有人说黑色主题用起来对眼睛好.只是个人感觉然并卵,依据自己的习惯爱好设置就好. 假设想保护眼睛,还是将屏幕调到合适的亮度,不要太暗.自己眼睛认为舒服最好.也能够通过&q ...

  5. YUV格式

    http://blog.csdn.net/u011270282/article/details/50696616 http://blog.csdn.net/acs713/article/details ...

  6. ORACLE 查看表结构

    select table_name from user_tables; //当前用户的表 select table_name from all_tables; //所有用户的表 select tabl ...

  7. 第 3 章 第 1 题 精简冗余 if 语句问题 使用数组实现

    问题分析 输入:用户个人收入 输出:该用户要缴纳的个人所得税 约束:不允许使用过多的 if 语句 解答思路 最简单的方法是根据不同的税率区间,创建多个 if 语句来求解.但如此一来便会有 25 个 i ...

  8. easyui datagrid 加载静态文件中的json数据

    本文主要介绍easyui datagrid 怎么加载静态文件里的json数据,开发环境vs2012, 一.json文件所处的位置 二.json文件内容 {"total":28,&q ...

  9. ABAP 日期栏函数

    在SZC这个中有很多日期函数可以研究借鉴   ABAP - 日期格式转换 现在提供以下一些日期格式转换的函数: Below are several FMs which can be used to c ...

  10. Oracle rac 配置Weblogic数据源时 实例名及URL的选择

    Oracle 10G 是 RAC 的,即有两个节点.两个节点 IP及实例名分别为:10.1.43.11 stnic110.1.43.21 stnic2配置数据源时 一直使用的是第一个 URL 及 实例 ...