Hatena::Grouptopcoder

週刊 spaghetti_source

2012-08-31

Randomized Meldable Heap

09:26

// Randomized Meldable Heap
// - merge : merge two heaps
// - push  : insert element to the heap
// - pop   : delete minimum element in the heap
// - top   : return minimum element in the heap
const int MAXSIZE = 10100200;
int N = 1;
int key[MAXSIZE];
int ch[2][MAXSIZE];
int merge(int i, int j) {
  if (!i || !j) return i ? i : j;
  if (key[i] > key[j]) swap(i, j);
  int b = rand() % 2;
  ch[b][i] = merge(ch[b][i], j);
  return i;
}
int push(int i, int k) { return merge(i, newnode(k)); }
int pop(int i) { return merge(ch[0][i], ch[1][i]); }
int top(int i) { return key[i]; }

2つのヒープ構造をマージする際,左右どちらにマージするかをランダムに決定するだけでmergeの期待計算量がO(log n)になる.

証明

マージ接点の動きは木の上のランダムウォークになるから,その期待歩数がO(log n)であることを示せば十分.期待歩数をf(n)とするとf(n) = 1 + f(n1)/2 + f(n2)/2となる.ただしn1とn2は左右の子の数.n未満のmについてf(m)≦c log mを仮定する.c も十分大きいものとしておく.すると f(n) ≦ 1 + c/2 ( log(n1) + log(n2) ) となる.右辺を 1 + n1 + n2 = n の条件で最大化する.logは凹関数なので真ん中付近を取るのがベスト.n1 = n2 = 1/2 を代入して f(n) ≦ 1 + c log(n) - c ≦ c log(n).


実時間比較

比較対象はskew heap, randomized heap, std::priority_queue, std::multiset.

skew heapとrandomized heapはどちらもmerge操作を基本とするmeldable heapだから,ど正面からの競合相手.priority_queueとmultisetはmeldableでないので競合相手でないが,リファレンスとして.

実験に用いたインスタンスは5例で,サイズはn = 10,000,000.

言語はC++(G++4.3.3)で,コンパイルオプションは -O2.

-skew heaprand heappqueuemultiset
ランダム28.4134.053.3117.47
単調増加13.8526.161.285.44
単調減少0.220.281.125.21
増加後減少12.7023.351.514.56
減少後増加5.9611.281.364.57

結論:rand heapはskew heapに2倍程度劣る(時間差はおおむねrand()関数の呼び出しの時間).とはいえ高々2倍なのでskew heapの回転方向を忘れちゃったテヘペロなときは有力な選択肢かもしれない・・・?

お久しぶりです

09:21

環境も変わったので,少しずつ再開していきます.

aiivequsaiivequs2019/11/18 01:24http://mewkid.net/where-is-xena/ - Amoxicillin 500mg Capsules <a href="http://mewkid.net/where-is-xena/">Amoxicillin</a> ffk.auyn.topcoder-g-hatena-ne-jp.jag-icpc.org.vsw.xv http://mewkid.net/where-is-xena/

adukihtiadukihti2019/11/18 01:34http://mewkid.net/where-is-xena/ - Amoxicillin 500mg <a href="http://mewkid.net/where-is-xena/">Buy Amoxicillin</a> dva.opxx.topcoder-g-hatena-ne-jp.jag-icpc.org.qou.zb http://mewkid.net/where-is-xena/

azsoyiosedazsoyiosed2019/11/18 01:41http://mewkid.net/where-is-xena/ - Buy Amoxicillin Online <a href="http://mewkid.net/where-is-xena/">Buy Amoxicillin</a> boj.riyx.topcoder-g-hatena-ne-jp.jag-icpc.org.vsh.zv http://mewkid.net/where-is-xena/

uokesanafsuokesanafs2019/11/18 02:07http://mewkid.net/where-is-xena/ - Buy Amoxicillin Online Without Prescription <a href="http://mewkid.net/where-is-xena/">Buy Amoxil</a> tfh.iwur.topcoder-g-hatena-ne-jp.jag-icpc.org.acf.bc http://mewkid.net/where-is-xena/