【问题标题】:How to determine the complexity of python code?如何判断python代码的复杂度?
【发布时间】:2020-03-28 13:07:40
【问题描述】:

我需要了解以下代码的复杂性。我熟悉所有 Big O() 表示法的概念,也阅读了很多博客,但我不知道如何应用于大型程序。 以下是从 100 到 999 的最大回文数的代码:

def isPaindrome(number):
    stringNum = str(number)
    firstDigit_index,lastDigit_index=0,len(stringNum)-1
    isPalindrome = False
    while(lastDigit_index > 0 and firstDigit_index < lastDigit_index):
        #print(stringNum[f],"==",stringNum[l],"......")
        if(stringNum[firstDigit_index]==stringNum[lastDigit_index]):           
            isPalindrome = True
        else:
            isPalindrome = False
            break
        firstDigit_index = firstDigit_index + 1
        lastDigit_index = lastDigit_index - 1

    if(isPalindrome):
        return number
    else:
        return 0

max = 0
startRange = 100
endRange = 999
for i in range(endRange*endRange,startRange*startRange,-1):
    factors = []
    result = isPaindrome(i)
    if(result!=0):
        for i in range(startRange,endRange+1):
            if(result%i==0):
                factors.append(i)
        if(len(factors)>1):
            sumFactor = factors[(len(factors))-1] + factors[(len(factors))-2]
            mul = factors[(len(factors))-1] * factors[(len(factors))-2]
            if(sumFactor>max and mul==result):
                max = sumFactor     

                print("Largest Palindrome made from product of two 3 digit numbers(",factors[(len(factors))-1],",",factors[(len(factors))-2] ,") is", result,".")

如果有人能让我逐步了解如何计算,我将不胜感激。

【问题讨论】:

  • Emm.. 你的代码不应该工作?您没有更改 isPalindrome 函数中的索引
  • 您是否正在尝试解决 Project Euler 问题 4? projecteuler.net/problem=4
  • 是的,它确实有效。现在来看看函数。 @GarethMa。
  • 还是O(n),复杂度和我分析的差不多

标签: python time-complexity complexity-theory


【解决方案1】:

正如我所提到的,您的 isPalindrome 函数实际上是不正确的,因为您没有更改索引。我也改变了一些你的,所以这是我正在分析的版本。 (我只是在分析isPalindrome函数,因为我实在看不懂main函数在做什么),不好意思!

def isPalindrome(n):
  num = str(n)
  head, tail = 0, len(num) - 1
  while tail > head:
    if num[head] != num[tail]: # Not symmetrical!! WARNING!
      return False
    head += 1 # move position
    tail -= 1 # move position
  return True

此代码平均为O(|n|),即 O(log N),其中 N 是数字。这是因为平均而言,if 比较有 50% 的机会中断(返回 False)和 50% 的继续。因此,预期的比较次数将是 |n|/4,即 O(|n|)。

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多