Сложность алгоритма - объяснение O (log n)?

66
9

Я новичок в меру сложности, пожалуйста, помните.

Я понимаю следующие примеры сложности:

O (n) - Линейное время

Пример:

std::vector<int> MyV={1,4,6,2,9};
std::for_each(MyV.begin(), MyV.end(), [](int e1, int e1){return e1<e2;});
//I.e. n of operations based on the number of elements

O (1) - постоянное время

Пример:

for(int i=5; i--;)
{
//Do Stuff
}
//i.e. n of operations will be 5

O (n2) - Квадратичное время

Пример:

std::vector<int> MyVec_A={1,2,3,4,5};
std::vector<int> MyVec_B={1,2,3};
for(int i=MyVec_A; i--;)
{
for(int x=MyVec_B; x--;)
{
//Do Stuff
}
}

Правильно ли приведен пример выше?

Если нет, можете ли вы указать некоторые рекомендации относительно того, как я могу исправить примеры?

Я также не уверен в Логарифмическом времени O (log n), пример был бы действительно полезен?

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

Вы говорите, что ваш последний пример - O (n 2 ), но что n??? Это то, о чем вы должны спросить себя. Обычно это размер вектора, который работает цикл.

Легким случаем было бы:

std::vector<int> MyVec_A = {1, 2, 3, 4, 5};
std::vector<int> MyVec_B = {1, 2, 3, 4, 5};
for(int i = MyVec_A; i--;)
{
for(int x = MyVec_B; x--;)
{
// Do Stuff that are of negligible complexity
}
}

и теперь уверенно сказать, сложность этого примера: O (n 2 ), где n - размер MyVec_A (или MyVec_B эквивалентно).

Теперь, в вашем конкретном примере, длина векторов отличается, поэтому вам нужно изменить то, что у вас есть. Скажем, что MyVec_A имеет размер n и "MyVec_B has size m", то этот двойной цикл будет иметь временную сложность:

О (п * м)

Надеюсь, ясно, что когда векторы имеют тот же размер, что и в моем примере, тогда n = m а сложность становится O (n * m) = O (n * n) = O (n 2 ).

Мир приветствия логарифмической сложности - это метод двоичного поиска.

Учитывая массив целых чисел, вам предлагается найти номер, который поступает от ввода пользователя. Вы можете либо линейно искать всю сложность массива (O (n), где n - размер массива), либо, если массив отсортирован, вы можете найти элемент в O (logn), используя алгоритм двоичного поиска, У меня даже есть пример Binary Search (C++).

Кстати, научитесь задавать один вопрос (или очень тесно связанные вопросы к вопросу).

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

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