索引堆的優化

2021-10-08 07:10:23 字數 1449 閱讀 4214

之前的change函式如下

//希望將索引為i的元素的值修改為 newitem

void

change

(int i, item newitem)

}}

【優化思路】

【**實現】

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

template

<

typename item>

class

heapindexmax

}void

shiftdown

(int k)

if(data[index[k]

]> data[index[j]])

swap

(index[k]

, index[j]);

rev[index[k]

]= k;

rev[index[j]

]= j;

k = j;}}

public

:heapindexmax

(int capacity)

count =0;

this

->capacity = capacity;

}//傳入的 i 對於使用者而言,是從0開始的

void

insert

(int i, item item)

item extractmax()

//返回最大元素的索引

intextractindexmax()

//檢查索引為i的元素是否存在於堆中

bool

contain

(int i)

//返回索引為i的資料

item getitem

(int i)

//希望將索引為i的元素的值修改為 newitem

void

change

(int i, item newitem)

~heapindexmax()

};

【演算法分析】

我們通過維護乙個陣列rev,可以通過o(1)的時間複雜度找到索引為 i 的元素在index中的位置,所以change函式的時間複雜度提公升至o(logn)

【堆的效能其實還可以優化】

進擊的堆 最大索引堆

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

dijkstra的堆優化

如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。一行,包含n個用空格分隔的整數,其中第i個整數表示從點s出發到點i的最短...

索引的優化

1 max 對於max取某一列最大值的時候,優化方案就是建立索引,然後倒敘排列然後取第乙個 2 count 和 count id 的區別 如果某一列存在null的話,那麼null的行將不被統計。例如有id和name兩列,有100行資料 count 為100 count name 為98,兩行null...