段树数据结构中的数组大小

时间:2016-05-13 04:45:25

标签: c++ arrays data-structures tree segment-tree

在分段树中,我们在数组上方构建分段树。
例如,如果数组大小为8 [0-7]索引 分段树中的节点数是15,即1,2,4,8在第1,第2,第3,第4等级中 enter image description here
但是在一个问题中,如果我将结构数组大小声明为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]是否足够,那为什么它给出了错误的答案。 enter image description here具有编号9的节点段(1-1),其父编号为4.所以左子是2 * N右子是2 * N + 1

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