大根堆(模板)

2022-05-05 20:51:12 字數 2016 閱讀 6334

今天學了大根堆,第一次從頭到尾個人手打,雖說有些stl能代替堆但效率很低,算了算300000的資料甚至要跑500ms。。。。

也算記錄一下吧。

自己的:83ms(300000)

%:pragma gcc optimize(3

)#include

#define n 500010

#define inf 0x3f3f3f3f

using

namespace

std;

struct

heap

void adjust_up(int

i)//查詢父親節點是否比兒子節點小,如果有,交換,直到沒有

if(heap[i]>heap[fa])

}void adjust(int size,int

i)//調整父親和兒子節點,以保證父親節點一定大於兒子

else

if(rs<=size&&heap[rs]>heap[maxa])

if(heap[maxa]!=heap[i])

}void push(int

x)int

top()

void

pop()

bool

empty()

return

false;}

};int

main()

my_heap.size--;

while(!my_heap.empty())

endtime =clock();

time1=(double)(endtime - starttime) /clocks_per_sec;

printf(

"%.6lf

",time1);

return0;

}

老師的:71ms(300000)

#include using

namespace

std;

const

int n = 300000

;struct

heap

void push (int

x) heap[i] =heap[p];

i =p;

}heap[i] =x;

}intpop()

heap[i] =heap[lson];

i =lson;

}heap[i] =x;

return

ret;

}bool

empty()

};int

a[n];

intmain ()

//start here

clock_t mystart =clock();

for (int i = 0; i < n; i++)

while(!my_heap.empty())

clock_t myend =clock();

//end here

priority_queue

heap;

clock_t start =clock();

for (int i = 0; i < n; i++)

while(!heap.empty())

clock_t end =clock();

cout

<< "

running time of xjoi machine is:

"<< static_cast (myend-mystart)/clocks_per_sec*1000

<< "ms"

<< "

running time stl is:

"<< static_cast (end-start)/clocks_per_sec*1000

<< "ms"

}

每天刷題身體棒棒!

堆(大根堆 小根堆)

堆又可稱之為完全二叉堆。這是乙個邏輯上基於完全二叉樹 物理上一般基於線性資料結構 如陣列 向量 鍊錶等 的一種資料結構。學習過完全二叉樹的同學們都應該了解,完全二叉樹在物理上可以用線性資料結構進行表示 或者儲存 例如陣列int a 5 就可以用來描述乙個擁有5個結點的完全二叉樹。那麼基於完全二叉樹的...

堆(Heap)大根堆 小根堆

具有以下的特點 1 完全二叉樹 2 heap中儲存的值是偏序 min heap 父節點的值小於或等於子節點的值 max heap 父節點的值大於或等於子節點的值 一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為...

堆(Heap)大根堆 小根堆

目錄一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為1和2。插入乙個元素 新元素被加入到heap的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個...