Java范例 从20亿个随机整数中找出最大的1000个整数只需要3秒的时间

查找算法:小顶堆

在内存中维护一个长度为TOP的数组,根据堆的性质,每一个节点都比他的左右子节点小,
先取出前TOP个数并构建小顶堆,然后将所有数据与堆顶比较大小,如果比堆顶小就直接丢弃,
如果比堆顶大则替换堆顶,并且重新构建这个堆。

构建小顶堆的过程:
先要找到最后一个非叶子节点,数组的长度为6,那么最后一个非叶子节点就是:长度/2-1,也就是6/2-1=2,
然后下一步就是比较该节点值和它的左右节点值,如果该节点大于其左\右子树的值就交换
(意思就是将最小的值放到该节点)。如果该节点不是叶子结点,则递归这一过程,直到这个节点变成叶子节点。

本范例可能会抛出 java.lang.OutOfMemoryError: Java heap space 这样的错误
当随机整数为10亿个的时候,本范例内存不作任何调整能正常执行,运行过程中是不会抛出上述错误的;
当随机整数激增到20亿个的时候,就要作如下内存参数调整(物理内存一共32GB)
-Xms16g -Xmx16g ,开发工具界面截图中的BigData是本范例的项目名称,开发工具是netbeans 10

运行环境:

Windows 10操作系统占用2.5GB的内存 + 13GB处理20亿个随机整数需要的内存 = 16GB物理内存

 Intel(R) Core(TM) i5-4570 CPU 3.2GHz

package com.contoso;

import java.util.Arrays;
import java.util.Random;

// 从20亿个随机整数中找出最大的1000个整数只需要3秒的时间
public class Ranking {

    private static int TOP = 1000; // 定义返回最大整数值的个数
    private static int ROWS = 2000000000; // 定义生成20亿个随机整数
    private static int initData[] = new int[ROWS];// 初始化存储20亿个整数的数组
    private static int result[] = new int[TOP]; //在内存中维护一个长度为TOP的小顶堆
    private static int len = result.length;
    public static int heapSize = len;   // 堆中元素内的有效元素heapSize <= len

    public static void main(String[] args) {

        // 生成随机数组
        for (int i = 0; i < ROWS; i++) {
            initData[i] = new Random().nextInt(Integer.MAX_VALUE);
        }

        // 构建初始堆
        for (int i = 0; i < TOP; i++) {
            result[i] = initData[i];
        }

        // 构建小顶堆
        long startTime = System.nanoTime();
        buildMinHeap();
        for (int i = TOP; i < ROWS; i++) {
            if (initData[i] > result[0]) {
                result[0] = initData[i];
                minHeap(0);
            }
        }
        // 从大到小地打印输出结果
        sortPrint();
        long endTime = System.nanoTime();
        double timeTaken = (endTime - startTime) / 1e9;
        System.out.println("Time Taken in seconds:" + timeTaken);
    }

    /**
     * 自底向上构建小堆
     */
    public static void buildMinHeap() {
        int size = len / 2 - 1; //最后一个非叶子节点
        for (int i = size; i >= 0; i--) {
            minHeap(i);
        }
    }

    /**
     * i节点为根及子树是一个小堆
     *
     * @param i
     */
    public static void minHeap(int i) {
        int j = left(i);
        int k = right(i);
        int index = i;

        if (j < heapSize && result[j] < result[index]) {
            index = j;
        }

        if (k < heapSize && result[k] < result[index]) {
            index = k;
        }

        if (index != i) {
            int temp = result[index];
            result[index] = result[i];
            result[i] = temp;
            // 递归向下构建堆
            minHeap(index);
        }

    }

    /**
     * 返回i节点的左孩子
     *
     * @param i
     * @return
     */
    public static int left(int i) {
        return 2 * i;
    }

    /**
     * 返回i节点的右孩子
     *
     * @param i
     * @return
     */
    public static int right(int i) {
        return 2 * i + 1;
    }

    /**
     * 从大到小地打印输出结果
     */
    public static void sortPrint() {
        Arrays.sort(result);
        for (int i = TOP - 1; i >= 0; i--) {
            System.out.println(result[i]);
        }
    }

}
run:
2147483645
2147483645
2147483643
2147483643
2147483642
2147483642
2147483642
2147483641
2147483640
2147483640
2147483638
2147483637
2147483637
2147483636
2147483635
2147483634
2147483632
2147483632
2147483631
2147483631
2147483629
2147483628
2147483627
2147483626
2147483619
2147483614
2147483614
2147483613
2147483613
2147483613
2147483612
2147483611
2147483611
2147483610
2147483606
2147483605
2147483604
2147483604
2147483603
2147483602
2147483601
2147483598
2147483594
2147483593
2147483592
2147483592
2147483591
2147483591
2147483591
2147483586
2147483585
2147483585
2147483585
2147483584
2147483583
2147483583
2147483583
2147483582
2147483580
2147483579
2147483578
2147483575
2147483574
2147483571
2147483570
2147483569
2147483568
2147483566
2147483566
2147483565
2147483564
2147483564
2147483562
2147483562
2147483561
2147483561
2147483561
2147483559
2147483559
2147483557
2147483556
2147483553
2147483550
2147483549
2147483548
2147483546
2147483546
2147483543
2147483542
2147483541
2147483541
2147483540
2147483539
2147483538
2147483537
2147483536
2147483535
2147483535
2147483534
2147483534
2147483533
2147483531
2147483531
2147483531
2147483530
2147483530
2147483530
2147483529
2147483529
2147483529
2147483528
2147483528
2147483523
2147483523
2147483522
2147483521
2147483521
2147483520
2147483520
2147483518
2147483517
2147483516
2147483516
2147483514
2147483513
2147483513
2147483510
2147483508
2147483505
2147483505
2147483504
2147483504
2147483499
2147483498
2147483498
2147483495
2147483493
2147483489
2147483489
2147483487
2147483486
2147483485
2147483483
2147483483
2147483482
2147483482
2147483482
2147483482
2147483481
2147483481
2147483479
2147483477
2147483476
2147483476
2147483475
2147483475
2147483471
2147483470
2147483469
2147483469
2147483469
2147483469
2147483468
2147483466
2147483463
2147483463
2147483462
2147483460
2147483460
2147483459
2147483455
2147483454
2147483454
2147483450
2147483447
2147483445
2147483444
2147483443
2147483442
2147483439
2147483439
2147483439
2147483438
2147483435
2147483435
2147483434
2147483433
2147483433
2147483430
2147483429
2147483428
2147483428
2147483427
2147483425
2147483424
2147483423
2147483423
2147483422
2147483422
2147483421
2147483420
2147483420
2147483420
2147483419
2147483415
2147483415
2147483415
2147483413
2147483411
2147483410
2147483409
2147483408
2147483407
2147483407
2147483403
2147483399
2147483397
2147483394
2147483388
2147483387
2147483386
2147483386
2147483384
2147483383
2147483383
2147483383
2147483382
2147483382
2147483381
2147483381
2147483380
2147483379
2147483377
2147483377
2147483375
2147483373
2147483373
2147483372
2147483371
2147483371
2147483371
2147483370
2147483370
2147483369
2147483368
2147483367
2147483367
2147483367
2147483366
2147483365
2147483364
2147483363
2147483362
2147483361
2147483360
2147483359
2147483359
2147483356
2147483356
2147483356
2147483355
2147483355
2147483351
2147483349
2147483349
2147483349
2147483349
2147483346
2147483346
2147483346
2147483342
2147483341
2147483340
2147483338
2147483337
2147483336
2147483336
2147483335
2147483334
2147483334
2147483334
2147483333
2147483330
2147483329
2147483329
2147483329
2147483329
2147483327
2147483326
2147483326
2147483325
2147483325
2147483325
2147483324
2147483323
2147483323
2147483323
2147483323
2147483322
2147483319
2147483317
2147483316
2147483316
2147483314
2147483314
2147483312
2147483310
2147483309
2147483305
2147483304
2147483303
2147483302
2147483302
2147483302
2147483302
2147483301
2147483301
2147483300
2147483300
2147483297
2147483296
2147483296
2147483292
2147483291
2147483290
2147483289
2147483288
2147483288
2147483286
2147483283
2147483282
2147483281
2147483281
2147483280
2147483279
2147483278
2147483278
2147483276
2147483275
2147483275
2147483275
2147483274
2147483274
2147483273
2147483272
2147483272
2147483272
2147483271
2147483269
2147483269
2147483266
2147483264
2147483262
2147483259
2147483259
2147483259
2147483259
2147483259
2147483256
2147483253
2147483252
2147483252
2147483250
2147483250
2147483248
2147483245
2147483244
2147483243
2147483243
2147483241
2147483241
2147483241
2147483240
2147483238
2147483237
2147483237
2147483237
2147483236
2147483234
2147483233
2147483233
2147483232
2147483231
2147483230
2147483230
2147483229
2147483228
2147483227
2147483227
2147483227
2147483226
2147483226
2147483225
2147483222
2147483222
2147483220
2147483216
2147483211
2147483211
2147483210
2147483209
2147483209
2147483209
2147483207
2147483206
2147483202
2147483200
2147483199
2147483199
2147483199
2147483198
2147483197
2147483197
2147483196
2147483196
2147483195
2147483194
2147483192
2147483191
2147483190
2147483189
2147483188
2147483188
2147483187
2147483187
2147483187
2147483186
2147483185
2147483184
2147483182
2147483182
2147483179
2147483178
2147483178
2147483174
2147483174
2147483173
2147483171
2147483169
2147483169
2147483168
2147483168
2147483166
2147483166
2147483166
2147483162
2147483161
2147483161
2147483154
2147483153
2147483151
2147483147
2147483142
2147483140
2147483139
2147483139
2147483134
2147483133
2147483132
2147483129
2147483125
2147483125
2147483123
2147483120
2147483119
2147483118
2147483118
2147483117
2147483116
2147483114
2147483114
2147483113
2147483113
2147483112
2147483112
2147483111
2147483111
2147483111
2147483110
2147483109
2147483109
2147483109
2147483108
2147483107
2147483107
2147483106
2147483105
2147483104
2147483103
2147483103
2147483102
2147483102
2147483102
2147483099
2147483099
2147483097
2147483097
2147483095
2147483090
2147483089
2147483089
2147483085
2147483085
2147483084
2147483083
2147483083
2147483083
2147483081
2147483079
2147483078
2147483078
2147483077
2147483075
2147483074
2147483074
2147483074
2147483073
2147483071
2147483069
2147483069
2147483068
2147483068
2147483068
2147483067
2147483065
2147483064
2147483063
2147483063
2147483063
2147483060
2147483060
2147483059
2147483057
2147483056
2147483056
2147483056
2147483056
2147483051
2147483049
2147483049
2147483049
2147483048
2147483047
2147483044
2147483042
2147483038
2147483033
2147483033
2147483033
2147483033
2147483031
2147483031
2147483030
2147483027
2147483026
2147483026
2147483025
2147483025
2147483024
2147483024
2147483022
2147483021
2147483019
2147483016
2147483015
2147483015
2147483013
2147483012
2147483010
2147483010
2147483009
2147483008
2147483008
2147483008
2147483008
2147483007
2147483006
2147483006
2147483004
2147483004
2147483003
2147483003
2147483003
2147483001
2147482999
2147482998
2147482998
2147482997
2147482997
2147482996
2147482996
2147482995
2147482995
2147482992
2147482991
2147482991
2147482989
2147482987
2147482986
2147482983
2147482982
2147482981
2147482979
2147482977
2147482974
2147482972
2147482969
2147482969
2147482969
2147482969
2147482966
2147482965
2147482965
2147482964
2147482962
2147482961
2147482961
2147482960
2147482960
2147482959
2147482959
2147482958
2147482958
2147482958
2147482958
2147482958
2147482958
2147482955
2147482954
2147482954
2147482954
2147482952
2147482951
2147482950
2147482949
2147482947
2147482947
2147482946
2147482945
2147482944
2147482942
2147482939
2147482935
2147482934
2147482934
2147482931
2147482930
2147482930
2147482929
2147482927
2147482925
2147482923
2147482923
2147482922
2147482921
2147482920
2147482920
2147482918
2147482917
2147482917
2147482914
2147482914
2147482913
2147482911
2147482909
2147482909
2147482908
2147482907
2147482907
2147482907
2147482906
2147482905
2147482905
2147482905
2147482904
2147482904
2147482904
2147482903
2147482902
2147482900
2147482900
2147482900
2147482898
2147482896
2147482894
2147482891
2147482888
2147482887
2147482886
2147482883
2147482880
2147482880
2147482878
2147482876
2147482875
2147482874
2147482874
2147482874
2147482874
2147482874
2147482873
2147482872
2147482871
2147482869
2147482869
2147482867
2147482866
2147482866
2147482865
2147482865
2147482864
2147482863
2147482862
2147482861
2147482860
2147482860
2147482859
2147482858
2147482857
2147482852
2147482847
2147482844
2147482844
2147482843
2147482843
2147482843
2147482841
2147482841
2147482840
2147482840
2147482840
2147482840
2147482837
2147482836
2147482835
2147482835
2147482834
2147482834
2147482833
2147482831
2147482831
2147482831
2147482830
2147482830
2147482828
2147482827
2147482827
2147482825
2147482824
2147482823
2147482823
2147482822
2147482821
2147482820
2147482819
2147482819
2147482819
2147482818
2147482816
2147482816
2147482814
2147482814
2147482814
2147482812
2147482811
2147482811
2147482810
2147482809
2147482806
2147482805
2147482804
2147482804
2147482800
2147482799
2147482798
2147482797
2147482796
2147482796
2147482794
2147482794
2147482794
2147482794
2147482791
2147482791
2147482790
2147482789
2147482788
2147482788
2147482787
2147482785
2147482784
2147482783
2147482783
2147482782
2147482781
2147482779
2147482778
2147482776
2147482774
2147482770
2147482767
2147482765
2147482764
2147482763
2147482762
2147482762
2147482761
2147482761
2147482761
2147482758
2147482758
2147482757
2147482757
2147482756
2147482756
2147482754
2147482754
2147482752
2147482751
2147482750
2147482750
2147482749
2147482747
2147482746
2147482742
2147482741
2147482741
2147482740
2147482740
2147482739
2147482739
2147482738
2147482737
2147482736
2147482736
2147482735
2147482734
2147482733
2147482731
2147482731
2147482728
2147482726
2147482724
2147482722
2147482720
2147482718
2147482717
2147482717
2147482715
2147482715
2147482715
2147482714
2147482714
2147482714
2147482714
2147482713
2147482711
2147482710
2147482709
2147482705
2147482705
2147482703
2147482702
2147482701
2147482701
2147482701
2147482699
2147482697
2147482697
2147482697
2147482696
2147482696
2147482695
2147482694
2147482693
2147482692
2147482691
2147482691
2147482689
2147482688
2147482688
2147482688
2147482687
2147482685
2147482683
2147482683
2147482683
2147482679
2147482677
2147482677
2147482676
2147482675
2147482674
2147482673
2147482673
2147482671
2147482671
2147482667
2147482667
2147482666
2147482666
2147482665
2147482664
2147482662
2147482659
2147482658
2147482657
2147482654
2147482653
2147482651
2147482651
2147482649
2147482648
2147482648
2147482647
2147482647
2147482647
2147482642
2147482641
2147482641
2147482639
2147482639
2147482637
2147482635
2147482634
2147482633
2147482633
2147482632
2147482630
2147482628
2147482628
2147482627
2147482627
2147482626
2147482625
2147482625
2147482624
2147482623
2147482622
2147482622
2147482620
2147482620
2147482619
2147482619
2147482618
2147482617
2147482617
2147482615
2147482614
2147482614
2147482614
2147482614
2147482613
2147482613
2147482612
2147482611
2147482610
2147482610
2147482609
2147482608
2147482608
2147482607
2147482607
2147482605
2147482604
2147482603
2147482603
2147482603
2147482602
2147482602
2147482601
2147482601
2147482601
2147482600
2147482600
2147482599
2147482596
2147482596
2147482595
2147482594
2147482593
2147482592
2147482592
2147482592
2147482591
2147482590
2147482588
2147482588
2147482588
2147482587
2147482585
2147482583
2147482581
2147482581
2147482580
2147482579
2147482578
2147482577
2147482575
2147482573
Time Taken in seconds:3.050852396
BUILD SUCCESSFUL (total time: 2 minutes 7 seconds)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值