字谜排序版本与计数字符版本

Posted

技术标签:

【中文标题】字谜排序版本与计数字符版本【英文标题】:Anagram sorting version vs Counting characters version 【发布时间】:2019-11-13 19:15:57 【问题描述】:

我正在学习时间复杂性,理论上我已经读过要检查 Anagram 是否有两个相同长度的字符串,可以有两个版本:

    对字符串进行排序并比较 O(nlogn) 计算字符 O(n)

但我想继续使用代码体验同样的体验。

所以我编写了两个版本的代码并使用 python timeit 模块检查时间,但我得到了不同的结果。

import timeit


def method_one(input1, input2):
    """
    Check if two string are anagram 
    """

    if len(input1) == len(input2):
        if sorted(input1) == sorted(input2):
            return True
    return False

def method_two(input1, input2):
    """
    Check if two string are anagram using count the character method
    """
    count_char = [0] * 26

    if len(input1) == len(input2):
        for i in range(0, len(input1)):
            count_char[ord(input1[i])-ord("a")] += 1
            count_char[ord(input2[i])-ord("a")] -= 1

        for i in count_char:
            if(bool(i)):
                return False
        return True
    return False

timer1 = timeit.Timer("method_one('apple','pleap')", "from __main__ import method_one")
timer2 = timeit.Timer("method_two('apple','pleap')", "from __main__ import method_two")

print(timer1.timeit(number=10000))
print(timer2.timeit(number=10000))
method_one: 0.0203204
method_two: 0.1090699

理想情况下,计数字符应该会赢,但结果与我的预期相反。

【问题讨论】:

【参考方案1】:

时间复杂度描述了当算法的输入增加时算法的执行时间如何扩展。由于它忽略了常量,因此具有更好时间复杂度的算法不能保证比其他具有更高界限的算法运行得更快。

时间复杂度告诉您的是,当输入大小接近无穷大时,最有效的算法将运行得更快。

【讨论】:

以上是关于字谜排序版本与计数字符版本的主要内容,如果未能解决你的问题,请参考以下文章

数据结构从0到1第六篇:排序(下)

如何对包含多个字符串的结构应用基数排序(使用计数排序)

如何对性能计数器类别进行版本控制?

4.9 桶排序

列表(索引与切片,增删改查) ,计数,排序,元祖和元祖的嵌套

使用python实现希尔计数基数排序