当前位置: 首页 > 知识库问答 >
问题:

使用fenwick树或位的数组中非递减子序列的最大和

花飞尘
2023-03-14

如何利用fenwick树求数组中一个非递减子序列的最大和?例如,我们有1 4 4 2 2 3 3 1,这里一个非递减子序列的最大和是11(1 2 2 3 3)。

共有1个答案

邹缪文
2023-03-14

可以使用动态规划算法找到最大和。扫描数组,对于每个元素,将其值添加到有效的最大子序列和(子序列以不大于该元素的值结束)。

高效的实现需要某种方法在给定的子范围内快速找到最大值。可以使用扩充的二叉搜索树来实现。Fenwick树正是扩充二叉搜索树的一种高效实现。Fenwick树最常见的用途是在某个子范围中找到一个值的和。简单的修改允许使用它来查找子范围最大值(这是有效的,因为在这个特定的情况下,Fenwick树中的值从不减少)。

有关详细信息,请参阅这段Python代码

array = [1, 4, 4, 2, 2, 3, 3, 1]

numbers = sorted(set(array))
n = len(numbers)
indexes = {numbers[v]:v+1 for v in range(0, n)}
n += 1
bit = [0] * n
result = 0

for x in array:
    pos = indexes[x]
    i = pos
    maximum = 0
    while i != 0:
        maximum = max(maximum, bit[i])
        i = i & (i-1)
    x += maximum
    i = pos
    while i < n:
        bit[i] = max(bit[i], x)
        i += i & -i
    result = max(result, x)

print(result)

时间复杂度为O(N log N)。空间复杂度为O(N)。

 类似资料:
  • 我已经设计了一个解决方案,可以使用一些测试用例,但是,对于许多我正在使用的算法是不正确的。 而不是寻求一个解决方案,我只是要求解释子序列是如何创建的,然后我将自己实现一个解决方案。 例如,输入: 6 6 问题陈述 在Quora上,我们有跟踪我们每天获得的支持投票数的聚合图。 当我们在特定大小的窗口上查看模式时,我们考虑了尽可能有效地跟踪趋势的方法,例如非递减和非递增子范围。 天数窗口定义为连续天数

  • 假设我们有一些不相交的递减序列: 我选择一些递减序列(例如按顺序,,,,的5个递减序列)并将它们级联(结果序列。 现在我想求S中最长递增子序列的长度,在上面的示例中:-> 预期时间复杂度小于O(S)。

  • LIS:最长递增子序列问题是寻找给定序列的子序列,其中子序列的元素按从低到高的顺序排序 例如: 0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15 此算法是否? 你能解释一下吗?

  • 所以我用动态编程做了一个简单的python代码来解决最大递增子序列的问题。问题如下: 给定一个数组 arr 的 N 个正整数。求出给定数组的最大和递增子序列的总和。 输入:输入的第一行包含一个整数 T,表示测试用例的数量。每个测试用例的第一行是 N(数组的大小)。每个测试用例的第二行包含数组元素。 输出:对于每个测试用例,在新行中打印所需的答案。 在我的解决方案中,我正在计算一个名为“总和”的列表

  • 如果我从根节点开始,使用一个我要遍历的子节点列表,{“有机体”、“灵长类”、“人类”、“男性”、“John Smith”},然后递归处理一个步骤,并将剩余的子列表传递给子节点,返回这个。subnodes[MyList[0]].getSubnode(MyList.getRange(1,MyList.Count-1))...即使list.getRange()是一个浅层副本,它仍然会为每一级递归创建一个