java實現最大索引堆 最大堆的優化版

2021-08-03 17:46:18 字數 1338 閱讀 5584

最大索引堆是為了防止swap()交換大型資料帶來的低效率,所以只交換索引。所以成員變數上比最大堆多了乙個儲存索引的陣列indexs,為了更方便快捷找到某個索引在indexs中的位置,因此又新增了乙個儲存索引位置的陣列reverse,reverse[i]的值表示索引i在indexs[j]==i中的位置j;即indexs[reverse[i]]=i。

public class indexheap 

this.capacity=capacity;

this.count=0;

} //將乙個無序陣列構造成乙個最大堆 相當於堆排序

public indexheap(int arr,int n) }

private void shiftup(int i)

if(data[indexs[k]]>=data[indexs[j]]) //如果父節點大於等於子節點,則停止迴圈

break;

swap(indexs,k,j);

reverse[indexs[k]]=k;

reverse[indexs[j]]=j;

k=j; //k被賦為當前位置,為下次迴圈做初始化

} }public int size()

public boolean isempty()

public void insert(int i,int a)

public int extractmaxindex()

public boolean contain(int i)

public int getdata(int i)

//修改i索引的data值

public void set(int i,int newitem)

// }

//方法二:********優化******************

int j=reverse[i]; //優化結果:時間複雜度o(logn)

進擊的堆 最大索引堆

文章儲存在github,網速不佳的朋友,請看 進擊的堆 最大索引堆 或者 來我的技術小站 godbmw.com 堆結構的資料增刪操作,需要swap操作。雖然可以被優化成每次一次賦值,然而當元素型別是複雜資料機構 例如 類 浮點數 結構體等 賦值操作的消耗不容小覷。因此,如果可以通過交換整數資料,來實...

堆與最大堆

這篇部落格主要敘述最大堆 資料結構中的堆和作業系統的堆有點不太一樣 作業系統的堆大多用鍊錶的形式,而資料結構中的堆使用的是完全二叉樹.既然它是乙個完全二叉樹,因此就有一下性質 葉節點只能出現在最下層和次下層,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹 來自度娘 也就是說,增加結點時只能...

二叉堆 最大堆實現

include include include include include include using namespace std template typename item class maxheap void shiftdown int k public 建構函式,構造乙個空堆,可容納ca...