【问题标题】:conjunction of list elements列表元素的结合
【发布时间】:2022-10-16 02:29:11
【问题描述】:

列表元素算法的位 conj

【问题讨论】:

  • 提示:您需要处理已经计算的值而不是再次计算它们,例如 (1,2) (1,3), (1,4), (1,5) 。那么如何避免它们重新开始计算
  • bit_conjunction 函数看起来有问题,可能用列表的第一项(而不是 True)和剩余的列表输入 reduce()
  • @magistar 如果执行时间很重要,并且数据集很大,那为什么不呢

标签: python python-3.x list binary-tree


【解决方案1】:

一个想法是首先对列表进行一些预处理:

每一位,收集有多少在该位中有 0 的数字作为运行总和。因此,对于示例输入,它将是:

input running counts of 0 per bit
010 1, 0, 1
101 1, 1, 1
011 2, 1, 1
100 2, 2, 2
001 3, 3, 2

现在当我们收到一个请求时,我们可以比较结束点和开始点对应的计数:如果它们没有不同,那么该范围内的该位不存在 0,因此整个范围的合取将在那个位位置有一个 1。

更详细地查看它,我们实际上需要查看运行计数起点,所以我们还需要一个 0th上表中全为零的条目。

这是如何编码的:

def preprocess(nums):
    n = max(nums).bit_length()
    counters = [0] * n
    return [counters] + [
        counters := [
            count + ((num >> (n-1-i)) & 1 == 0)
            for i, count in enumerate(counters)
        ]
        for num in nums
    ]

def bit_conjunction(counters, first, last):
    val = 0
    for a, b in zip(counters[first - 1], counters[last]):
        val = val * 2 + int(a == b)
    return val


n, q = 5, 4 
nums = [2, 5, 3, 4, 1]
requests = [(1, 3),(4, 5),(2, 5),(2, 3)]

counters = preprocess(nums)
results = [
    bit_conjunction(counters, *span)
    for span in requests
]
print(results)

【讨论】:

    猜你喜欢
    • 2021-02-11
    • 2019-05-22
    • 2015-06-16
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2021-06-15
    • 2018-11-03
    相关资源
    最近更新 更多