0
点赞
收藏
分享

微信扫一扫

树状数组求区间和 golang

一点读书 2022-03-11 阅读 102
数据结构

树状数组,看起来像树的数组

先贴代码,讲解后续补

树状数组,求区间和:


// 树状数组,求区间和

type TreeArray struct {
	originArray []int
	treeArray   []int
	Len         int
}

func (t *TreeArray) Init(array []int) {
	t.Len = len(array)
	// 0~n-1 转换为 1-n
	t.originArray = []int{0}
	t.originArray = append(t.originArray, array...)
	t.treeArray = make([]int, t.Len+1)
}

func (t *TreeArray) build() {
	for i := 1; i <= t.Len; i++ {
		t.addValue(i, t.originArray[i])
	}
}

// 单点更新
func (t *TreeArray) addValue(index int, value int) {
	// 递归更新,每次找父节点
	for ; index <= t.Len; index += index & -index {
		t.treeArray[index] += value
	}
}

// 前缀查询
func (t *TreeArray) prefixQuery(index int) int {
	var sum int
	for ; index >= 1; index &= index - 1 {
		sum += t.treeArray[index]
	}
	return sum
}

// 区间查询
func (t *TreeArray) sectionQuery(left int, right int) int {
	return t.prefixQuery(right) - t.prefixQuery(left-1)
}

func main() {
	var t TreeArray
	t.Init([]int{1, 2, 3, 4, 5, 6, 7, 8})
	t.build()
	t.addValue(3, 10)
	fmt.Println(t.sectionQuery(2, 7))
}

 

举报

相关推荐

0 条评论