生成包含隨機數(shù)磁盤文件優(yōu)化

之前寫了生成磁盤文件用以位向量排序
思路很清晰簡單攒岛,程序正確無誤。
但問題是它不夠好用胞锰,太慢了,要跑兩個小時嗅榕。
這和去面試時我的處理很像,看到問題誊册,先給出一個簡單直接暴力而不考慮性能的算法嘗試解決领突。之后面試官會開始要求更好的解法案怯,會對時間、空間復雜度做出限制嘲碱。此時再進一步思考金砍,或許也可以使面試過程更加平滑地進行麦锯。

之前解決這個問題是出于自發(fā),若非如此扶欣,則第一章無法進行下去。
待到了課后題階段料祠,該問題在第4題中被正確地提了出來骆捧。

你將會面對生成小于n且沒有重復的k個整數(shù)的問題髓绽。

題目中提到的簡單的方法是直接使用前k個正整數(shù),這種做法對位排序效率基本無影響顺呕,卻會歪曲調用原生的sort()方法的運行時間枫攀。

之間我的思路是remove掉randomIndex的數(shù)字,訪問與remove總有一個要cost大量時間株茶。
書中的做法明顯聰明很多:
使用int[]結構来涨,訪問效率很高,那么不去remove启盛,僅通過操作下標交換元素值打亂順序即可扫夜。
做兩次遍歷,第一次對各元素遍歷,循環(huán)中random一個index笤闯,將被遍歷的元素與index位置的元素交換位置堕阔,這樣一圈下來,整個數(shù)組即被完全打亂颗味;第二次遍歷即寫入文件超陆,最后留下幾個數(shù)字,就像斗地主接牌最后剩下三張一下浦马,作為文件中的缺失的數(shù)字时呀。

public class BetterRandomNumber {

    private final static int MAX_NUMBER = 10000000;

    public static void main(String[] args) throws IOException {
        long startAt = currentTimeMillis();
        Random r = new Random(47);
        int removeCount = r.nextInt( 30) + 20;
        int[] s = new int[MAX_NUMBER];
        for (int i=0; i<MAX_NUMBER; i++) {
            s[i] = i+1;
        }
        for (int j=0; j<MAX_NUMBER; j++) {
            int randomIndex = r.nextInt(MAX_NUMBER-1);
            int temp = s[j];
            s[j] = s[randomIndex];
            s[randomIndex] = temp;
        }
        print("We remove " + removeCount + " numbers");
        PrintWriter writer = new PrintWriter("lot-number1.txt", "UTF-8");
        for (int k=0; k<MAX_NUMBER-removeCount; k++) {
            writer.println(s[k]);
        }
        writer.close();
        long endAt = currentTimeMillis();
        print("Program cost time: " + (float) (endAt - startAt) / 1000 + "s");
    }
}
運行時間

運行結果感人,竟然只需要2秒鐘晶默,只有自己新身去思考與編寫這兩種做法谨娜,并且為第一種方案難受過,才會更深切地感覺到這種天差地別磺陡。

有時趴梢,不得不感嘆自己的方法多呆哦!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末币他,一起剝皮案震驚了整個濱河市坞靶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝴悉,老刑警劉巖彰阴,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拍冠,居然都是意外死亡尿这,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門庆杜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妻味,“玉大人,你說我怎么就攤上這事欣福。” “怎么了焦履?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵拓劝,是天一觀的道長。 經常有香客問我嘉裤,道長郑临,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任屑宠,我火速辦了婚禮厢洞,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己躺翻,他們只是感情好丧叽,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布踊淳。 她就那樣靜靜地躺著,像睡著了一般迂尝。 火紅的嫁衣襯著肌膚如雪剪芥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天溉躲,我揣著相機與錄音寸认,去河邊找鬼。 笑死唱蒸,一個胖子當著我的面吹牛,可吹牛的內容都是我干的神汹。 我是一名探鬼主播古今,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捉腥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抵碟?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤撬统,失蹤者是張志新(化名)和其女友劉穎敦迄,沒想到半個月后凭迹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苦囱,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡沿彭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年喉刘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睦裳。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哥蔚,靈堂內的尸體忽然破棺而出蛛蒙,到底是詐尸還是另有隱情,我是刑警寧澤牵祟,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布诺苹,位于F島的核電站,受9級特大地震影響收奔,放射性物質發(fā)生泄漏。R本人自食惡果不足惜坪哄,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一翩肌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摧阅,春花似錦棒卷、人聲如沸顾孽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至霎冯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沈撞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工缠俺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留壹士,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓躏救,卻偏偏與公主長得像户敬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尿庐,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法抄瑟,類相關的語法,內部類的語法皮假,繼承相關的語法,異常的語法惹资,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 一褪测、基礎知識:1潦刃、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,379評論 0 4
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,138評論 25 707
  • 1乖杠、微信 2胧洒、支付寶 3、網易云音樂 4卫漫、天貓 5、美團 6汛兜、簡書 圖蟲 滴滴 拉勾網 愛奇藝 7、微博 QQ 叮...
    CYC666閱讀 160評論 0 0
  • 前言 7月粥谬,忙著學習ReactNative相關,這部分后續(xù)再詳細介紹漏策,先抽點時間補上算法文集的更新臼氨。 正文 1、T...
    落影l(fā)oyinglin閱讀 800評論 3 8