aboutsummaryrefslogtreecommitdiffstats
path: root/utils.go
blob: fe176504061aa9314986f6c4429ecbcf344877dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package main

import (
	"math/rand"
	"sort"
)

// floor of log(x) (i.e MSB for positive integers)
func Log(x int64) int64 {
	var r int64 = 0
	for ; x > 1; x >>= 1 {
		r++
	}
	return r
}

// squared exponentiation
func Pow(x int64, n int64) int64 {
	var r int64 = 1
	for i := n; i > 0; i >>= 1 {
		if i&1 == 1 {
			r *= x
		}
		x *= x
	}
	return r
}

// convert BFS order to DF-post-order, dark magic
func Post(size int64, height int64, id int64) int64 {
	id += 1
	s := int64(1) << uint64(height-Log(id)) // size of the substree rooted at id
	r := s - 2
	for ; id > 1; id >>= 1 {
		if id&1 == 1 { // right child
			r += s - 1
		}
		s <<= 1
	}
	return r
}

func Shuffle(data sort.Interface) {
	var j int
	for i := data.Len() - 1; i > 0; i-- {
		j = rand.Intn(i + 1)
		data.Swap(i, j)
	}
}