, относящийся к qn ниже, в порядке возрастания роста: g2, g3, g4, g1, g5? g2 = 4n, g3 = 18nlgn, g4 = 12n^2LG (п-1) , g1 = 25N^2lgn, g5 = 15n^3Порядок роста следующих функций
ответ
Этот вопрос требует, чтобы использовать некоторую алгебру, чтобы трансформировать функции, так что вы можете сравнить их. Помните, что ведущие константы не имеют значения для асимптотических сравнений. Основания экспоненты/логарифма иногда do вопрос, хотя, поэтому будьте осторожны с ними.
g1(n) = n^2 lg n
, используя approximationlg n! ~ n lg n
.g2(n) = 4^(lg n) = n^(lg 4) << n^2
, предполагаяlg
базаe
.g3(n) = n^2 lg n
с использованием formula на сумму арифметической прогрессии.g4(n) = n^2 (lg lg n)^2
g5(n) = n^3
На данный момент, вы можете использовать тот факт, что lg n^k << n
для любого фиксированного k
. Это означает, что более высокая мощность n
доминирует над более высокой мощностью lg n
. Аналогично (lg lg n)^k << lg n
для любых k
.
Выполнение данного запроса g2 << g4 << g1 = g3 << g5
.
Вы можете перепроверить, как я считаю, результаты: g2 g4 g3 g5 g1
Вот C программа, которая проверяет функции. Вы должны дважды проверить программу [в основном функции g*
] и g4
в частности. Итак, вот оно:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define FLT long double
struct rtn {
const char *name;
FLT val;
};
typedef struct rtn rtn_t;
#define DO(_alg) \
do { \
ptr = &list[_alg - 1]; \
g##_alg(ptr,n); \
printf("%s: %Lg\n",ptr->name,ptr->val); \
} while (0)
FLT
fact(unsigned long long n)
{
unsigned long long i;
FLT f;
f = 1.0;
for (i = 1; i <= n; ++i) {
f *= n;
}
return f;
}
void
g1(rtn_t *rtn,unsigned long long n)
{
FLT val;
rtn->name = "g1";
val = 25.0;
val *= n;
val *= logl(fact(n));
rtn->val = val;
}
void
g2(rtn_t *rtn,unsigned long long n)
{
FLT val;
rtn->name = "g2";
val = logl(n);
val += val;
val = powl(2,val);
rtn->val = val;
}
void
g3(rtn_t *rtn,unsigned long long n)
{
FLT val;
FLT lgn;
unsigned long long k;
rtn->name = "g3";
lgn = logl(n);
val = 0;
for (k = 1; k <= n; ++k)
val += lgn * k;
val *= 18;
rtn->val = val;
}
void
g4(rtn_t *rtn,unsigned long long n)
{
FLT val;
FLT lgn;
rtn->name = "g4";
val = n;
val *= val;
val *= 12;
lgn = logl(n);
lgn = logl(lgn);
lgn *= lgn;
val *= lgn;
rtn->val = val;
}
void
g5(rtn_t *rtn,unsigned long long n)
{
FLT val;
rtn->name = "g5";
val = n;
val = val * val * val;
val *= 15;
rtn->val = val;
}
int
cmp(const void *lhs,const void *rhs)
{
const rtn_t *lp;
const rtn_t *rp;
int cmpflg;
lp = lhs;
rp = rhs;
do {
cmpflg = 0;
if (lp->val < rp->val) {
cmpflg = -1;
break;
}
if (lp->val > rp->val) {
cmpflg = 1;
break;
}
} while (0);
return cmpflg;
}
void
order(unsigned long long n)
{
rtn_t list[5];
rtn_t *ptr;
printf("\n");
printf("n: %llu\n",n);
DO(1);
DO(2);
DO(3);
DO(4);
DO(5);
qsort(list,5,sizeof(rtn_t),cmp);
for (ptr = list; ptr < &list[5]; ++ptr)
printf(" %s",ptr->name);
printf("\n");
fflush(stdout);
}
int
main(void)
{
unsigned long long n;
n = 1;
for (n = 1; n < (1LL << 62); n *= 2)
order(n);
return 0;
}
Вот результат работы программы:
n: 1
g1: 0
g2: 1
g3: 0
g4: inf
g5: 15
g1 g3 g2 g5 g4
n: 2
g1: 69.3147
g2: 2.61406
g3: 37.4299
g4: 6.44792
g5: 120
g2 g4 g3 g1 g5
n: 4
g1: 554.518
g2: 6.83333
g3: 249.533
g4: 20.4845
g5: 960
g2 g4 g3 g1 g5
n: 8
g1: 3327.11
g2: 17.8628
g3: 1347.48
g4: 411.625
g5: 7680
g2 g4 g3 g1 g5
n: 16
g1: 17744.6
g2: 46.6944
g3: 6787.3
g4: 3194.74
g5: 61440
g2 g4 g3 g1 g5
n: 32
g1: 88722.8
g2: 122.062
g3: 32938.4
g4: 18983.3
g5: 491520
g2 g4 g3 g1 g5
n: 64
g1: 425870
g2: 319.078
g3: 155709
g4: 99843.8
g5: 3.93216e+06
g2 g4 g3 g1 g5
n: 128
g1: 1.98739e+06
g2: 834.091
g3: 721051
g4: 490438
g5: 3.14573e+07
g2 g4 g3 g1 g5
n: 256
g1: 9.08522e+06
g2: 2180.37
g3: 3.28345e+06
g4: 2.30749e+06
g5: 2.51658e+08
g2 g4 g3 g1 g5
n: 512
g1: 4.08835e+07
g2: 5699.62
g3: 1.47468e+07
g4: 1.05429e+07
g5: 2.01327e+09
g2 g4 g3 g1 g5
n: 1024
g1: 1.81704e+08
g2: 14899.2
g3: 6.54775e+07
g4: 4.71655e+07
g5: 1.61061e+10
g2 g4 g3 g1 g5
n: 2048
g1: inf
g2: 38947.4
g3: 2.8796e+08
g4: 2.07694e+08
g5: 1.28849e+11
g2 g4 g3 g5 g1
n: 4096
g1: inf
g2: 101811
g3: 1.25625e+09
g4: 9.03472e+08
g5: 1.03079e+12
g2 g4 g3 g5 g1
n: 8192
g1: inf
g2: 266140
g3: 5.44307e+09
g4: 3.89214e+09
g5: 8.24634e+12
g2 g4 g3 g5 g1
n: 16384
g1: inf
g2: 695707
g3: 2.34457e+10
g4: 1.66359e+10
g5: 6.59707e+13
g2 g4 g3 g5 g1
n: 32768
g1: inf
g2: 1.81862e+06
g3: 1.00478e+11
g4: 7.06453e+10
g5: 5.27766e+14
g2 g4 g3 g5 g1
n: 65536
g1: inf
g2: 4.754e+06
g3: 4.28701e+11
g4: 2.98373e+11
g5: 4.22212e+15
g2 g4 g3 g5 g1
n: 131072
g1: inf
g2: 1.24273e+07
g3: 1.82197e+12
g4: 1.25439e+12
g5: 3.3777e+16
g2 g4 g3 g5 g1
n: 262144
g1: inf
g2: 3.24856e+07
g3: 7.71653e+12
g4: 5.2528e+12
g5: 2.70216e+17
g2 g4 g3 g5 g1
n: 524288
g1: inf
g2: 8.49195e+07
g3: 3.25808e+13
g4: 2.19211e+13
g5: 2.16173e+18
g2 g4 g3 g5 g1
n: 1048576
g1: inf
g2: 2.21985e+08
g3: 1.37182e+14
g4: 9.12084e+13
g5: 1.72938e+19
g2 g4 g3 g5 g1
n: 2097152
g1: inf
g2: 5.80283e+08
g3: 5.76166e+14
g4: 3.78499e+14
g5: 1.38351e+20
g2 g4 g3 g5 g1
n: 4194304
g1: inf
g2: 1.5169e+09
g3: 2.41441e+15
g4: 1.56705e+15
g5: 1.1068e+21
g2 g4 g3 g5 g1
n: 8388608
g1: inf
g2: 3.96527e+09
g3: 1.00966e+16
g4: 6.47442e+15
g5: 8.85444e+21
g2 g4 g3 g5 g1
n: 16777216
g1: inf
g2: 1.03655e+10
g3: 4.21424e+16
g4: 2.66999e+16
g5: 7.08355e+22
g2 g4 g3 g5 g1
n: 33554432
g1: inf
g2: 2.7096e+10
g3: 1.75593e+17
g4: 1.09924e+17
g5: 5.66684e+23
g2 g4 g3 g5 g1
n: 67108864
g1: inf
g2: 7.08306e+10
g3: 7.30468e+17
g4: 4.51869e+17
g5: 4.53347e+24
g2 g4 g3 g5 g1
n: 134217728
g1: inf
g2: 1.85156e+11
g3: 3.03425e+18
g4: 1.85497e+18
g5: 3.62678e+25
g2 g4 g3 g5 g1
n: 268435456
g1: inf
g2: 4.84009e+11
g3: 1.25865e+19
g4: 7.60524e+18
g5: 2.90142e+26
g2 g4 g3 g5 g1
n: 536870912
g1: inf
g2: 1.26523e+12
g3: 5.21442e+19
g4: 3.11451e+19
g5: 2.32114e+27
g2 g4 g3 g5 g1
Экспериментальные результаты могут быть не такими полезными при определении поведения на бесконечности. – augurar
@augurar Возможно. Но они предоставляют другую контрольную точку [для OP]. Мои результаты противоречат его. Он может решить, изменились ли значения для _very_ больших 'n' [за пределами того, что я подсчитал]. Я не добавлял никакого кода для сравнения относительных темпов расхождения. Вероятно, это проявится достаточно рано. Я был слишком ленив, чтобы использовать «GMP» и тестировать одно [несколько] _large_ 'n' значений (например,' n = 1e5000') –
На самом деле это неправильно. Асимптотически "g2 << g4 << g1 = g3 << g5'. – augurar
- 1. Порядок роста для заданных функций
- 2. Порядок роста следующей функции
- 3. Порядок роста
- 4. Порядок роста этих выражений?
- 5. Порядок роста кода ниже
- 6. Показаны порядок роста функции
- 7. порядок роста в алгоритмах
- 8. Сравнение роста кусочных функций
- 9. Сортировка порядка роста функций?
- 10. Поиск функций роста и большой O
- 11. Порядок роста тройки для цикла
- 12. Порядок роста специфической рекурсивной функции
- 13. Порядок роста в цикле for
- 14. Порядок роста, сложный для петель
- 15. Как найти порядок роста суммы?
- 16. SICP 2.64 порядок роста рекурсивной процедуры
- 17. Алгоритмический большой o порядок кода роста
- 18. порядок роста худшем случае время работает
- 19. Порядок роста как функция от N
- 20. Порядок роста теста Fermat в SICP
- 21. Как найти порядок роста для этой функции?
- 22. Каков более высокий порядок роста? (Big-O)
- 23. временная сложность для следующих функций
- 24. Сравнивая два асимптотическую скорость роста двух функций
- 25. Порядок вызовов функций
- 26. NSURLConnectionDataDelegate порядок функций
- 27. PHP порядок порядка функций
- 28. обеспечить порядок вызовов функций?
- 29. Порядок выполнения функций (многопоточность)
- 30. Порядок функций в C
Можете ли вы показать свою попытку решить эту проблему или что вы пробовали? Люди здесь более чем готовы/могут помочь, но это не где-то просто получить бесплатные ответы на домашнюю работу без каких-либо усилий. –
Я записываю упрощенную форму каждой функции. – blackhazelnut
Не только вопрос о домашнем задании, но и фактически скопировал вопрос из книги! Послушайте, @ SIRO1690, давая вам ответ, никоим образом не поможет вам. – gnasher729