Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果我写了两个软件,计算相同的东西,但其中一个速度是原来的两倍。这是否意味着复杂性的不同顺序?_Python_Algorithm_Python 3.x_Complexity Theory - Fatal编程技术网

Python 如果我写了两个软件,计算相同的东西,但其中一个速度是原来的两倍。这是否意味着复杂性的不同顺序?

Python 如果我写了两个软件,计算相同的东西,但其中一个速度是原来的两倍。这是否意味着复杂性的不同顺序?,python,algorithm,python-3.x,complexity-theory,Python,Algorithm,Python 3.x,Complexity Theory,对于给定的余额和利率,我的程序计算一年内偿还债务的最低月付款额。 但是,其中一个在约0.000150秒内计算,另一个在约0.000300秒内计算。这是否意味着不同程度的渐进复杂性 以下是代码示例: 慢一点的: import time start_time = time.time() balance = 999999 annualInterestRate = 0.18 mRate = annualInterestRate/12 high = (((mRate+1)**12)*balance)/1

对于给定的余额和利率,我的程序计算一年内偿还债务的最低月付款额。 但是,其中一个在约0.000150秒内计算,另一个在约0.000300秒内计算。这是否意味着不同程度的渐进复杂性

以下是代码示例:

慢一点的:

import time
start_time = time.time()

balance = 999999
annualInterestRate = 0.18
mRate = annualInterestRate/12
high = (((mRate+1)**12)*balance)/12
low = balance/12
guessed = False

def balanceLeft(balance,mRate,minPayment):
    monthsLeft = 12
    while monthsLeft > 0:
        unpaidBalance =  balance - minPayment
        interest = mRate * unpaidBalance
        balance = unpaidBalance
        balance += interest
        monthsLeft -= 1
    return balance

while guessed == False:
    minPayment = (high + low) / 2
    if round(balanceLeft(balance,mRate,minPayment),2) < 0:
        high = minPayment
    elif round(balanceLeft(balance,mRate,minPayment),2)> 0:
        low = minPayment
    else:
        if abs(round(balanceLeft(balance,mRate,minPayment),2) - 0) < 0.01:
            guessed = True

print('Lowest Payment: ',end='')
print(round(minPayment,2))

print("time elapsed: {:.6f}s".format(time.time() - start_time))

不,它们不是同一个程序。第一个有一个while循环,调用一个函数,该函数有另一个while循环——看起来,两者的复杂性不同

第一个显然是较慢的一个平方复杂度程序-第二个没有这样的内部循环,是一个线性复杂度程序

绝对不是

渐近复杂性从不描述绝对运行时间,而是描述问题规模增大时的趋势


在实践中,对于小问题实例,具有较好渐近复杂性的算法运行速度较慢的情况极为常见。

翻译成一个口头想法,您试图通过对分法求解线性方程a-b*x=0,第一种方法是通过对分法,第二种方法是通过直接公式x=a/b。纯粹从描述来看,第二个变量总是更快,因为第一个变量还需要计算a和b resp。每一步都是b*x

您经常会发现,对于存在直接解公式的方程,运行此公式要比任何迭代近似方法快得多


不幸的是,没有那么多的问题类与直接解决方案公式。但是在这里,一个线性问题总是可以直接解决的,对于高维线性系统,效率参数会发生变化。

在评论中,对不起,我的角色已经用完了。这是否意味着这些代码具有不同程度的渐进复杂性对不起,我的印象是,它描述了运行时随着问题规模的增加而出现的趋势?这不是正确的答案,也是因为它们的运行方式不同。虽然它们在功能上可能相同-实现不同-使第一个变慢,第二个变快。@ChrisIkeokwu:不,因为隐藏常数。@ChrisIkeokwu:它确实描述了运行时随着问题规模增加的趋势。然而,我可以有一个算法,10个项目需要1s,100个项目需要2s,这是Olog n,另一个算法10个项目需要.1s,100个项目需要1s,这是On²。但是,请注意,On²算法实际上更快。@MartinBonner:我花了一段时间才看到1之前的点,而你的计算是错误的。应该是10秒。在声明O fn复杂性之前,需要定义n。我认为你的分析是站不住脚的,因为循环会在不同的事物上迭代。我没有声明复杂性,在我的回答中没有提到任何符号或任何东西——只是给出了事物如何工作的想法。如果他们在不同的东西上迭代,它会像Om*n一样有资格产生一个缓慢的算法。
import time
start_time = time.time()

annualInterestRate = 0.18
rate = annualInterestRate / 12
monthsLeftr = 12
xCoefficent = 1 + rate
ConstantTerm = 1 + rate
while monthsLeftr > 1:
    xCoefficent = (xCoefficent + 1) * ConstantTerm
    monthsLeftr -= 1


balance = 999999
monthsLeft = 12
while monthsLeft > 0:
    balance = balance * ConstantTerm
    monthsLeft -= 1
minPayment = balance / xCoefficent


print('Lowest Payment: ', end="")
print(round(minPayment,2))

print("time elapsed: {:.6f}s".format(time.time() - start_time))