算法練習(xí)(42): 隨機(jī)隊(duì)列(1.3.35-1.3.36)

本系列博客習(xí)題來自《算法(第四版)》法希,算是本人的讀書筆記嵌赠,如果有人在讀這本書的瞧哟,歡迎大家多多交流倚舀。為了方便討論,本人新建了一個(gè)微信群(算法交流)谷羞,想要加入的帝火,請?zhí)砑游业奈⑿盘枺簔hujinhui207407 謝謝。另外湃缎,本人的個(gè)人博客 http://www.kyson.cn 也在不停的更新中犀填,歡迎一起討論

算法(第4版)

知識點(diǎn)

  • 鏈表節(jié)點(diǎn)增刪查改
  • Fisher–Yates洗牌算法

題目

1.3.35 隨機(jī)隊(duì)列。隨機(jī)隊(duì)列能夠存儲一組元素并支持下表中的 API嗓违。

API for a generic random queue

編寫一個(gè) RandomQueue 類來實(shí)現(xiàn)這份 API九巡。編寫一個(gè)用例,使用 RandomQueue 在橋牌中發(fā)牌蹂季。


1.3.35 Random queue. A random queue stores a collection of items and supports the following API: Write a class RandomQueue that implements this API. Hint : Use an array representation (with resizing). To remove an item, swap one at a random position (indexed 0 through N-1) with the one at the last position (index N-1). Then delete and return the last ob- ject, as in ResizingArrayStack. Write a client that deals bridge hands (13 cards each) using RandomQueue<Card>.

分析

跟隨機(jī)背包差不多冕广,還是要熟練使用作者提供的StdRandom庫


API for our library of static methods for random numbers

答案

public class RandomQueue<Item> implements Iterable<Item> {
    private Item[] a;
    private int N;

    public RandomQueue() {
        a = (Item[]) (new Object[1]);
        N = 0;
    }

    public boolean isEmpty() {
        return N == 0;
    }

    public int size() {
        return N;
    }

    public void enqueue(Item x) {
        if (N == a.length) {
            this.resize(a.length * 2);
        }
        a[N++] = x;
    }

    public Item dequeue() {
        if (this.isEmpty()) {
            return null;
        }
        if (N == a.length / 4) {
            resize(a.length / 2);
        }
        int index = StdRandom.uniform(N);
        Item x = a[index];
        a[index] = a[--N];
        a[N] = null;
        return x;
    }

    public void resize(int max) {
        Item[] temp = (Item[]) new Object[max];
        for (int i = 0; i < N; i++) {
            temp[i] = a[i];
        }
        a = temp;
    }

    public Item sample() {
        if (this.isEmpty()) {
            return null;
        }
        int index = StdRandom.uniform(N);
        return a[index];
    }

    public Iterator<Item> iterator() {
        return new RandomQueueIterator();
    }
    
    
    public class RandomQueueIterator implements Iterator<Item>{

        private Item[] temp;
        private int index ;
        
        public RandomQueueIterator(){
            temp = (Item[])new Object[N];
            for (int i = 0; i < N; i++)
                temp[i] = a[i];
            
            StdRandom.shuffle(temp);
            index = 0;
        }
        
        public boolean hasNext() {
            return index < N;
        }

        public Item next() {
            return temp[index++];
        }

        public void remove() {
            
        }
        
    }
    
    public static void main(String[] args) {
        RandomQueue<Integer> queue = new RandomQueue<Integer>();
        for (int i = 1; i <= 52; i++)
            queue.enqueue(i);
        
        for (Object object : queue) {
            System.out.println(object);
    }       
}

代碼索引

RandomQueue.java

題目

1.3.36 隨機(jī)迭代器。為上一題中的 RandomQueue<Card> 編寫一個(gè)迭代器偿洁,隨機(jī)返回隊(duì)列中的所有元素撒汉。


1.3.36 Random iterator. Write an iterator for RandomQueue<Item> from the previous exercise that returns the items in random order.

分析

上面一題已經(jīng)寫了答案,這邊再貼出來

答案

public class RandomQueueIterator implements Iterator<Item>{
    private Item[] temp;
    private int index ;
    
    public RandomQueueIterator(){
        temp = (Item[])new Object[N];
        for (int i = 0; i < N; i++)
            temp[i] = a[i];
        
        StdRandom.shuffle(temp);
        index = 0;
    }
    
    public boolean hasNext() {
        return index < N;
    }

    public Item next() {
        return temp[index++];
    }

    public void remove() {
        
    }
    
}       

代碼索引

RandomQueue.java

廣告

我的首款個(gè)人開發(fā)的APP壁紙寶貝上線了涕滋,歡迎大家下載睬辐。

壁紙寶貝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溉委,更是在濱河造成了極大的恐慌,老刑警劉巖爱榕,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓣喊,死亡現(xiàn)場離奇詭異,居然都是意外死亡黔酥,警方通過查閱死者的電腦和手機(jī)藻三,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跪者,“玉大人棵帽,你說我怎么就攤上這事≡幔” “怎么了逗概?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長忘衍。 經(jīng)常有香客問我逾苫,道長,這世上最難降的妖魔是什么枚钓? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任铅搓,我火速辦了婚禮,結(jié)果婚禮上搀捷,老公的妹妹穿的比我還像新娘星掰。我一直安慰自己,他們只是感情好嫩舟,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布氢烘。 她就那樣靜靜地躺著,像睡著了一般家厌。 火紅的嫁衣襯著肌膚如雪威始。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天像街,我揣著相機(jī)與錄音,去河邊找鬼镰绎。 笑死脓斩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畴栖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恋捆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起愤钾,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤候醒,失蹤者是張志新(化名)和其女友劉穎能颁,沒想到半個(gè)月后伙菊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敌土,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年占业,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纯赎。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谦疾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犬金,到底是詐尸還是另有隱情念恍,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布晚顷,位于F島的核電站峰伙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏该默。R本人自食惡果不足惜瞳氓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栓袖。 院中可真熱鬧匣摘,春花似錦、人聲如沸裹刮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捧弃。三九已至赠叼,卻和暖如春擦囊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嘴办。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工瞬场, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涧郊。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓贯被,卻偏偏與公主長得像,于是被迫代替她去往敵國和親底燎。 傳聞我的和親對象是個(gè)殘疾皇子刃榨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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