java使用小根堆實現優先順序佇列的幾種方式

2021-09-02 21:20:14 字數 2395 閱讀 2459

寫在之前

1.自定義實現採用陣列作為內部資料結構

2.內部陣列通過grow方法進行擴容,每次只是簡單的擴充套件為原來的2倍

3.集中實現方式的主要區別在於siftdown方法

實現方式一(遞迴實現)

關鍵**:

@override

protected void siftdown(int index)

int currentmin = left;

if(right <= len && arr[currentmin] > arr[right])

if(arr[currentmin] < arr[index])

}

實現方式二(迴圈實現)

關鍵**:

@override

protected void siftdown(int index)

int currentmin = left;

if(right <= len && arr[currentmin] > arr[right])

if(arr[currentmin] >= arr[index])

swap(arr, currentmin, index);

index = currentmin;

}}

實現方式三(直接構建堆)

關鍵**:

@override

protected void siftdown(int index)

int currentmin = left;

if(right <= len && arr[currentmin] > arr[right])

if(arr[currentmin] < arr[index])

//進入下乙個非葉子節點

index++;

}}

實現方式四(jdk中的實現)

1.siftup方法:

protected void siftup(int k, int x) 

arr[k] = x;

}

2.siftdown方法:

/**

* 指定index位置的值為x,並為x在堆中找到合適位置

* @param index

* @param x

*/private void siftdown(int index, int x)

//將最終值放入合適位置

arr[index] = x;

}

其他的一下關鍵方法

1.siftup方法:

@override

protected void siftup(int index)

}

2.add方法:

@override

public boolean add(int ele)

int i = totalcount;

arr[i] = ele;

if(totalcount == 1)

//調整元素位置確保為小根堆

siftup(i);

totalcount++;

return true;

}

3.poll方法:

@override

public int poll()

5.remove方法:

@override

public int remove(int ele)

//計算元素位置

int index = indexof(ele);

if(index < 0)

return removeat(index);

}

6.removeat方法:

@override

protected int removeat(int idx)

int result = arr[idx];

//將刪除元素與最後乙個元素交換位置

if(idx != totalcount -1)

//位置交換之後佇列長度減一

totalcount--;

//如果佇列長度大於1,而且刪除的元素位置不在隊尾則重新調整堆

if(totalcount > 1 && idx != totalcount)

return result;

}

優先順序佇列 大根堆和小根堆

概述 與fifo的普通佇列不同,在優先順序佇列中,元素出隊順序是由元素的優先順序決定。比如大根堆是最大的元素先出隊,小根堆是最小的元素先出隊。堆是實現優先順序佇列效率很高的資料結構 當然我們也可以使用無序的線性表或者有序鍊錶來實現,但是它們的刪除 插入的時間複雜度至少有乙個是o n 堆是一棵完全二叉...

優先順序佇列(堆實現)

一 優先順序佇列定義 二 方法實現 獲得最大元素方法 去掉最大元素方法 修改優先順序方法 新增節點 三 實現 用堆實現乙個優先順序佇列 主要是新增 修改 刪除節點 節點具有唯一性 author hhf 2014年11月28日 public class priorityqueue 返回優先佇列中優先順...

優先順序佇列(堆實現)

優先順序佇列 概念 一般來說我們會根據事情的重要程度優先處理某事,比如完成學習任務和刷微博,我們會認為完成學習任務比較重要,因此會先執行它,因此在這種情況下,資料結構就應提供兩個基本的操作,一是返回最高優先順序物件,二是新增新的物件,這種資料結構就叫做優先順序佇列。二叉樹的順序儲存 儲存方式 使用陣...