双端队列、随机队列、蓄水池抽样算法

本文介绍了双端队列(Deque)的概念及其在工作密取模式中的应用,解释了其常数时间操作的实现原理。接着讨论了随机队列(Randomized Queue),通过可动态调整大小的数组实现,支持随机访问和元素抽取。最后,讲解了蓄水池抽样算法(Reservoir Sampling),这是一种在数据流中进行随机抽样的方法,保证了每个元素被抽取的等概率性。
摘要由CSDN通过智能技术生成

双端队列(Double-ended Queue)

双端队列(Deque),读为“deck”,是一种类似于队列的元素的有序集合。
它拥有两端,队首和队尾,支持在两端插入和移除元素。
在某种意义上,这种混合的线性结构同时具有栈和队列的性质。
因此做双端操作可用于先入先出队列(FIFO), 做单端操作可做为下压栈(LIFO)。
这里写图片描述

场景:

正如阻塞队列适用于生产者-消费者模式,双端队列同样适用于另一种相关模式,即工作密取(Work Stealing)。在生产者-消费者设计中,所有消费者有一个共享的工作队列,而在工作密取设计中,每个消费者都有各自的双端队列。如果一个消费者完成了自己的双端队列中的全部工作,那么它可以从其它消费者双端队列末尾秘密地获取工作。密取工作模式比传统的生产者-消费者模式具有更高的可伸缩性,这是因为工作者线程不会在单个共享的任务队列上发生竞争。在大多数时候,它们都只是访问自己的双端队列,从而极大地减小了竞争。当工作者线程需要访问另一个队列时,它会从队列的尾部而不是头部获取工作,因此进一步降低了队列上的竞争程度。

https://book.douban.com/annotation/31593287/

Java 实现的 Deque的体系结构图中可以看到,实现一个 Deque 可以使用数组(ArrayDeque),同时也可以使用链表(LinkedList),还可以同实现一个支持阻塞的线程安全版本队列 LinkedBlockingDeque。

要求 deque 增删操作为常数时间 O(1),因此采用双向链表实现。

- Deque Randomized Queue
Non-iterator operations Constant worst-case time Constant amortized time
Iterator constructor Constant worst-case time linear in current # of items
Other iterator operations Constant worst-case time Constant worst-case time
Non-iterator memory use Linear in current # of items Linear in current # of items
Memory per iterator Constant Linear in current # of items

头尾增加哨兵指针,简化边界处理。

内存占用分析:

public class Deque<Item> implements Iterable<Item> {
   
    private Node header;    // 48 bytes
    private Node trailer;   // 48 bytes
    private int n;          // 4 bytes

                            // 16 bytes (object overhead)
    private class Node {
       // 8 bytes (inner class extra overhead)
        private Item item;  // 8 bytes (reference to String)
        private Node next;  // 8 bytes (reference to Node)
        private Node prev;  // 8 bytes (reference to Node)
    }                       // --------------------
                            // 48 bytes per node

Deque.java

/******************************************************************************
 *  Compilation:  javac-algs4 Deque.java
 *                checkstyle-algs4 Deque.java
 *                findbugs-algs4 Deque*.class
 *  Execution:    java-algs4 Deque < tobe.txt
 *  Dependencies: None
 *
 *  A generic deque, implemented using a double linked list and two dummy
 *  nodes.
 *
 *  % more tobe.txt 
 *  to be or not to - be - - that - - - is
 *
 *  % java-algs4 Deque < tobe.txt
 *  to be not that or be (2 left on deque)
 *
 ******************************************************************************/
import java.util.Iterator;
import java.util.NoSuchElementException;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class Deque<Item> implements Iterable<Item> {
   
    private Node header;    // 48 bytes
    private Node trailer;   // 48 bytes
    private int n;          // 4 bytes

                            // 16 bytes (object overhead)
    private class Node {
       // 8 bytes (inner class extra overhead)
        private Item item;  // 8 bytes (reference to String)
        private Node next;  // 8 bytes (reference to Node)
        private Node prev;  // 8 bytes (reference to Node)
    }                       // --------------------
                            // 48 bytes per node

    // construct an empty deque
    public Deque() {
        header = new Node()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值