之前的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...