博客
关于我
Coursera普林斯顿算法课第二次作业
阅读量:592 次
发布时间:2019-03-12

本文共 1814 字,大约阅读时间需要 6 分钟。

Deque 实现

Deque 是一种双端队列,能够高效地进行队列操作。其实现方式基于 LinkedList 和哨兵节点,提供了 O(1) 时间复杂度的 enqueue 和 dequeue 操作。

代码结构

public class Deque
implements Iterable
{ private int num; private Node first, last; private class Node { Item item; Node next; Node prev; } public Deque() { num = 0; first = last = null; } public boolean isEmpty() { return first == null; } public int size() { return num; } // 更多方法...}

方法实现

  • addFirst: 将元素添加到队列前端。
  • addLast: 将元素添加到队列末尾。
  • removeFirst: 从队列前端移除元素。
  • removeLast: 从队列末尾移除元素。
  • iterator: 提供逐个访问队列元素的迭代器。
  • 示例

    Deque
    dq = new Deque<>();dq.addFirst("I");dq.addFirst("am");dq.addLast("Gals");// 其他操作...for (String s : dq) { System.out.println(s);}

    随机队列实现

    RandomizedQueue 使用动态大小的数组,确保在 dequeue 操作后尽量避免存储已删除的元素。

    基本实现

    public class RandomizedQueue
    implements Iterable
    { private Item[] que; private int num; public RandomizedQueue() { que = (Item[]) new Object[2]; num = 0; } // 更多方法...}

    核心方法

    • enqueue: 通过 resize 调整数组大小,确保有足够空间。
    • dequeue: 随机选择一个位置来移除元素,防止尾端 loitering。

    示例

    RandomizedQueue
    r = new RandomizedQueue<>();// 读取并添加所有输入while (!StdIn.isEmpty()) { String s = StdIn.readString(); r.enqueue(s);}int k = Integer.parseInt(args[0]);// 输出前 k 个唯一元素int count = 0;for (String ss : r) { if (count < k) { System.out.println(ss); count++; } else { break; }}

    排序 demonstrate 实现

    Permutation 类使用 RandomizedQueue 来处理输入并输出指定数量的随机数据。

    方法描述

  • RandomizedQueue 对于处理动态大小的队列非常方便。
  • enqueue 操作允许多个输入元素。
  • dequeue 操作通过随机选择确保每个元素独立访问。
  • 错误处理

    • 避免直接调用 StdIn.readAllStrings。
    • 避免不必要的性能开销。

    总结

    这些实现展示了如何在 Java 中高效地处理队列和随机数据。Deque 和 RandomizedQueue 各具特色,前者并发处理,后者防止 loitering。Permutation 类则结合了这两者的优势,确保输出符合要求。

    转载地址:http://lhdxz.baihongyu.com/

    你可能感兴趣的文章
    CSU 1757: 火车入站(区间覆盖的最大覆盖深度)
    查看>>
    C++ Primer Plus读书笔记:循环读取(错误处理)
    查看>>
    《架构师36项修炼》Mysql 异常情况下的事务安全 -- 详解 Mysql redolog
    查看>>
    skimage与cv2 安装失败的解决办法
    查看>>
    linuxmint 上面装谷歌浏览器
    查看>>
    windows/linux下Anaconda管理的(安装的)包的位置
    查看>>
    关于吴恩达的深度学习的一些授课视频里面英文翻译错误的实例展示
    查看>>
    伴随矩阵和逆矩阵的关系证明
    查看>>
    反向传播之矩阵求导dL/dz1的求导过程 普通神经网络的逆向求导过程
    查看>>
    numpy.linspace使用详解
    查看>>
    突破Bias-Variance困境
    查看>>
    CNN / language modelling and sequence generation
    查看>>
    函数可导和可微的区别: 一元中互为充要;多元中可微是可导的必要条件,可导不一定可微。
    查看>>
    一文说尽C++赋值运算符重载函数(operator=)
    查看>>
    Form窗体属性
    查看>>
    IC封装图片大全
    查看>>
    自恢复保险丝的选用
    查看>>
    开关电源 误差放大器电路
    查看>>
    Altium Designer唤出关掉的窗口
    查看>>
    输入过欠压保护电路原理图
    查看>>