在分段树中,我们在数组上方构建分段树。
例如,如果数组大小为8 [0-7]索引
分段树中的节点数是15,即1,2,4,8在第1,第2,第3,第4等级中
但是在一个问题中,如果我将结构数组大小声明为from unittest import TestCase, TestProgram
class T(TestCase):
base_path = r'(//_:link)'
def test0ok(self):
self._test(2, self.base_path)
def test1ng(self):
self._test(1, self.base_path + r'[0]')
def _test(self, expected, path):
try:
from lxml.etree import fromstring as parse_xml_string
except ImportError:
raise
root = parse_xml_string(_xhtml)
nsmap = dict(_=root.nsmap[None])
gotten = root.xpath(path, namespaces=nsmap)
gotten = len(gotten)
self.assertEqual(expected, gotten)
_xhtml = br'''
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<link rev="made" href="./" />
<link rel="contents" href="./" />
<title>te</title>
</head>
<body>
<h1>st</h1>
</body>
</html>
'''[1:]
if __name__ == r'__main__':
TestProgram()
则给出错误答案,而如果我将其声明为如下
seg tree[2*N + 1]
它给出了错误的答案。我怀疑[2 * N]是否足够,那为什么它给出了错误的答案。 具有编号9的节点段(1-1),其父编号为4.所以左子是2 * N右子是2 * N + 1
答案 0 :(得分:0)
让n
为初始数组的大小。段树的大小为:
2*n-1
是2的幂,则n
。2*2^(log_2(n)+1)-1
不是2的幂,则n
。编辑:我们可以创建一个大小为2*n-1
的数组,以便在理论上创建一个树,但是想想我们如何在段树的数组表示中从父级到子级?左子项将位于索引2*i+1
(基于0的索引),右子项将位于索引2*i+2
。为了保持这种不变性,我们必须构造完整的二叉树,为此,上面提到了公式。
您也可以参考this。