Deques and Randomized Queues
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. 实现
具体实现见代码Deque,RandomizedQueue,Permutation。
下面分析自己在实现中的bug。
3.1 双向队列
- 第一遍实现在插入和删除时没有更新size。
只会照葫芦画葫芦,教程里没讲的就不会写 - 在只有一个元素时,删除头部指针没有更新尾部指针,删除尾部也没更新头部。造成访问溢出。
3.2 随机队列
- 首先,思维定式,看了queue的变长数组实现,总觉得随机队列需要记录真实数据的头、尾位置。然而实际上随机队列删除元素的方式和队列不同,即使从头部删除文件,也不会使数组在前侧有未使用的元素。
- dequeue时没有考虑内存缩减。在内存缩减是,最开始比较的是N和size的大小,这俩就是一个啊!!实际应该比较的是申请的数组的大小和N的大小。
- 删除元素时,应该将S[N - 1]的内存拷贝到被删除的位置,不是S[N]!数组是从0开始的啊!
退群吧
至此,已经可以拿到100分了。可喜可贺可喜可贺。
4. extra
extra是针对随机队列读取并输出k个数的,这里要求随即队列的对象数目仅仅为k。按照之前思路2.3的分析,若输入队列拥有n个对象,则随机队列中对象数目为n,不满足要求。
具体使用的方法是使用水塘抽样。
我在查了资料之后将理应有的分析写一下,期望自己以后能有这么清晰的思路。
- 最后从队列中输出k个数,也就意味着每个数被输出的概率为$k/n$。
- 那么将每个读取的数目按照$k/n$的概率加入到队列中,(自己能做到这一步就够了,这次是脑子里什么都没有)。
- 但是这里n不知道。之后就是数学方法了,这个我只能看懂,确实不知道怎么推的。概率学的不好
Deques and Randomized Queues的更多相关文章
- Programming Assignment 2: Deques and Randomized Queues
编程作业二 作业链接:Deques and Randomized Queues & Checklist 我的代码:Deque.java & RandomizedQueue.java & ...
- Programming Assignment 2: Randomized Queues and Deques
实现一个泛型的双端队列和随机化队列,用数组和链表的方式实现基本数据结构,主要介绍了泛型和迭代器. Dequeue. 实现一个双端队列,它是栈和队列的升级版,支持首尾两端的插入和删除.Deque的API ...
- AlgorithmsI PA2: Randomized Queues and Deques RandomizedQueue
RandomizedQueue 有几个关键点: 1. 选择合适的数据结构,因为需要任意位置删除元素,Linked list 做不到,必须使用resizing arrays. 2. resizing 的 ...
- AlgorithmsI PA2: Randomized Queues and Deques Subset
本题的bonus是 因此方法是queue的size 达到了K, 就停止增加元素,保证queue.size() 最大时只有k. Java code: import edu.princeton.cs.al ...
- AlgorithmsI PA2: Randomized Queues and Deques Deque
本次作业考察利用array 或者linked list 实现规定时间复杂度的queue 和stack, 不能使用java 自带的stack 和queue. 目的是让我们掌握自己设计的函数的复杂度. D ...
- 2. An Array of Sequences
1. Overview of Built-In Sequences Container sequences: list, tuple, and collections.deque can hold i ...
- Coursera Algorithms Programming Assignment 2: Deque and Randomized Queue (100分)
作业原文:http://coursera.cs.princeton.edu/algs4/assignments/queues.html 这次作业与第一周作业相比,稍微简单一些.有三个编程练习:双端队列 ...
- [LeetCode] Implement Stack using Queues 用队列来实现栈
Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...
- Ring buffers and queues
Ring buffers and queues The data structure is extremely simple: a bounded FIFO. One step up from pla ...
随机推荐
- django(一)--- 安装django
准备好虚拟环境:Python开发虚拟环境 安装前的准备 1. 下载django:django下载 本文使用的是django-1.5.9(不同版本号之间的差别还是比較大的.别搞错了) 2.准备djang ...
- FTPClient listFiles 阻塞问题
Android端使用 FTPClient 实现上传文件到到filezilla server(filezilla server部署在阿里云服务器)出现 listFiles阻塞.具体的现象是 Ftp Cl ...
- linux c语言 select函数使用方法
linux c语言 select函数使用方法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<un ...
- Allegro布线基本操作
转:allegro基本步骤 常见问题 cadence16.5中电源线.地线取消飞线显示 目录: 一.Allegro基本技巧 1.关闭电源和地网络的飞线 2.开启特定NET飞线 3.元器件快速对齐(待完 ...
- canvas转盘抽奖的实现(一)
网络上已经有了很多转盘抽奖的代码,但大多是用jQuery插件实现的,其中的原理比较难弄明白,于是自己摸索了一个.最终效果如下: // = totalTime) { stopRotation() ...
- 03 xml封装通信接口
<?php class Response_xml{ /** *按xml方式输出通信 *@param integet $code 状态码 *@param string $message 提示信息 ...
- [iOS] 初探 iOS8 中的 Size Class
本文转载至 http://www.itnose.net/detail/6112176.html 以前和安卓的同学聊天的时候,谈到适配一直是一个非常开心的话题,看到他们被各种屏幕适配折磨的欲仙欲死 ...
- NOTE:rfc5766-turn-server
NOTE:This project is active in Google code: http://code.google.com/p/rfc5766-turn-server/ 启动方法:./tur ...
- 6.JS输出
JavaScript 通常用于操作 HTML 元素. ① document.getElementById(id),可以访问某个 HTML 元素 请使用 "id" 属性来标识 HTM ...
- Python pandas 获取Excel重复记录
pip install pandas pip install xlrd 大量记录的时候,用EXCEL排序处理比较费劲,EXCEL程序动不动就无响应了,用pands完美解决. # We will use ...