【问题标题】:Given two integers m and n, where m >= n, how can you create a generator to return all the sliding windows?给定两个整数 m 和 n,其中 m >= n,如何创建一个生成器来返回所有滑动窗口?
【发布时间】:2020-12-18 14:03:36
【问题描述】:

为了澄清考虑两个字符串,一个长度为 m,另一个长度为 n。

例如 m = 3 和 n = 2,其中 s1 = abc 和 s2 = de。

首先我们比较:

 abc 
de
and generate tuple (0, 1) (as a and e are being compared, so give their indices)
then slide string s2

 abc 
 de
generate (0, 0) {compare a and d} 
generate (1, 1) {compare b and e}
 slide string s2

 abc 
  de
generate (1, 0) {compare b and d} 
generate (2, 1) {compare c and e}
 slide string s2

 abc 
   de
generate (2, 0) {compare c and d} 

所以我们按顺序返回 generate (0, 1), (0, 0), (1, 1), (1, 0), (2, 1), (2, 0)

如果例如 m = 2 并且 n = 2

我们将使用滑动较小字符串的相同方法生成 (0, 1), (0, 0), (1, 1), (1, 0)。

【问题讨论】:

    标签: python arrays string rolling-computation sliding-window


    【解决方案1】:
    out = (
        (i1, i2)
        for anchor in range(n-1, -m, -1)
        for i1, i2 in enumerate(range(anchor, n))
        if 0 <= i1 < m and 0 <= i2 < n
    )
    

    测试

    for m, n in [(3, 2), (2, 2), (5, 3)]:
        out = (
            (i1, i2)
            for anchor in range(n-1, -m, -1)
            for i1, i2 in enumerate(range(anchor, n))
            if 0 <= i1 < m and 0 <= i2 < n
        )
        print(*out, '', sep='\n')
    

    输出

    (0, 1)
    (0, 0)
    (1, 1)
    (1, 0)
    (2, 1)
    (2, 0)
    
    (0, 1)
    (0, 0)
    (1, 1)
    (1, 0)
    
    (0, 2)
    (0, 1)
    (1, 2)
    (0, 0)
    (1, 1)
    (2, 2)
    (1, 0)
    (2, 1)
    (3, 2)
    (2, 0)
    (3, 1)
    (4, 2)
    (3, 0)
    (4, 1)
    (4, 0)
    

    【讨论】:

    • 它似乎适用于我已验证的一些示例;你知道为什么它可能不起作用吗?
    • 要求生成器,因此将您的[] 更改为(),它应该可以工作。无论如何,我们在这些测试用例中都得到了相同的输出,这很好。看起来你的 anchor 是我的 -i
    【解决方案2】:

    你可以这样做:

    m = 3
    n = 2
    
    gen = ((j+i, j) 
           for i in range(1-n, m)
           for j in range(max((0, -i)), min((n, m-i))))
    
    for t in gen:
        print(t)
    

    给予:

    (0, 1)
    (0, 0)
    (1, 1)
    (1, 0)
    (2, 1)
    (2, 0)
    

    这里:

    • i 是两个字符串的第一个字符之间的偏移量(在您的示例中按该顺序从 -1 到 2)
    • j 是第二个字符串 (s2) 中的索引

    【讨论】:

    • 老实说,这是一个更好的答案,它可以扩展到大窗口,因为它避免了超出范围的选项
    • @RichieV 不确定 OP 希望使用多长的字符串,但是是的,我想你是对的,最好不要生成超出范围的选项,而只需要过滤掉它们。在实践中,如果 n 很小,m 是否很大并不重要(因为超出范围的选项的数量与 m 无关),但如果它们都很大,就会出现问题。即便如此,当您谈论可扩展性时,虽然是的,当我测试它时,您的解决方案比这慢了大约 3-4 倍(使用 m=n 时),两种算法的时间复杂度完全相同 O(n^2) .
    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 2021-06-09
    • 2013-11-30
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多