Если я напишу две части программного обеспечения, которые вычисляют одно и то же, но каждый делает это в два раза быстрее. Означает ли это разные порядки сложности?

-4

Для данного баланса и процентной ставки мои программы вычисляют минимальный ежемесячный платеж для погашения задолженности в год. Однако он вычисляет его в среднем в ~ 0.000150, а другой в ~ 0.000300s. Означает ли это разную степень асимптотической сложности?

Это примеры кода:

Чем медленнее:

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))

Чем быстрее

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))

спросил(а) 2020-03-26T15:01:16+03:00 2 месяца назад
1
Решение
91

Точно нет.

Асимптотическая сложность никогда не описывает абсолютное время работы, а тренд, когда размер проблемы увеличивается.

На практике чрезвычайно часто, что алгоритмы с лучшей асимптотической сложностью выполняются медленнее для небольших экземпляров задачи.

ответил(а) 2020-03-26T15:14:58.789486+03:00 2 месяца назад
37

Нет, это не та же программа. Первый имеет цикл while, который вызывает функцию, у которой есть другой цикл while - похоже, оба они имеют разную сложность.

Первый из них, очевидно, является более медленным (сложная программа сложности) - вторая не имеет таких внутренних циклов и представляет собой программу линейной сложности.

ответил(а) 2020-03-26T15:01:16+03:00 2 месяца назад
39

Переходя к вербальной идее, вы пытаетесь решить линейное уравнение ab*x=0 в первом варианте через метод деления пополам во втором методе по прямой формуле x = a/b. Чисто из описания, второй вариант всегда будет быстрее, так как первый также должен вычислять a и b (соответственно b*x на каждом шаге).

Вы часто обнаруживаете, что для уравнений, где существует прямая формула решения, выполнение этой формулы намного быстрее, чем любой метод итерационной аппроксимации.


К сожалению, не так много проблемных классов с прямыми формулами решения. Но поскольку здесь линейная задача всегда может быть решена напрямую (аргумент эффективности изменяется для линейных систем с высоким размерностью).

ответил(а) 2020-03-26T15:01:16+03:00 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема