08_data_structures.hsp

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