【问题标题】:Modify group of values between a range修改范围之间的一组值
【发布时间】:2021-12-20 19:18:33
【问题描述】:

我有一个结构为[(2, 4), (6, 7)] 的索引范围列表。 我还有一个包含 10 个元素的数组,所有元素的值都是 False:

[False, False, False, False, False, False, False, False, False, False]

我想做的是修改这些范围之间的值并使它们为真。所以最终的名单是:

[False, True, True, True, False, True, True, False, False, False]

注意:列表的索引不是从零开始的。

我正在考虑基于两个 for 的解决方案,但它的复杂度为 N^2:

for i in range(len(list_ranges)):
    for j in range(len(my_list)):
        if (j >= list_ranges[i][0] or j <= list_ranges[i][1]):
            my_list[j] = True

如何提高算法的复杂度?

【问题讨论】:

    标签: python list performance time-complexity


    【解决方案1】:

    您可以只更新列表的相应部分(就地修改列表,您已经在使用my_list)。如果要设置的项目数相等,则列表 set-slice 是 O(K) operation

    >>> list_ranges = [(2, 4), (6, 7)]
    >>> my_list = [False, False, False, False, False, False, False, False, False, False]
    >>> list_ranges = [(2, 4), (6, 7)]
    >>> for start, end in list_ranges:
    ...     my_list[start-1:end] = [True] * (end - start + 1)
    ...
    >>> my_list
    [False, True, True, True, False, True, True, False, False, False]
    

    请注意,这将在内存中启动中间列表,然后将它们分配给原始列表中的相应索引。


    其次,如果范围列表相对较小,那么我们可以检查索引是否在给定的任何范围内。

    >>> def solve(indices, my_list):
    ...     return [any(start <= index <= end for start, end in indices) for index, item in enumerate(my_list, start=1)]
    ...
    >>> my_list = [False, False, False, False, False, False, False, False, False, False]
    >>> solve(ranges, my_list)
    [False, True, True, True, False, True, True, False, False, False]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 2020-06-05
      • 1970-01-01
      相关资源
      最近更新 更多