- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
使用“sum”作为捷径进行任意计算。我有一个通过递归求和值对来从值列表中计算单个和的过程。未配对的值将被不变地提升到树上,直到可以配对为止。
在进行了这种计算之后,我正在寻找平衡计算的最佳方法(即访问数组元素/节点所需的操作数)以及一维数组中所有节点的最简洁的编码(即无间隙,零值) (或重复值),并且最好没有额外的索引数组,该数组不能从简洁编码中轻松得出,因此必须将其与数组一起保存。
尽管以下是简单的示例,但实际上,初始列表中的值数量可能非常大(2 ^ 47或更多)。
例如,给定列表[1、2、3、4],该数组是微不足道的:[10、3、7、1、2、3、4],并很好地拆分为易于按节点寻址的行,或作为对整个行的引用。
但是对于5项列表,树看起来像这样:
树1
15
/ \
/ \
/ \
/ \
10 5
/ \ / \
3 7 5 -
/ \ / \ / \ / \
1 2 3 4 5 - - -
left = i*2+1
,
right = i*2+2
为我们提供了以下数组:
[ 15, 10, 5, 3, 7, 5, nil, 1, 2, 3, 4, 5, nil, nil, nil]
[15, 10, 3, 7, 1, 2, 3, 4, 5]
15
/ \
/ \
10 \
/ \ \
3 7 \
/ \ / \ \
1 2 3 4 5
1. [1, 2, 3, 4]
2. [3, 7]
3. [10, 5]
4. [15]
最佳答案
假设您的树在最后(最多)行上具有N
节点。
如果确实存储仅向上传播的节点,则树的总数在2*N-1
和2*N-1+log2(N)
节点之间。节点的确切总数由OEIS A120511给出。其中,最多floor(2 + log2(N-1))
是复制/传播的节点。
树上有floor(2 + log2(N-1))
行。作为N
的函数的行数(最后一行的元素数)是OEIS A070941。
这样的树中的行数非常低。例如,如果最后一行有240≈1,000,000,000,000个节点,则树中只有42行。对于264个节点,您只有66个。因此,如果您需要每行进行一些操作,则开销不会很高。
给定最后一行N
中的节点数,一个简单的对数时间函数可以计算行数和节点总数。
# Account for the root node
rows = 1
total = 1
curr_left = N
While (curr_left > 1):
rows = rows + 1
total = total + curr_left
curr_left = (curr_left + 1) / 2
End While
/
表示整数除法,即任何小数部分都被丢弃/截断/舍入为零。同样,对于最后一行中的264个节点,以上仅循环65次。
first_offset = []
nodes = []
curr_row = rows - 1
curr_offset = total - N
curr_left = N
While (curr_left > 1):
nodes[curr_row] = curr_left
first_offset[curr_row] = curr_offset
curr_row = curr_row - 1
curr_left = (curr_left + 1) / 2
curr_offset = curr_offset - curr_left
}
first_offset[0] = 0
nodes[0] = 1
N
是最后一行中的节点数,则应用上面的内容,然后
rows
是树total
是树nodes[r]
和r
r >= 0
行上有
r < rows
节点
r
上的节点的数组索引,列c
是first_offset[r] + c
r
上的节点,列c
上,带有r > 0
,在行r-1
上,列c/2
上有一个父节点,数组索引为first_offset[r-1] + c/2
r
(列c
)上的节点(带有r < rows - 1
),在行r+1
(列2*c
)上具有左子节点,数组索引为first_offset[r+1] + 2*c
r
行,第c
列上的节点(带有r < rows - 1
和c < nodes[r] - 1
)在第r+1
行,第2*c+1
列上有一个正确的子节点,在数组索引first_offset[r+1] + 2*c + 1
上r
,列c
上的节点(带有r < rows - 1
和c < nodes[r] - 1
)具有左右两个子uint64_t
),则所有阅读器都可以恢复
total
,
rows
,
first_offset[]
和
nodes[]
,并轻松导航树。 (但是,请注意,您不仅可以使用数组索引,还可以使用“column”和“row”,并使用它们来派生数组索引。)
first_offset[]
和
nodes[]
数组最多具有几十个条目,因此它们应在高速缓存中保持高温,并且使用它们不应损害性能。
total
)有效,则可以使用二进制搜索以
N
时间复杂度为基础,根据
total
查找
O(log2(total)*log2log2(total))
,如果使用简单循环,则可以以
O((log2(total))²)
为基础。请记住,
total
在
2*N-1
和
2*N-1+log2(N)
之间。相反,
N
不能大于
(N + 1)/2
或小于
(N + 1)/2 - log2(total)
,因为
total
大于
N
,因此
log2(N)
小于
log2(total)
。因此,二进制搜索可以实现为
Function Find_N(total):
Nmax = (total + 1) / 2
Nmin = Nmax - log2(total)
t = Total(Nmin)
If t == total:
Return Nmin
Else if t < total:
Return "Bug!"
End if
t = Total(Nmax)
if t == total:
Return Nmax
Else if t > total:
Return "Bug!"
End if
Loop:
N = (Nmin + Nmax) / 2
If N == Nmin:
Return "Invalid tree size!"
End If
t = Total(N)
If t > total:
Nmax = N
Else if t < total:
Nmin = N
Else:
return N
End If
End Loop
End Function
1 + log2(64)
进行
Total
= 6调用,该函数实现了此答案中的第一个伪代码段。由于通常每个程序调用仅需要一次,因此开销实际上是不相关的。
log2(x)
来计算
log(x)/log(2)
,并使用
log2()
中的
<math.h>
函数(但是由于
double
的精度不及
uint64_t
,我会在结果中添加
+1
,或者使用
ceil()
将其四舍五入为正无穷大),甚至使用一个简单的循环:
Function ulog2(value):
result = 0
While (value > 0):
result = result + 1
value = value / 2
End While
Return result
End Function
/
再次表示整数除法。
关于c - 求和,数组构造和寻址的简洁二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44895747/
我正在尝试提供即时转码的视频。不幸的是,这意味着寻求不起作用。我假设这是因为浏览器不知道视频有多长,因此无法正确显示搜索栏。 有谁知道是否可以对视频的时长进行硬编码? 我想到的另一个选择可能是创建我自
我是一名优秀的程序员,十分优秀!