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

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

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

    posts - 12, comments - 3, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    2009年12月29日

    快速排序介紹:
    快速排序(Quicksort)是對冒泡法的一種改進(jìn)。由C. A. R. Hoare在1962年提出。

    基本思想是:
    通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

     1 package my.sort;
     2 
     3 public class QuickSort {
     4 
     5     static int a[] = { 101113164325456 };
     6 
     7     public static void sort(int L, int R) {
     8         int i = L - 1;
     9         int j = R;
    10         int tmp;
    11         if (L < R) {
    12             for (; i < R;) {
    13                 while (a[++i] > a[R]) {// 從i開始,從前往后掃描,如果發(fā)現(xiàn)大于a[R](數(shù)組最后一個(gè)值),與之對換
    14                     while (j > 0) {
    15                         if (j <= i) {// 如果i == j結(jié)束跳出循環(huán)
    16                             break;
    17                         }
    18                         if (a[--j] < a[R]) {// 從J開始,從后往前掃描,如果發(fā)現(xiàn)小于a[i],與之對換
    19                             tmp = a[j];
    20                             a[j] = a[i];
    21                             a[i] = tmp;
    22                         }
    23                         
    24                     }
    25                     
    26                     tmp = a[i];
    27                     a[i] = a[R];
    28                     a[R] = tmp;
    29                     
    30                     for(int b : a) {
    31                         System.out.print(b + " ");//打印沒一趟排序結(jié)果
    32                     }
    33                     System.out.println();
    34                     
    35                     //把數(shù)組分成兩段排序
    36                     sort(L, i-1);//基準(zhǔn)數(shù)前面的數(shù)據(jù)進(jìn)行排列
    37                     sort(i, R);//基準(zhǔn)數(shù)后面的數(shù)據(jù)排列
    38                 }
    39             }
    40         }
    41 
    42     }
    43 
    44     public static void main(String[] args) {
    45         System.out.println("排序前:");
    46         for (int b : a) {
    47             System.out.print(b + " ");
    48         }
    49         System.out.println("\n排序過程:");
    50         sort(0, a.length - 1);
    51         System.out.println("排序后:");
    52         for (int b : a) {
    53             System.out.print(b + " ");
    54         }
    55         System.out.println();
    56     }
    57 }
    58 

    posted @ 2010-01-17 16:14 創(chuàng)意恒動(dòng)力 閱讀(346) | 評論 (0)編輯 收藏

    自我理解java linkedlist插入數(shù)據(jù)的算法:
    首先看一下,linkedlist插入源代碼:

     1 public class LinkedList
     2     extends AbstractSequentialList
     3     implements List, Deque, Cloneable, java.io.Serializable
     4 {
     5     private transient Entry header = new Entry(nullnullnull);//初始化時(shí)先實(shí)例一個(gè)header,鏈表頭
     6 
     7 
     8     /**
     9      * Constructs an empty list.//構(gòu)造一個(gè)空鏈表
    10      */
    11     public LinkedList() {
    12         header.next = header.previous = header; //把鏈表頭和尾先連到自己(1)
    13         addBefore(e, header);(2
    14 
    15     }
    16 
    17 .
    18 
    19  public boolean add(E e) {//插入鏈表方法
    20             return true;
    21     }
    22 .
    23 
    24 private static class Entry {//每個(gè)數(shù)據(jù)存放,所要用到的靜態(tài)內(nèi)部類
    25      E element;
    26      Entry next;//后一個(gè)節(jié)點(diǎn)
    27      Entry previous;//接一個(gè)節(jié)點(diǎn)
    28 
    29      Entry(E element, Entry next, Entry previous) {
    30          this.element = element;
    31          this.next = next;
    32          this.previous = previous;
    33      }
    34 }
    35 
    36 
    37 //插入操作方法
    38     private Entry addBefore(E e, Entry entry) {
    39          Entry newEntry = new Entry(e, entry, entry.previous);(3
    40          newEntry.previous.next = newEntry;(4
    41          newEntry.next.previous = newEntry;(5
    42          size++;(6
    43          modCount++;
    44          return newEntry;
    45     }
    46 
    47 
    48 /*其他方法~~*/
    49 
    50 
    
    

    以上部分就是算法所在:(一個(gè)簡單的公式替換過程)

    算法步驟(對應(yīng)上面的編號):

    (1)實(shí)例化一個(gè)header (Entry)

    header.next = header

    header.previous = header

    當(dāng)有第一條數(shù)據(jù)插入鏈表:

    (3)實(shí)例化一個(gè) Entry newEntry (以下簡稱E1)

    E1.next = header

    E1.previous = header.previous

    E1.previous.next = header.previous.next = header.next

    (4)由上面可得:

    newEntry.previous.next = newEntry;

    作用:

    相當(dāng)于 E1.previous.next = header.next = E1

    其實(shí)就是,讓上一個(gè)節(jié)的next指向下一個(gè)節(jié)點(diǎn)數(shù)據(jù)

    所以header.next 的下一個(gè)節(jié)點(diǎn)就是E1

    (5)E1.next.previous = header.previous = E1(這里用得巧妙)

    其實(shí)這個(gè)用法單從E1.next.previous= E1單這么看,很直觀因?yàn)镋1的下一個(gè)節(jié)點(diǎn)數(shù)據(jù)的上一個(gè)節(jié)點(diǎn)就應(yīng)該是E1

    從上面可知,E1.next == header,為什么要把header.previous = E1呢?

    其實(shí)包含著一個(gè)遞歸在里面。

    如果再新增一個(gè)數(shù)據(jù) Entry E2 :

    從上面的代碼可以看出,E2的實(shí)例化過程是:(其實(shí)linkedlist每次新增一個(gè)數(shù)據(jù),都通過header傳值)

    Entry E2 = new Entry(data, header, header.previous);

    注意代碼部分的負(fù)值。關(guān)鍵就是這里,實(shí)例化的時(shí)候,E2.previous = header.previous = E1
    簡單得完成了負(fù)值過程。

    然后 E2.previous.next = E1.next = E2
    E2.next.previous = header.previous = E2 .......(接著插入下一條數(shù)據(jù),如此遞歸)

    (6)記錄鏈表位數(shù)


    涉及到了一個(gè)小小的遞歸算法。

    linkedlist記錄一。完畢。。


    posted @ 2010-01-04 19:23 創(chuàng)意恒動(dòng)力 閱讀(2531) | 評論 (0)編輯 收藏

    弄了一段時(shí)間的tokyocabinet btree結(jié)構(gòu)數(shù)據(jù)庫。
    存儲的時(shí)候發(fā)現(xiàn),tokyocabinet sync同步時(shí),先讓數(shù)據(jù)存放在內(nèi)存,然后對比同步文件和內(nèi)存的數(shù)據(jù),使數(shù)據(jù)達(dá)到一直。
    sync()這個(gè)tc方法易用,但不好控制。
    稍有不慎就會(huì)使持久化文件容量以幾何級數(shù)遞增。

    之前自己用mina框架做了一個(gè)btree的網(wǎng)絡(luò)鏈接端口,起初內(nèi)存一直飆升。弄了很久都不明白。
    開始以為是mina造成的,而且cpu占用率居高不下。

    后來拆分測試。發(fā)現(xiàn)單獨(dú)mina的數(shù)據(jù)傳輸,內(nèi)存并不高,非常低。
    但是tc的單獨(dú)測試發(fā)現(xiàn),寫文件的cpu占用率特高,多線程寫入的情況下,會(huì)有明顯阻塞。
    初步了解了jvm gc的算法,如果cpu占用率搞,gc回收內(nèi)存的能力會(huì)明顯下降。
    為了解決這一點(diǎn),修改了一下網(wǎng)絡(luò)端口的框架結(jié)構(gòu)。

    把數(shù)據(jù)接受端跟數(shù)據(jù)處理端分開:
    1.接受端可以接受多個(gè)socket多線程傳輸,而數(shù)據(jù)處理端鎖定只接受從接收端的一個(gè)或不超過5個(gè)scoket傳輸數(shù)據(jù)。
    對tc的操作,單線程寫入,感覺上比多線程處理流暢,特別在同步優(yōu)化文件那一刻。
    優(yōu)化文件,需要的cpu和內(nèi)存都比較厲害。
    2.tc接受數(shù)據(jù)以后,不要馬上寫文本。等接受一批(100-10000)數(shù)據(jù)后,再使用同步方法。
    3.參照第2條,定期優(yōu)化文件,這樣不至于文件過大。但是數(shù)據(jù)量增大,文件雖然優(yōu)化了,寫入速度不會(huì)怎么改變。
    4.優(yōu)化同步文件后,特別在數(shù)據(jù)量在不斷增大的情況下。不要以為沒有回收內(nèi)存,其實(shí)gc已經(jīng)很努力回收(長時(shí)間觀察jprofiler的統(tǒng)計(jì)數(shù)據(jù)證明了這一點(diǎn))當(dāng)你向tc取數(shù)據(jù)的時(shí)候,你會(huì)發(fā)現(xiàn),內(nèi)存會(huì)逐級遞減。


    經(jīng)過一番調(diào)整,用jprofiler測試,自己搭建的網(wǎng)絡(luò)框架,內(nèi)存鎖定在250m左右。
    可能到實(shí)際運(yùn)行的時(shí)候,內(nèi)存占用量會(huì)增加,但是只會(huì)達(dá)到一個(gè)相當(dāng)?shù)姆€(wěn)定值。
    現(xiàn)用于公司的隊(duì)列系統(tǒng),內(nèi)存總量不超過600m,偶爾超過是由于同步文件造成的,等數(shù)據(jù)穩(wěn)定后,內(nèi)存會(huì)回到穩(wěn)定值。以后再作優(yōu)化,希望能把內(nèi)存壓制200m左右。

    初學(xué)nio,以此為記。

    posted @ 2009-12-29 10:22 創(chuàng)意恒動(dòng)力 閱讀(765) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 免费中文字幕不卡视频| 亚洲国产精彩中文乱码AV| 免费一级全黄少妇性色生活片 | gogo免费在线观看| 国产亚洲综合久久系列| 在线观看AV片永久免费| 黄色网址免费在线| 亚洲精品美女在线观看| 午夜国产大片免费观看| 无码国产精品一区二区免费vr| 亚洲日韩精品无码专区加勒比| 国产av无码专区亚洲av果冻传媒| 1000部国产成人免费视频| 黄色片网站在线免费观看| 亚洲精品美女在线观看| 2048亚洲精品国产| 搡女人免费视频大全| 免费无码又爽又刺激一高潮| 亚洲一久久久久久久久| 亚洲AV综合色区无码一区爱AV| 天天天欲色欲色WWW免费| 性xxxxx大片免费视频| 免费无码国产V片在线观看| 97se亚洲综合在线| 日韩一卡2卡3卡4卡新区亚洲| 妞干网免费视频观看| 日韩免费观看一区| 一级午夜免费视频| 亚洲欧好州第一的日产suv| 亚洲国产精品久久久久| 国产亚洲av片在线观看18女人 | 亚洲伊人色欲综合网| 国产裸模视频免费区无码| 四虎在线视频免费观看视频| 9久热精品免费观看视频| 国产亚洲精品第一综合| 7777久久亚洲中文字幕| 亚洲精品国产成人中文| 亚洲AV永久无码精品水牛影视| 亚洲一区视频在线播放| 在线观看免费精品国产|