生成磁盤文件用以位向量排序

第一章“開篇”圍繞一個(gè)“如何給磁盤文件排序邦鲫?”的問(wèn)題展開灸叼。

具體描述是:
有一個(gè)磁盤文件,其最多包含n個(gè)正整數(shù)庆捺,每個(gè)整數(shù)一行怜姿,每個(gè)數(shù)都小于n,n=10^7疼燥,無(wú)重復(fù)整數(shù)出現(xiàn)沧卢。

而我們沒(méi)有這樣的一個(gè)文件,這意味著這章之后的一切實(shí)踐都無(wú)法進(jìn)行醉者。這是閱讀本書碰到的第一個(gè)必須解決的問(wèn)題但狭。

問(wèn)題細(xì)化與思路

由于Java編碼經(jīng)驗(yàn)不足,大多數(shù)處理都要靠查文檔撬即,分析問(wèn)題層面亦會(huì)比較注重Java語(yǔ)言本身立磁。

我打算使用Java的一個(gè)list(稱為s)結(jié)構(gòu)通過(guò)循環(huán)for(0-10^7)來(lái)向s塞入相應(yīng)的數(shù)字,此操作不會(huì)引入重復(fù)的整數(shù)剥槐。
使用隨機(jī)去掉s中的20~50個(gè)元素(這里有兩個(gè)隨機(jī)數(shù)唱歧,一個(gè)是要去掉的元素的個(gè)數(shù),另一個(gè)是要去掉元素的位置)粒竖,最后通過(guò)選取隨機(jī)下標(biāo)將該元素pop出s并寫入文件颅崩。

主要涉及到編碼方面的以下幾點(diǎn):

  1. 使用Java創(chuàng)建文件寫入內(nèi)容;
  2. 選擇一種合適list類蕊苗,可以根據(jù)下標(biāo)訪問(wèn)并pop元素沿后;
  3. 隨機(jī)數(shù)生成器的使用方法;

代碼

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Random;

public class GenerateNumberFile {

    private final static int MAX_NUMBER = 10000000;

    public static void main(String[] args) throws IOException {
        // 生成1-10^7的int list.
        Random r = new Random();
        ArrayList<Integer> s = new ArrayList<>();
        for (int i = 0; i < MAX_NUMBER; i++) {
            s.add(i+1);
        }
        // System.out.println(s.size());
        int sLen = s.size();
        // 去掉20~50個(gè)元素.
        int removeCount = r.nextInt(30) + 20; // 生成20~49之間的一個(gè)整數(shù)朽砰;
        System.out.println("now we remove " + removeCount + " item");
        while (removeCount>0) {
            int removeIndex = r.nextInt(sLen);
            s.remove(removeIndex);
            removeCount--;
            sLen--;
        }
        PrintWriter writer = new PrintWriter("lot-number.txt", "UTF-8");
        while (sLen>0) {
            int removeIndex = r.nextInt(sLen);
            int removedItem = s.get(removeIndex);
            writer.println(removedItem);
            s.remove(removeIndex);
            sLen--;
            System.out.println(sLen);
        }
        writer.close();
    }
}

這里使用ArrayList來(lái)存儲(chǔ)數(shù)字尖滚,其.get(index).remove(index)方法可以實(shí)現(xiàn)根據(jù)下標(biāo)位置的取值與pop。
而Random類的實(shí)例r使用.nextInt()方法時(shí)接受一個(gè)參數(shù)k瞧柔,可生成0至k-1之間的隨機(jī)整數(shù)漆弄,比較難受的寫法是要生成20~50間的隨機(jī)整數(shù)竟然要int removeCount = r.nextInt(30) + 20;,不知有沒(méi)有更直接一點(diǎn)的api啊造锅。
最后寫文件用到了PrintWriter類撼唾,其亦有println方法,讓人想到了重定向备绽,還蠻有意思的券坞。

性能問(wèn)題

該程序可以按需求生成lot-number.txt的磁盤文件。
可問(wèn)題是肺素,它太慢了恨锚,跑了2個(gè)小時(shí)左右才跑完。

ArrayList是數(shù)組結(jié)構(gòu)而不是鏈表倍靡,雖然取值為O(1)猴伶,而remove元素,則需要將它之后的元素進(jìn)行搬運(yùn)塌西,此為O(n)操作他挎。
而若使用鏈表的話,則.get(index)為O(n)捡需。
這里暫時(shí)難以兩全办桨。

同時(shí),nextInt()方法好像也不夠快站辉。
那是否是生成隨機(jī)數(shù)占用了大量的時(shí)間呢呢撞?這個(gè)易于測(cè)試:

public static void main(String[] args) {
        Random r = new Random();
        int j = 0;
        for (int i=0; i<10000000; i++) {
            System.out.println(i);
            r.nextInt(10000000-j);
            j++;
        }
    }

這段代碼運(yùn)行在40秒左右,雖然也不快(打印會(huì)占用不少時(shí)間)饰剥,但這并不是將程序運(yùn)行拖至兩個(gè)小時(shí)的因素殊霞。

回頭再來(lái)優(yōu)化這個(gè)問(wèn)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汰蓉,一起剝皮案震驚了整個(gè)濱河市绷蹲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌顾孽,老刑警劉巖祝钢,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異若厚,居然都是意外死亡太颤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門盹沈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)龄章,“玉大人,你說(shuō)我怎么就攤上這事乞封∽鋈梗” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵肃晚,是天一觀的道長(zhǎng)锚贱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)关串,這世上最難降的妖魔是什么拧廊? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任监徘,我火速辦了婚禮,結(jié)果婚禮上吧碾,老公的妹妹穿的比我還像新娘凰盔。我一直安慰自己,他們只是感情好倦春,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布户敬。 她就那樣靜靜地躺著,像睡著了一般睁本。 火紅的嫁衣襯著肌膚如雪尿庐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天呢堰,我揣著相機(jī)與錄音抄瑟,去河邊找鬼。 笑死枉疼,一個(gè)胖子當(dāng)著我的面吹牛锐借,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播往衷,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钞翔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了席舍?” 一聲冷哼從身側(cè)響起布轿,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎来颤,沒(méi)想到半個(gè)月后汰扭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡福铅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年萝毛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滑黔。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笆包,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出略荡,到底是詐尸還是另有隱情庵佣,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布汛兜,位于F島的核電站巴粪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肛根,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一辫塌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧派哲,春花似錦臼氨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巢寡。三九已至喉脖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抑月,已是汗流浹背树叽。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谦絮,地道東北人题诵。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像层皱,于是被迫代替她去往敵國(guó)和親性锭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,383評(píng)論 0 5
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法叫胖,類相關(guān)的語(yǔ)法草冈,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法瓮增,異常的語(yǔ)法怎棱,線程的語(yǔ)...
    子非魚_t_閱讀 31,631評(píng)論 18 399
  • 三年三班黃佳瑞讀書時(shí)間30分鐘,媽媽陪讀30分鐘绷跑。
    蝴蝶_7e51閱讀 186評(píng)論 0 0
  • 男人的浪漫就是洗不盡的童真和江湖情拳恋。
    老張張張張閱讀 164評(píng)論 0 1
  • 困擾了大半年的東西,是該放下了砸捏,讓自己輕松的度過(guò)之后的大學(xué)生活谬运,不也挺好嗎,沒(méi)有誰(shuí)對(duì)誰(shuí)錯(cuò)垦藏,只要秉持那顆火熱的心吩谦,就足矣~
    185不高冷閱讀 189評(píng)論 0 0