<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    幫助IT團隊快速構(gòu)建符合jt808協(xié)議部標的基于java技術(shù)的GPS和視頻平臺(2379423771@qq.com)

    List集合隨機排序算法分析

    List集合隨機排序算法分析

    先說一下JDK 對List的隨機排序的實現(xiàn):

    public static void shuffle(List list, Random rnd) {    
    ???   final int SHUFFLE_THRESHOLD??????? =??? 5;  //這應(yīng)當是一個經(jīng)驗值吧

    ??????? int size = list.size();
      /** 為什么要判斷,后面有論述 */
    ??????? if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
    ??????????? for (int i=size; i>1; i--)
    ??????????????? swap(list, i-1, rnd.nextInt(i));??//這一種方法是直接調(diào)用List.set方法,屬于RandomAccess中的方法
    ??????? } else {
    ??????????? Object arr[] = list.toArray();

    ??????????? // Shuffle array
    ??????????? for (int i=size; i>1; i--)
    ??????????????? swap(arr, i-1, rnd.nextInt(i));

    ??????????? // Dump array back into list
    ??????????? ListIterator it = list.listIterator();????? //如果不是Random Access實現(xiàn),就使用迭代器遍歷
    ??????????? for (int i=0; i<arr.length; i++) {
    ??????????????? it.next();
    ??????????????? it.set(arr[i]);
    ??????????? }
    ??????? }
    ??? }


    再說一下我自己的笨拙實現(xiàn):
      public static List randomSortList(List ls, Random random) {
    ??????????????? List randomList = new ArrayList();???????????????
    ??????????????? int size = list.size();
    ?????????????? while (size > 0) {
    ????????????????? int randomNum = random.nextInt(size);
    ????????????????? randomList.add(ls.get(randomNum));
    ????????????????? ls.remove(randomNum); //這一步,對于RandomAccess的集合來說,是O(1)操作
    ????????????? ?}
    ?????????????? return randomList;
    ???? }
    評述:
      如果List的實現(xiàn)是ArrayList,在時間效率上要多循環(huán)一次,但在空間上,我的方法非常差,多生成一個List集合,如果List很大,就更差了。同時我的算法如果用于Sequence List上,效率是相當?shù)牟睿荒苓m合ArrayList,有很大的局限性。
      這是因為: 如果集合類是RandomAccess的實現(xiàn),則盡量用for(int i = 0; i < size; i++) 來遍歷而不要用Iterator迭代器來遍歷,在效率上要差一些。反過來,如果List是Sequence List,則最好用迭代器來進行迭代。
      JDK中說的很清楚,在對List特別是Huge size的List的遍歷算法中,要盡量來判斷是屬于RandomAccess(如ArrayList)還是Sequence List (如LinkedList),因為適合RandomAccess List的遍歷算法,用在Sequence List上就差別很大,常用的作法就是:
    ??? 要作一個判斷:
    ??? if (list instance of RandomAccess) {
    ??????? for(int m = 0; m < list.size(); m++){}
    ??? }else{
    ??????? Iterator iter = list.iterator();
    ??????? while(iter.hasNext()){}
    ??? }
    ?? 我的項目中List都是基于ArrayList的,所以基本上很少用迭代器來遍歷,而是用for循環(huán)來遍歷,對于迭代器的作用我當然很清楚,但是我覺得有點庸人自擾了。
    ?? 除非你經(jīng)常用Collection作為你的接口方法中的輸入或輸出的集合參數(shù)類型時,你也就只能用Iterator。
    ?? 但我一般在接口方法中,一般用List,所以我就不用迭代器,除非我的List是Linked List實例。
    ?? 好的作法是:在供外部調(diào)用的接口方法中,使用Collection作為集合參數(shù)類型,在內(nèi)部實現(xiàn)當中,使用List,而不是一味的使用Collections及Iterator,這樣做無異于作繭自縛。
    ?? 順便說一下JDK中推薦的是對List集合盡量要實現(xiàn)RandomAccess接口。

    posted on 2006-07-31 18:25 Speed 閱讀(4493) 評論(0)  編輯  收藏 所屬分類: Algorithm theory & practice


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     

    導航

    留言簿(15)

    隨筆分類

    值得一看的博客

    積分與排名

    最新評論

    閱讀排行榜

    主站蜘蛛池模板: 无码国产精品一区二区免费式直播 | 国产vA免费精品高清在线观看| 国国内清清草原免费视频99| 亚洲自偷自偷精品| 黄色片免费在线观看| 亚洲精品国精品久久99热一| jizz免费一区二区三区| 亚洲黄片毛片在线观看| 羞羞视频在线观看免费| 亚洲精品无码永久在线观看| 青青草97国产精品免费观看| 亚洲第一网站男人都懂| 国产99久久久久久免费看| 亚洲欧洲美洲无码精品VA| aaa毛片视频免费观看| 亚洲va久久久噜噜噜久久狠狠| 和老外3p爽粗大免费视频 | 亚洲国产另类久久久精品| 在线免费视频你懂的| 亚洲无人区午夜福利码高清完整版| 成年女人A毛片免费视频| 国产专区一va亚洲v天堂| 国产在线精品观看免费观看| 亚洲av永久无码精品秋霞电影影院 | 亚洲女同成人AⅤ人片在线观看| av午夜福利一片免费看久久| 亚洲V无码一区二区三区四区观看| 日韩免费无码一区二区三区| 免费高清资源黄网站在线观看| 亚洲国产成人久久精品大牛影视 | 亚洲综合色视频在线观看| 一个人免费观看日本www视频| 国产成A人亚洲精V品无码 | 免费在线黄色电影| 亚洲欧洲在线观看| 黄色成人免费网站| 亚洲国产精品无码久久| 国产亚洲成人久久| 1000部羞羞禁止免费观看视频 | 日韩吃奶摸下AA片免费观看| 色费女人18女人毛片免费视频|