基于java的數據結構學習——數組實現的隊列和循環隊列及性能對比

隊列 Queue

  • 隊列也是一種線性結構
  • 相比數組,隊列對應的操作是數組的子集
  • 只能從一端(隊尾)添加元素,只能從另一端(隊首)取出元素
  • 隊列是一種先進先出的數據結構

隊列的實現及復雜度分析

Queue<E>

  • void enqueu(E)
  • E dequeue()
  • E getFront()
  • int getSize()
  • boolean isEmpty()

數組隊列的復雜度分析

ArrayQueue<E>

  • void enqueue(E)? ? ?O(1) 均攤
  • E dequeue()? ? ? ? ? ? O(n)?
  • E getFront()? ? ? ? ? ? ?O(1)
  • int getSize()? ? ? ? ? ? ?O(1)
  • boolean isEmpty()? ?O(1)

代碼實現:

public class ArrayQueue<E> implements Queue<E> {private Array<E> data;public ArrayQueue(int Capacity){data = new Array<>(Capacity);}public ArrayQueue(){this(10);}@Overridepublic int getSize(){return data.getSize();}public int getCapacity(){return data.getCapacity();}@Overridepublic boolean isEmpty(){return data.isEmpty();}@Overridepublic void enqueue(E e){data.addLast(e);}@Overridepublic E dequeue(){return data.removeFirst();}@Overridepublic E getFront(){return data.getFirst();}@Overridepublic String toString(){StringBuilder res = new StringBuilder();res.append("Queue : front [");for (int i = 0; i < data.getSize(); i++) {res.append(data.get(i));if (i != data.getSize() - 1)res.append(", ");}res.append("] tail");return res.toString();}public static void main(String[] args){ArrayQueue<Integer> queue = new ArrayQueue<>();for(int i = 0 ; i < 10 ; i ++){queue.enqueue(i);System.out.println(queue);if(i % 3 == 2){queue.dequeue();System.out.println(queue);}}}
}

循環隊列的復雜度分析

LoopQueue<E>

  • void enqueue(E)? ? ?O(1) 均攤
  • E dequeue()? ? ? ? ? ? O(1) 均攤?
  • E getFront()? ? ? ? ? ? ?O(1)
  • int getSize()? ? ? ? ? ? ?O(1)
  • boolean isEmpty()? ?O(1)

front == tail? ? ? ? ? ? ? ? 隊列為空

(tail + 1) % c = front? 隊列已滿

tail不用于存儲元素,capacity中浪費一個空間?

代碼實現:


public class LoopQueue<E> implements Queue<E> {private E[] data;private int front, tail;private int size;public LoopQueue(int capacity){data  = (E[])new Object[capacity + 1];front = 0;tail  = 0;size  = 0;}public LoopQueue(){this(10);}@Overridepublic boolean isEmpty(){return size == 0;}public boolean isFull(){return front == (tail + 1) % data.length;}public int getCapacity(){return data.length - 1;}@Overridepublic int getSize(){return size;}@Overridepublic void enqueue(E e){if (isFull())resize(getCapacity() * 2 + 1);data[tail] = e;tail = (tail + 1) % data.length;size++;}@Overridepublic E dequeue(){if (isEmpty())throw new IllegalArgumentException("Dequeue Failed.Queue is empty.");E ret = data[front];data[front] = null;front = (front + 1) % data.length;size--;if (size == getCapacity() / 4 && getCapacity() / 2 != 0)resize(getCapacity() / 2 + 1);return ret;}@Overridepublic E getFront(){if (isEmpty())throw new IllegalArgumentException("Queue is empty.");return data[front];}public void resize(int newCapacity){if (newCapacity <= 0)throw new IllegalArgumentException("newCapacity is Illegal.");E[] newData = (E[])new Object[newCapacity];for (int i = 0; i < size; ++i)newData[i] = data[(i + front) % data.length];data = newData;front = 0;tail = size;}@Overridepublic String toString(){StringBuilder res = new StringBuilder();res.append(String.format("LoopQueue Capacity = %d, Size = %d\n", getCapacity(), getSize()));res.append("front [");for (int i = front; i != tail; i = (i + 1) % data.length){res.append(data[i]);if ((i + 1) % data.length != tail)res.append(", ");}res.append("] tail");return res.toString();}public static void main(String[] args) {LoopQueue<Integer> queue = new LoopQueue<>();for (int i = 0; i < 10; i++) {queue.enqueue(i);System.out.println(queue);if (i % 3 == 2) {queue.dequeue();System.out.println(queue);}}}
}

性能比較:

測試函數:

// 測試使用q運行opCount個enqueueu和dequeue操作所需要的時間,單位:秒private static double testQueue(Queue<Integer> q, int opCount){long startTime = System.nanoTime();for (int i = 0; i < opCount; ++i)q.enqueue(i);for (int i = 0; i < opCount; ++i)q.dequeue();long endTime = System.nanoTime();return (endTime - startTime) / 1000000000.0;}

測試:

    public static void main(String[] args){int opCount = 100000;ArrayQueue<Integer> arrayQueue = new ArrayQueue<>();double timeArray = testQueue(arrayQueue, opCount);System.out.println("ArrayQueue time :" + timeArray + " s");LoopQueue<Integer> loopQueue = new LoopQueue<>();double timeQueue = testQueue(loopQueue, opCount);System.out.println("LoopQueue time :" + timeQueue + " s");}

運行結果:

在10^5數量級上,我的這臺電腦上,所展現性能差異還是很明顯的,由于數組隊列的出隊操作是 O(n) 級別,消耗了大量的時間。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448150.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448150.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448150.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新手如何準確的控制油門

日常練車還不賴&#xff0c;可是一換車就容易加大油門兒&#xff0c;有啥子辦法能美好的扼制油呢?和調的坐位有關系嗎? 答&#xff1a;油門兒跟剎車被視為交通工具扼制的魂靈。交通工具引擎發動機的油門兒&#xff0c;通常是靠踏板來扼制的&#xff0c;也稱加速踏板&#xff…

vue 項目:文件夾 結構 、配置詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 項目配置 首先&#xff0c;在確定好使用的框架和組件庫后&#xff0c;先要大致了解它們&#xff0c;做到文檔基本熟悉。本次開發使用…

hdoj2553(N皇后問題)

Problem : 2553 ( N皇后問題 ) Judge Status : Accepted RunId : 2619754 Language : G Author : huwenbiao Code Render Status : Rendered By HDOJ G Code Render Version 0.01 Beta/***************************************************************\ *Author:Hu…

基于java的數據結構學習——數組實現的棧以及簡單應用C++實現

基于java的數據結構學習——數組實現的棧以及簡單應用的 C 實現 源碼&#xff1a; // // Created by PC-Saw on 2019/1/3. //#ifndef DATA_STRUCTURE_ARRAYSTACK_H #define DATA_STRUCTURE_ARRAYSTACK_H#include "Stack.h" #include "MyArray.h"template&…

女性開車5大安全駕車好習慣 為您支招

一些女性車主技術不夠熟練&#xff0c;緊急處理能力差&#xff0c;開車過程中需要注意更多的細節。養成一些好習慣&#xff0c;對于女性車主來說&#xff0c;開車的安全度會大大提高。 ● 車窗上不掛毛絨玩具 汽車是生活的一部分空間&#xff0c;許多女性車主都喜歡把這部分空間…

DIV 半透明層、 CSS實現網頁 背景半透明

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 DIV半透明實現&#xff0c;使用CSS實現DIV成半透明效果&#xff0c;CSS實現層與背景半透明效果。 一、DIV CSS半透明基礎介紹 - …

node 安裝 webpack

首先要安裝 Node.js&#xff0c; Node.js 自帶了軟件包管理器 npm&#xff0c;Webpack 需要 Node.js v0.6 以上支持&#xff0c;建議使用最新版 Node.js。 用 npm 安裝 Webpack&#xff1a; $ npm install webpack -g此時 Webpack 已經安裝到了全局環境下&#xff0c;可以通過命…

Thinking in C++遇到的函數指針及應用

// // Created by PC-Saw on 2019/1/24. //#include <iostream>#define TEST 2/* 1. */ typedef int* (*(*fp1)(int))[10]; // 首先是一個函數指針&#xff0c;接受一個int型參數&#xff0c;返回一個指向10個int指針數組的指針 /* 2. */ typedef i…

html 標簽內背景圖片自適應 div 大小

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 只需通過css設置background-size屬性為contain&#xff0c;即 background-size:contain 注意&#xff1a;一定要在先設置background之…

Code Project精彩系列(轉)

Code Project精彩系列&#xff08;轉&#xff09; Applications Crafting a C# forms Editor From scratch http://www.codeproject.com/csharp/SharpFormEditorDemo.asp 建立一個類似C#的環境, 實現控件拖拉&#xff0c;屬性 Packet Capture and Analayzer 網絡封包截獲 http…

加速時如何換擋

加速時如何換擋&#xff0c;您知道嗎?為了使換擋過程順利進行&#xff0c;變速器內齒輪平穩嚙合&#xff0c;必須掌握好發動機轉速&#xff0c;在適當時機推動變速桿操縱齒輪嚙合。為此&#xff0c;要通過反復練習&#xff0c;一邊踩踏油門踏板&#xff0c;一邊聽發動機運轉聲…

C++ 學習雜談:sizeof和sizeof(string)的問題

最近遇到一個令我困惑的問題&#xff0c;就是 sizeof&#xff08;string&#xff09;的值&#xff0c;之前在vs2010上測得是固定28&#xff0c;最近在用CLion&#xff0c;上面測得是4&#xff0c;出現了不一樣的結果&#xff0c;我又在vs2013上試了一下&#xff0c;結果又不一樣…

vue 項目 引用(外部) js、css

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我的工程結構&#xff1a; 1. 引入 css 有 2 種方式&#xff1a; 方式 1 <script type"text/javascript">import .…

FAQ:Container Classes篇

1、Why should I use container classes rather than simple arrays?&#xff08;為什么應該使用容器類而不是簡單的數組&#xff1f;&#xff09; In terms of time and space, a contiguous array of any kind is just about the optimal construct for accessing a sequen…

自動擋車擋位的基本知識介紹

一般來說&#xff0c;自動檔汽車的自動變速器的檔位分為P、R、N、D、2 (或S)、L(或1)等。下面分別詳細介紹如下&#xff1a; P (Parking) 停車檔&#xff0c;或稱泊車檔&#xff1a; P用作停車之用&#xff0c;它是利用機械裝置去鎖緊汽車的轉動部分&#xff0c;使汽車不能移動…

Java 強引用、弱引用、軟引用、虛引用

1、強引用&#xff08;StrongReference&#xff09; 強引用是使用最普遍的引用。如果一個對象具有強引用&#xff0c;那垃圾回收器絕不會回收它。如下&#xff1a; Object onew Object(); // 強引用 當內存空間不足&#xff0c;Java虛擬機寧愿拋出OutOfMemoryError錯誤…

解決:(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8082 -j DNAT --to-destin

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 用 docker 部署一個前端工程&#xff0c;run 后容器有了&#xff0c;卻不是運行狀態&#xff0c;是創建狀態&#xff0c;于是我執行 …

在DOS命令行執行MYSQL語句

最近有個工作需要從MSSQL庫中取數據然后導入SQL 2005。由于之前曾經做過利用BCP導入SQL&#xff0c;因此想借助這個工具實現此功能。 在探索過程中&#xff0c;好像發現MYSQL不能想SQL那樣有OSSQL這樣的外部命令。因此想到利用MYSQL執行文件內容的功能來生成導出數據。&#xf…

無損壓縮——Huffman編碼

最近項目中涉及到人臉關鍵點中神經網絡的壓縮&#xff0c;采用了性能較好的哈夫曼編碼進行。 源碼地址&#xff1a;https://github.com/believeszw/HuffmanCompress 1 引言 哈夫曼&#xff08;Huffman&#xff09;編碼算法是基于二叉樹構建編碼壓縮結構的&#xff0c;它是數據…

26條安全開車經驗 開車20年老司機分享

總有些人&#xff0c;覺得自己開車技術比舒馬赫牛叉&#xff0c;市區高速漂移無比瀟灑。也總有些人&#xff0c;覺得路是自家的鋪的&#xff0c;愛怎么開就怎么開&#xff0c;愛停哪就停哪&#xff0c;哪個不服打開車窗就是一句國罵一個中指。其實他們都沒有意識到&#xff0c;…