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

时间:2015-02-22 02:05:22

标签: 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 < len(string2):
        element = string1[x]
        if element == string2[y]:
            string3 += element
            x += 1
            y = 0
        else:
            y += 1
    return string1 == string3

3 个答案:

答案 0 :(得分:0)

我相信它会是O(n ^ 2),因为你的x值趋于增加,但你的y值可以继续重置为零,因此不比嵌套循环好。

答案 1 :(得分:0)

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

首先,让我们说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)。感谢

答案 2 :(得分:0)

运行时代码为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中,但这不足以检测字谜:您还必须检查每个字符的计数是否正确。

这里是算法正确性的反例:&#34; abba&#34;和&#34; barf&#34;。