sample\algorithms\08_data_structures.hsp » Plain Format
;============================================================
; アルゴリズム 36〜40: データ構造
; 36. Union-Find (DSU, path compression + union by rank)
; 37. Fenwick Tree (BIT, 区間和 + 点更新)
; 38. Priority Queue (Min-Heap)
; 39. Stack (LIFO)
; 40. Queue (FIFO)
;============================================================
#include "hsp3cl_net_64.as"
; ----- 36. Union-Find -----
#module
#deffunc uf_init array _par, array _rk, int _n
dim _par, _n
dim _rk, _n
repeat _n : _par(cnt) = cnt : loop
return
#defcfunc uf_find array _par, int _x, local _r
_r = _x
repeat
if _par(_r) == _r : break
_r = _par(_r)
loop
return _r
#defcfunc uf_union array _par, array _rk, int _x, int _y, local _a, local _b
_a = uf_find(_par, _x)
_b = uf_find(_par, _y)
if _a == _b : return 0
if _rk(_a) < _rk(_b) {
_par(_a) = _b
return 1
}
if _rk(_a) > _rk(_b) {
_par(_b) = _a
return 1
}
_par(_b) = _a
_rk(_a)++
return 1
#global
; ----- 37. Fenwick Tree -----
#module
#deffunc bit_init array _bit, int _n
dim _bit, _n + 1
return
#deffunc bit_add array _bit, int _n, int _i, int _v, local _idx
_idx = _i + 1
repeat
if _idx > _n : break
_bit(_idx) += _v
_idx += _idx & (-_idx)
loop
return
#defcfunc bit_sum array _bit, int _i, local _idx, local _s
_s = 0 : _idx = _i + 1
repeat
if _idx <= 0 : break
_s += _bit(_idx)
_idx -= _idx & (-_idx)
loop
return _s
#global
; ----- 38. Priority Queue (Min-Heap) -----
#module
#deffunc pq_init array _pq, var _size
dim _pq, 1024
_size = 0
return
#deffunc pq_push array _pq, var _size, int _v, local _i, local _p, local _t
_pq(_size) = _v
_i = _size
_size++
repeat
if _i <= 0 : break
_p = (_i - 1) / 2
if _pq(_p) <= _pq(_i) : break
_t = _pq(_p) : _pq(_p) = _pq(_i) : _pq(_i) = _t
_i = _p
loop
return
#defcfunc pq_pop array _pq, var _size, local _top, local _i, local _l, local _r, local _s, local _t
_top = _pq(0)
_size--
_pq(0) = _pq(_size)
_i = 0
repeat
_l = 2 * _i + 1
_r = 2 * _i + 2
_s = _i
if _l < _size : if _pq(_l) < _pq(_s) : _s = _l
if _r < _size : if _pq(_r) < _pq(_s) : _s = _r
if _s == _i : break
_t = _pq(_i) : _pq(_i) = _pq(_s) : _pq(_s) = _t
_i = _s
loop
return _top
#global
; ----- 39. Stack -----
#module
#deffunc stk_init array _stk, var _size
dim _stk, 1024
_size = 0
return
#deffunc stk_push array _stk, var _size, int _v
_stk(_size) = _v
_size++
return
#defcfunc stk_pop array _stk, var _size
_size--
return _stk(_size)
#global
; ----- 40. Queue (FIFO) - リングバッファ -----
#module
#deffunc q_init array _q, var _front, var _rear
dim _q, 1024
_front = 0 : _rear = 0
return
#deffunc q_enqueue array _q, var _front, var _rear, int _v
_q(_rear) = _v
_rear++
return
#defcfunc q_dequeue array _q, var _front, var _rear, local _v
_v = _q(_front)
_front++
return _v
#global
; ===== デモ =====
mes "=== Union-Find ==="
uf_init par, rk, 5
r = uf_union(par, rk, 0, 1)
r = uf_union(par, rk, 2, 3)
r = uf_union(par, rk, 1, 2)
same = uf_find(par, 0) == uf_find(par, 3)
mes strf("find(0)=find(3)? %d", same)
mes ""
mes "=== Fenwick Tree ==="
bit_init bit, 10
bit_add bit, 10, 3, 5
bit_add bit, 10, 5, 3
bit_add bit, 10, 8, 2
mes strf("sum[0..5] = %d (期待: 8)", bit_sum(bit, 5))
mes strf("sum[0..9] = %d (期待: 10)", bit_sum(bit, 9))
mes ""
mes "=== Priority Queue (min-heap) ==="
pq_init pq, sz
pq_push pq, sz, 3
pq_push pq, sz, 1
pq_push pq, sz, 4
pq_push pq, sz, 1
pq_push pq, sz, 5
sdim pline, 128
pline = "pops: "
repeat
if sz <= 0 : break
pline += "" + pq_pop(pq, sz) + " "
loop
mes pline
mes ""
mes "=== Stack ==="
stk_init st, ssz
stk_push st, ssz, 10
stk_push st, ssz, 20
stk_push st, ssz, 30
mes strf("pop: %d, %d, %d", stk_pop(st, ssz), stk_pop(st, ssz), stk_pop(st, ssz))
mes ""
mes "=== Queue ==="
q_init q, qf, qr
q_enqueue q, qf, qr, 100
q_enqueue q, qf, qr, 200
q_enqueue q, qf, qr, 300
mes strf("dequeue: %d, %d, %d", q_dequeue(q, qf, qr), q_dequeue(q, qf, qr), q_dequeue(q, qf, qr))
end 0