Programming Assignment 2: Deques and Randomized Queues

實現(xiàn)一個泛型的雙端隊列和隨機化隊列塘雳,用數(shù)組和鏈表的方式實現(xiàn)基本數(shù)據(jù)結(jié)構录煤,主要介紹了泛型和迭代器壳澳。

Dequeue. 實現(xiàn)一個雙端隊列罩息,它是棧和隊列的升級版嗤详,支持首尾兩端的插入和刪除。Deque的API如下

deque的操作實現(xiàn)必須是常數(shù)時間瓷炮,使用空間是當前元素個數(shù)葱色,迭代器的實現(xiàn)next()和hasNext()操作也是常數(shù)時間和常數(shù)空間,所以Deque采用Linked-list實現(xiàn)方式.

private class Node {
    private Item item;
    private Node prev;
    private Node next;
}

雙端隊列使用Linked-List實現(xiàn),那么使用一個哨兵sentinel來輔助實現(xiàn)Deque娘香,這在Programming Tricks and Common Pitfalls中有講到苍狰,每個Assignment中checklist的內(nèi)容對于理解和實現(xiàn)有很大幫助。

使用哨兵指向deque的隊首元素烘绽,而隊尾元素指向哨兵淋昭,現(xiàn)在我們來分析每個方法實現(xiàn)。

Deque(): 初始Deque沒有元素安接,元素個數(shù)為0翔忽,那么哨兵的prev和next也都指向自身。
addFirst(): 隊首添加元素時候,就是簡單的鏈表操作在sentinel和第一個Node之間插入一個新的Node歇式,并記得把元素個數(shù)加1.
addLast(): 同理
removeFirst(): 首先要判斷驶悟,deque是否為空,能否支持刪除操作材失,可以的話痕鳍,刪除首元素,更新第二個元素和sentinel之間的關系龙巨,然后元素個數(shù)減1
removeLast(): 同理
isEmpty()和size(): 用一直維護元素個數(shù)變量來進行操作

迭代器Iterator的操作也十分簡單了, 我們只需要獲取sentinel哨兵笼呆,然后遍歷就可以實現(xiàn)。hasNext()直到下一個元素又走回了sentinel哨兵旨别,那么我們就已經(jīng)遍歷完了所有元素诗赌。

Randomized queue. 隨機化隊列也和棧和隊列十分相似,區(qū)別在于它的remove操作是隨機刪除隊列中的一個元素昼榛。API如下:

public class RandomizedQueue<Item> implements Iterable<Item> {
   public RandomizedQueue()                 // construct an empty randomized queue
   public boolean isEmpty()                 // is the queue empty?
   public int size()                        // return the number of items on the queue
   public void enqueue(Item item)           // add the item
   public Item dequeue()                    // delete and return a random item
   public Item sample()                     // return (but do not delete) a random item
   public Iterator<Item> iterator()         // return an independent iterator over items in random order
   public static void main(String[] args)   // unit testing
}

Randomized queue和一般的queue基本操作都是一樣境肾,由于隨機出隊,那入隊元素也不一定按照正常的隊列來使用胆屿,我們只需要把隊列的元素維護在連續(xù)起始開始的一段就可以了奥喻。

那么我們只需要使用一個tail尾指針,當插入元素的時候非迹,把元素直接插入在隊尾:

public void enqueue(Item item) {
    if (item == null)
        throw new java.lang.NullPointerException("can't add a null item");
    if (N == q.length) resize(2*q.length);
    q[tail++] = item;
    N++;
}


public Item dequeue() {
    if (isEmpty())
        throw new java.util.NoSuchElementException("underflow");
    
    int index = StdRandom.uniform(N);
    Item item = q[index];
    //because random, just simply put q[tail-1] to q[index]
    q[index] = q[--tail];
    q[tail] = null;
    N--;
    if (N > 0 && N == q.length/4) resize(q.length/2);
    
    return item;
}

迭代器的操作环鲤,不能需改原來的元素,需要重新申請空間憎兽,隨機化的出隊思考起來也很簡單冷离,我們使用Elementary Sort中介紹的Shuffle的方法來對元素重新組合一下

for (int i = 0; i < N; i++) {
    int r = StdRandom.uniform(i+1);
    Item tmp = array[i];
    array[i] = array[r];
    array[r] = tmp;
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纯命,隨后出現(xiàn)的幾起案子西剥,更是在濱河造成了極大的恐慌,老刑警劉巖亿汞,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞭空,死亡現(xiàn)場離奇詭異,居然都是意外死亡疗我,警方通過查閱死者的電腦和手機咆畏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吴裤,“玉大人旧找,你說我怎么就攤上這事÷笪” “怎么了钮蛛?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵鞭缭,是天一觀的道長。 經(jīng)常有香客問我愿卒,道長缚去,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任琼开,我火速辦了婚禮,結(jié)果婚禮上枕荞,老公的妹妹穿的比我還像新娘柜候。我一直安慰自己,他們只是感情好躏精,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布渣刷。 她就那樣靜靜地躺著,像睡著了一般矗烛。 火紅的嫁衣襯著肌膚如雪辅柴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天瞭吃,我揣著相機與錄音碌嘀,去河邊找鬼。 笑死歪架,一個胖子當著我的面吹牛股冗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播和蚪,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼止状,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了攒霹?” 一聲冷哼從身側(cè)響起怯疤,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎催束,沒想到半個月后集峦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡泣崩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年少梁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矫付。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡凯沪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出买优,到底是詐尸還是另有隱情妨马,我是刑警寧澤挺举,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站烘跺,受9級特大地震影響湘纵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滤淳,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一梧喷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脖咐,春花似錦铺敌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至派歌,卻和暖如春弯囊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胶果。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工匾嘱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稽物。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓奄毡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贝或。 傳聞我的和親對象是個殘疾皇子吼过,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 第十一章 持有對象 Java實用類庫還提供了一套相當完整的容器類來解決這個問題,其中基本的類型是List咪奖、Set盗忱、...
    Lisy_閱讀 800評論 0 1
  • 本文將要介紹的哨兵乌庶,它基于 Redis 主從復制沼溜,主要作用便是解決主節(jié)點故障恢復的自動化問題,進一步提高系統(tǒng)的高可...
    java成功之路閱讀 2,203評論 0 4
  • 1.1 資料 友多,最好的入門小冊子昧捷,可以先于一切文檔之前看闲昭,免費。 作者Antirez的博客靡挥,Antirez維護的R...
    JefferyLcm閱讀 17,056評論 1 51
  • 【始】 這天下既已是沈家天下序矩。 三年了。 太平天下跋破。 【1】 四月初七簸淀。 金鑾殿內(nèi)瓶蝴,青帳間。 “太子租幕,你真要出宮去...
    郁郁秋生閱讀 625評論 0 1
  • 天堂里只有歡笑 ——懷念曾經(jīng)給我鼓勵的故友 我以為 上天會眷戀 每一片特別的云彩 我以為 大海會...
    MAY聆聽詩語閱讀 244評論 1 2