Skip to main content
 首页 » 编程设计

Python issubset 性能与查找集合中的元素比较

2024年09月07日43mfrbuaa

我在 Leetcode(500 键盘行)上做一个编程练习,我在讨论中遇到了 set.issubset() 。与我自己的回答进行比较后,有一个有趣的发现:

1)

def checkWord(self, word): 
    r1 = 'qwertyuiop' 
    r2 = 'asdfghjkl' 
    r3 = 'zxcvbnm' 
    row = 0 
    for idx, ch in enumerate(word): 
        if idx == 0: 
            row = 1 if ch in r1 else 2 if ch in r2 else 3 
            continue 
        coming_row = 1 if ch in r1 else 2 if ch in r2 else 3 
        if row != coming_row: 
            return False 
    return True 

如果我用这个提交,我会得到 40 毫秒的运行时间

2)

def checkWord(self, word): 
    r1 = 'qwertyuiop' 
    r2 = 'asdfghjkl' 
    r3 = 'zxcvbnm' 
    return set(word).issubset(r1) or set(word).issubset(r2) or set(word).issubset(r3) 

如果我使用 issubset(),我的运行时间为 36 毫秒,超过了所有提交的 94.87%。

3) 所以我想,嗯,这件作品有什么不同?根据我在这个主题上发现的一个问题The complextiy of Python issubset() ,方法2)的时间复杂度应该是O(len(word)),我相信这 block 应该是一样的:

def checkWord(self, word): 
    r1 = set('qwertyuiop') 
    r2 = set('asdfghjkl') 
    r3 = set('zxcvbnm') 
    row = 0 
    for idx, ch in enumerate(word): 
        if idx == 0: 
            row = 1 if ch in r1 else 2 if ch in r2 else 3 
            continue 
        coming_row = 1 if ch in r1 else 2 if ch in r2 else 3 
        if row != coming_row: 
            return False 
    return True 

但是,它的运行时间是 32 毫秒,超过了所有 py3 提交的 100%...为什么 issubset() 比这慢?谢谢!

请您参考如下方法:

请注意,您的第一个版本的 checkWord 函数不会检查 ch 值是否在 r3 集合中,因此您避免了一次检查。

此外,在您的 checkword 的第二个版本中,您使用 word 参数的字符创建了一个集合 三次 次。为什么不在使用“issubset”检查之前存储集合?你的代码将是这样的:

def checkWord3(word): 
    r1 = 'qwertyuiop' 
    r2 = 'asdfghjkl' 
    r3 = 'zxcvbnm' 
    s1 = set(word) 
    return s1.issubset(r1) or s1.issubset(r2) or s1.issubset(r3) 

这是另一种使用正则表达式的解决方案:

r1 = re.compile("^[qwertyuiop]+$") 
r2 = re.compile("^[asdfghjkl]+$") 
r3 = re.compile("^[zxcvbnm]+$") 
 
r1.match(word) or r2.match(word) or r3.match(word)