Python 对代码的大O符号感到困惑吗

Python 对代码的大O符号感到困惑吗,python,big-o,Python,Big O,我试图在不使用任何辅助排序函数和嵌套循环的情况下找出给定的字符串是否是字谜 因此,我尝试使用while循环;然而,我不确定这段代码的大O符号是什么。你能帮忙吗 def anagrams(string1, string2): if len(string1) != len(string2): return False string3 = "" x = 0 y = 0 while x < len(string1) and y < le

我试图在不使用任何辅助排序函数和嵌套循环的情况下找出给定的字符串是否是字谜

因此,我尝试使用while循环;然而,我不确定这段代码的大O符号是什么。你能帮忙吗

def anagrams(string1, string2):
    if len(string1) != len(string2):
        return False
    string3 = ""
    x = 0
    y = 0
    while x < len(string1) and y < len(string2):
        element = string1[x]
        if element == string2[y]:
            string3 += element
            x += 1
            y = 0
        else:
            y += 1
    return string1 == string3
def字谜(string1、string2):
如果len(string1)!=len(string2):
返回错误
string3=“”
x=0
y=0
当x
我认为它将是O(n^2),因为x值趋于增加,但y值可以继续重置为零,因此并不比嵌套循环好。

我将尝试提供一个明确的示例。

首先,让我们假设string1='ABC'和string2='DE'。
len(string1)=3,len(string2)=2
我们首先比较string1[0]和string2[0],不一样,y++
我们第二次比较string1[0]和string2[1],不一样,y++
走出循环;返回false

其次,假设string1='ABC'和string2='AC'
我们首先比较string1[0]和string2[0],相同的是x++;string3+=string1[0]
我们第二次比较string1[1]和string2[1],不一样,y++
退出循环,返回false

第三,假设string1='AB'和string2='AB'
我们首先比较string1[0]和string2[0],相同的是x++;string3+=string1[0] string3='A'
我们第二次比较string1[1]和string2[0],不一样,y++
我们第三次比较了string1[1]和string2[1],同样是x++;string3+=string1[1]string3='AB'
;我们知道它会回到现实

因此,O(n+m),给定n=len(string1),m=len(string2)。谢谢

代码在运行时为O(N^2),但不正确

该代码相当于:

def anagrams(s1, s2):
    if len(s1) != len(s2): return False
    r = ''
    for s in s1:
        if s in s2: r += s
    return r == s1
这样写,很明显是O(N^2)

这将检查s1中的每个字符是否也在s2中,但这不足以检测字谜:还必须检查每个字符的计数是否正确


下面是算法正确性的反例:“abba”和“barf”。

这段代码测试的是string1和string2字谜?它有效吗?你对时间复杂度、空间复杂度或两者的结合感兴趣吗?Big-O表示法可用于其中之一。它是否检查
sorted(string1)==sorted(string2)
O(n log n)
time)即
len(string1)==len(string2)和all(string1.count(c)==string2.count(c)对于集合中的c(string1))
O(n)
time)?我认为它检查每个字符的计数。无论如何,谢谢你@user4592697您认为您的代码是正确的,或者您检查了它,它在我给您的反例中返回了正确的结果?糟糕!我很抱歉!你是对的:)你能就如何降低时间复杂度提出建议吗?@user4592697你可以在此网站上搜索现有答案。***如果两个字符串长度不同,它将返回false而不继续。无论如何谢谢你***澄清一下:准确地说,big Oh表示法只包含多项式的最高元素,因此(m+n)的简单函数的运行时间是O(n)或O(m),O(m+n)是没有意义的。你能告诉我如何找到两个字符串是否是anagram,以便它比O(n^2)更好吗还是嵌套循环?将两个字符串排序为字符数组并进行比较。排序应该是O(n logn),以避免排序。不过这很有帮助。非常感谢。可以使两个int数组的长度为n个元素,其中n是可能的字符数(ascii为256)。用零初始化每个数组。循环遍历每个字符串,并为每个字符串增加char值的数组索引。现在,每个数组都有一个或另一个字符串中每个字符的编号,只需在数组中循环并比较即可。这假定您使用的是一个小字符集。运行时应该是O(n),这看起来不错。我只是做了一些类似的事情,但使用了字典。可以吗?def anagrams(string1,string2):dict1={}dict2={}表示string1中的字母:dict1[letter]=0表示string2中的字母:dict2[letter]=0表示string1中的字母:dict1[letter]+=1表示string2中的字母:dict2[letter]+=1返回dict1==dict2打印anagrams('barug','arugb')