Давайте рассмотрим каждый из них в отдельности. Вот ваша первая функция:
function FUNC3(int array[n], int n, int key)
int i = 1;
while (i < n) do {
if (key == array[0]) then
i = i + n^0.25;
else
i = i + n^0.5;
}
Вы правы, что наилучшее время выполнения равно Θ (n / n 0.5 ), а худшее - case (n / n 0,25 ). Это может помочь переписать их, упрощая показатели; первое время выполнения:
Θ (n / n 0.5 ) = Θ (n 0.5 ) = Θ (√n)
, а второе время выполнения -
Θ (n / n 0.25 ) = Θ (n 3/4 ).
Теперь давайте посмотрим на вторую функцию:
function FUNC4(int array[n], int n, int key)
for (int i=1; i<n; i = i * 2) do
for (int j=0; j<sqrt(n); j++) do {
if(array[0] == key) then {
int k = 1;
while (k < n) do
k = k * sqrt(n);
}
}
Чтобы определить время выполнения, давайте используем проверенный временем принцип
"Если сомневаетесь, работайте внутри out! "
Начнем с самого внутреннего l oop:
int k = 1;
while (k < n) do
k = k * sqrt(n);
Этот l oop подлый - он никогда не запускается более трех раз, потому что значения k будет 1, затем √n, затем n. Это означает, что l oop выполняет O (1) общей работы. В результате мы можем переписать весь код как
function FUNC4(int array[n], int n, int key)
for (int i=1; i<n; i = i * 2) do
for (int j=0; j<sqrt(n); j++) do {
if(array[0] == key) then {
do O(1) work;
}
}
Поскольку оператор if
выполняет O (1), независимо от того, выполняется ли он, у нас остается
function FUNC4(int array[n], int n, int key)
for (int i=1; i<n; i = i * 2) do
for (int j=0; j<sqrt(n); j++) do {
do O(1) work;
}
Если мы выполняем O (1) работу √n раз, то время выполнения равно Θ (√n), поэтому внутренняя l oop становится
function FUNC4(int array[n], int n, int key)
for (int i=1; i<n; i = i * 2) do
do sqrt(n) work
, поскольку работа, выполненная во внутренней l oop не зависит от значения i
, работа, проделанная здесь, является просто произведением числа внешних l oop итераций и работы, выполненной за одну итерацию. Внешний l oop выполняется Θ (log n) раз, поэтому работа здесь Θ (√n log n), независимо от содержимого массива. Таким образом, время выполнения в лучшем и худшем случаях для функции одинаково, поскольку общая выполненная работа (асимптотически) всегда одинакова.
Надеюсь, это поможет!