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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    數據結構之堆

    Posted on 2007-02-20 12:59 dennis 閱讀(3641) 評論(1)  編輯  收藏 所屬分類: 數據結構與算法
    1。概念:堆是一種特殊的二叉樹,具備以下兩種性質
    1)每個節點的值都大于(或者都小于,稱為最小堆)其子節點的值
    2)樹是完全平衡的,并且最后一層的樹葉都在最左邊
    這樣就定義了一個最大堆。

    2。堆可以用一個數組表示,有如下性質:
    heap[i]>=heap[2*i+1]? 其中0<=i<=(n-1)/2
    heap[i]>=heap[2*i+2]? 其中0<=i<=(n-2)/2

    3。用數組實現堆,
    1)插入操作
    自頂向下,偽代碼:
    ??heapEnqueue(el)
    ??????將el放在堆尾
    ??????
    while?el不在根節點并且el>parent(el)
    ??????????交換el及其父節點

    自底向上,偽代碼:
    ?FloydAlgrithm(data[])
    ?????
    for?i=最后一個非葉節點的下標,i>=0;i--
    ??????調用moveDown(data,i,n
    -1)恢復以data[i]為根的樹的堆性質
    ??
    2)moveDown的方法實現,此方法是堆排序的關鍵,也是刪除操作的關鍵。刪除操作,將根節點刪除,并把最末的樹葉換到根節點,通過moveDown方法找到正確的位置,恢復堆性質。

    4。堆的一個實現:
    // heap.java
    // demonstrates heaps
    // to run this program: C>java HeapApp
    import java.io.*;
    ////////////////////////////////////////////////////////////////
    class Node
    {
    private int iData; // data item (key)
    // -------------------------------------------------------------
    public Node(int key) // constructor
    { iData = key; }
    // -------------------------------------------------------------
    public int getKey()
    { return iData; }
    // -------------------------------------------------------------
    public void setKey(int id)
    { iData = id; }
    // -------------------------------------------------------------
    } // end class Node
    ////////////////////////////////////////////////////////////////
    class Heap
    {
    private Node[] heapArray;
    private int maxSize; // size of array
    private int currentSize; // number of nodes in array
    // -------------------------------------------------------------
    public Heap(int mx) // constructor
    {
    maxSize = mx;
    currentSize = 0;
    heapArray = new Node[maxSize]; // create array
    }
    // -------------------------------------------------------------
    public boolean isEmpty()
    { return currentSize==0; }
    // -------------------------------------------------------------
    public boolean insert(int key)
    {
    if(currentSize==maxSize)
    return false;
    Node newNode = new Node(key);
    heapArray[currentSize] = newNode;
    trickleUp(currentSize++);
    return true;
    } // end insert()
    // -------------------------------------------------------------
    public void trickleUp(int index)
    {
    int parent = (index-1) / 2;
    Node bottom = heapArray[index];

    while( index > 0 &&
    heapArray[parent].getKey() < bottom.getKey() )
    {
    heapArray[index] = heapArray[parent]; // move it down
    index = parent;
    parent = (parent-1) / 2;
    } // end while
    heapArray[index] = bottom;
    } // end trickleUp()
    // -------------------------------------------------------------
    public Node remove() // delete item with max key
    { // (assumes non-empty list)
    Node root = heapArray[0];
    heapArray[0] = heapArray[--currentSize];
    trickleDown(0);
    return root;
    } // end remove()
    // -------------------------------------------------------------
    public void trickleDown(int index)
    {
    int largerChild;
    Node top = heapArray[index]; // save root
    while(index < currentSize/2) // while node has at
    { // least one child,
    int leftChild = 2*index+1;
    int rightChild = leftChild+1;
    // find larger child
    if(rightChild < currentSize && // (rightChild exists?)
    heapArray[leftChild].getKey() <
    heapArray[rightChild].getKey())
    largerChild = rightChild;
    else
    largerChild = leftChild;
    // top >= largerChild?
    if( top.getKey() >= heapArray[largerChild].getKey() )
    break;
    // shift child up
    heapArray[index] = heapArray[largerChild];
    index = largerChild; // go down
    } // end while
    heapArray[index] = top; // root to index
    } // end trickleDown()
    // -------------------------------------------------------------
    public boolean change(int index, int newValue)
    {
    if(index<0 || index>=currentSize)
    return false;
    int oldValue = heapArray[index].getKey(); // remember old
    heapArray[index].setKey(newValue); // change to new

    if(oldValue < newValue) // if raised,
    trickleUp(index); // trickle it up
    else // if lowered,
    trickleDown(index); // trickle it down
    return true;
    } // end change()
    // -------------------------------------------------------------
    public void displayHeap()
    {
    System.out.print("heapArray: "); // array format
    for(int m=0; m<currentSize; m++)
    if(heapArray[m] != null)
    System.out.print( heapArray[m].getKey() + " ");
    else
    System.out.print( "-- ");
    System.out.println();
    // heap format
    int nBlanks = 32;
    int itemsPerRow = 1;
    int column = 0;
    int j = 0; // current item
    String dots = "...............................";
    System.out.println(dots+dots); // dotted top line

    while(currentSize > 0) // for each heap item
    {
    if(column == 0) // first item in row?
    for(int k=0; k<nBlanks; k++) // preceding blanks
    System.out.print(' ');
    // display item
    System.out.print(heapArray[j].getKey());

    if(++j == currentSize) // done?
    break;

    if(++column==itemsPerRow) // end of row?
    {
    nBlanks /= 2; // half the blanks
    itemsPerRow *= 2; // twice the items
    column = 0; // start over on
    System.out.println(); // new row
    }
    else // next item on row
    for(int k=0; k<nBlanks*2-2; k++)
    System.out.print(' '); // interim blanks
    } // end for
    System.out.println("/n"+dots+dots); // dotted bottom line
    } // end displayHeap()
    // -------------------------------------------------------------
    } // end class Heap
    ////////////////////////////////////////////////////////////////
    class HeapApp
    {
    public static void main(String[] args) throws IOException
    {
    int value, value2;
    Heap theHeap = new Heap(31); // make a Heap; max size 31
    boolean success;

    theHeap.insert(70); // insert 10 items
    theHeap.insert(40);
    theHeap.insert(50);
    theHeap.insert(20);
    theHeap.insert(60);
    theHeap.insert(100);
    theHeap.insert(80);
    theHeap.insert(30);
    theHeap.insert(10);
    theHeap.insert(90);

    while(true) // until [Ctrl]-[C]
    {
    System.out.print("Enter first letter of ");
    System.out.print("show, insert, remove, change: ");
    int choice = getChar();
    switch(choice)
    {
    case 's': // show
    theHeap.displayHeap();
    break;
    case 'i': // insert
    System.out.print("Enter value to insert: ");
    value = getInt();
    success = theHeap.insert(value);
    if( !success )
    System.out.println("Can't insert; heap full");
    break;
    case 'r': // remove
    if( !theHeap.isEmpty() )
    theHeap.remove();
    else
    System.out.println("Can't remove; heap empty");
    break;
    case 'c': // change
    System.out.print("Enter current index of item: ");
    value = getInt();
    System.out.print("Enter new key: ");
    value2 = getInt();
    success = theHeap.change(value, value2);
    if( !success )
    System.out.println("Invalid index");
    break;
    default:
    System.out.println("Invalid entry/n");
    } // end switch
    } // end while
    } // end main()
    //-------------------------------------------------------------
    public static String getString() throws IOException
    {
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);
    String s = br.readLine();
    return s;
    }
    //-------------------------------------------------------------
    public static char getChar() throws IOException
    {
    String s = getString();
    return s.charAt(0);
    }
    //-------------------------------------------------------------
    public static int getInt() throws IOException
    {
    String s = getString();
    return Integer.parseInt(s);
    }
    //-------------------------------------------------------------
    } // end class HeapApp
    ////////////////////////////////////////////////////////////////

    評論

    # re: 數據結構之堆   回復  更多評論   

    2008-01-05 19:31 by geochenyj
    寫得不錯
    主站蜘蛛池模板: 美女视频黄免费亚洲| 99999久久久久久亚洲| 一级特黄录像免费播放中文版| 免费看少妇作爱视频| 亚洲最大福利视频| 日本黄色免费观看| 国产亚洲精品仙踪林在线播放| 国产在线19禁免费观看国产| 狼人大香伊蕉国产WWW亚洲| 四虎影视永久免费观看| 免费人成网站永久| 中文字幕精品亚洲无线码一区| 99热在线日韩精品免费| 亚洲国产精品VA在线看黑人 | 亚洲激情黄色小说| 国产精品免费网站| 亚洲精品又粗又大又爽A片| 免费在线观看污网站| 一级毛片免费播放试看60分钟| 国产精品亚洲成在人线| 99爱免费观看视频在线| 国产精品久久亚洲不卡动漫| 免费视频淫片aa毛片| 一区二区三区免费视频网站 | 亚洲人成电影在线播放| 亚洲精品免费视频| 国产亚洲中文日本不卡二区 | 亚洲一级二级三级不卡| 国产卡一卡二卡三免费入口| 亚洲国产欧洲综合997久久| 久久久久亚洲爆乳少妇无| 精品一区二区三区免费毛片爱 | 国产AV无码专区亚洲AV漫画| 亚洲电影免费在线观看| 亚洲成a∨人片在无码2023| 毛茸茸bbw亚洲人| 国产成人精品免费视频大| 四虎国产精品成人免费久久| 99久久亚洲精品无码毛片| 国产做床爱无遮挡免费视频| 国产免费一区二区三区在线观看 |