今天學了大根堆,第一次從頭到尾個人手打,雖說有些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 usingnamespace
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的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個...