博客
关于我
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/

    你可能感兴趣的文章
    C# WinForm程序退出的方法
    查看>>
    onFailure unexpected end of stream
    查看>>
    Flex 布局的自适应子项内容过长导致其被撑大问题
    查看>>
    PL/SQL 动态Sql拼接where条件
    查看>>
    Lua-table 一种更少访问的安全取值方式
    查看>>
    虚函数
    查看>>
    Error:Cannot read packageName from AndroidManifest.xml
    查看>>
    斐波那契数列两种算法的时间复杂度
    查看>>
    【自学Flutter】4.1 Material Design字体图标的使用(icon)
    查看>>
    C++清空队列(queue)方法
    查看>>
    【换行符】什么时候用cin.get()吃掉输入流中的换行符
    查看>>
    【二叉树】已知后序与中序求先序
    查看>>
    解决Nginx 404 not found问题
    查看>>
    广东外语外贸大学第三届网络安全大赛Writeup
    查看>>
    hadoop 分布式文件系统的计算和高可用
    查看>>
    【Linux】VMware Workstation 不可恢复错误: (vcpu-0)
    查看>>
    VS中 fatal error LNK1123: 转换到 COFF 期间失败 的解决方法
    查看>>
    ant design pro v5去掉右边content区域的水印
    查看>>
    JavaScript——使用iterator遍历迭代map,set集合元素
    查看>>
    Course Schedule II
    查看>>