Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/35: Рейтинг темы: голосов - 35, средняя оценка - 4.74
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
1

Нотация O большое

08.07.2013, 21:25. Показов 6852. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здорова! Есть задачка: "Изучите О() нотацию. Приведите реалистичный пример, в котором получается, что О(N*N) быстрее, чем О(N) для некоторых N>10."
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2013, 21:25
Ответы с готовыми решениями:

Нотация указателей
Преподователь попросил применить нотацию указателей вместо нотации массивов, помогите пожалуйста. ...

Польская инверсная нотация
помогите пожалуста зделать !!! уже ниделю сижу никак не могу зделать ((

Обратная польская нотация
Как имея вид выражения в записи обратной польской нотации правильно расставить скобки?

Обратная Польская Нотация
Пытался реализовать ОПН....ничего не вышло,обращаюсь за помощью: в чем ошибка(и)? #include...

22
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
08.07.2013, 21:40 2
Цитата Сообщение от ninja2 Посмотреть сообщение
Приведите реалистичный пример, в котором получается, что О(N*N) быстрее, чем О(N) для некоторых N>10.
Неужели "Гуру С++" не может придумать, казалось бы, очевидный пример?
Хорошо, не гуру поможет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// допустим N = 100
for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        // some code
    }
}
// имеем 10000 итераций, в big-O нотации это O(n * n)
 
// при той же N = 100
for (int i = 0; i < N * 1000000; i++) {
    // some code
}
// имеем 100000000 итераций, в big-O нотации это O(n)
итого O (N * N) быстрее, чем O(N).
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.07.2013, 21:50 3
ninja2, подсказка (уже описанная выше)
O(100500*N) == O(N)
O(N2/100500) = O(N2)
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
08.07.2013, 22:07  [ТС] 4
Kastaneda, Да тут не так нужно делать наверно. Нужно создать два контейнера, где один подпадает под O(n), а второй под O(n*n) и просто допустим есть операция поиска или там произвольного доступа да, это как пример мы просто добавляем допустим 100 элементов в один контейнер 100 элементов в другой. Конечно же в том контейнере где O(n*n) операция произвольного доступа должна работать медленее ну или какая то другая операция не важно, но нам нужно написать такой пример или такие ситуации найти при которой будет быстрее чем для O(n).

Ты наверно не знаешь что такое О-нотация .
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
08.07.2013, 22:14  [ТС] 5
Kastaneda, Ну да в принципе подойдет как вариант может быть токо для n небольших, а если n будет стремится к бесконечности то вариант не катит.
Да 100% не катит отето число 1000000 роли не сыграет.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.07.2013, 22:15 6
ninja2, предлагаю вам ответить на вопрос, имеет ли такое неравенство решение

n2 < 100000*n

или нет?
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
08.07.2013, 22:19  [ТС] 7
Цитата Сообщение от Croessmah Посмотреть сообщение
просветите нас мы тут все тупые просто
Ну ладно это походу шутка, но все рамно просвечу.
О-нотация показывает зависимость времени выполнения операции от количества элементов в последовательности
От например O(n) здесь линейно будет время выполнения операции расти.
А от здесь O(n*n) время должно увеличиваться быстро, можно прикинут если для О(n) мы вкинем 100 элементов, то для О(n*n) мы вкинем корень квадратный из ста элементов, что бы время было у них одинаковое.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
08.07.2013, 22:21 8
Выше уже ответили, но на всякий случай советую еще раз прочитать задание
Цитата Сообщение от ninja2 Посмотреть сообщение
для некоторых N>10
для некоторых N и для любых (всех) N это не одно и то же.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
08.07.2013, 22:21 9
Цитата Сообщение от ninja2 Посмотреть сообщение
что О(N*N) быстрее, чем О(N)
Цитата Сообщение от ninja2 Посмотреть сообщение
О-нотация показывает зависимость времени выполнения
Данная нотация обозначает сложность, а не для скорость выполнения

алгоритм со сложностью O(N*N) на современном компьютере может выполниться намного быстрее, чем O(N) на древнем компе
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
08.07.2013, 22:22  [ТС] 10
Цитата Сообщение от Psilon Посмотреть сообщение
n2 < 100000*n
Имеет пока пока n*n не будет равно или больше 100000*n, ну там числа от 0 и до числа которое не будет удовлетворять условию. А если n стремится к бесконечности то конечно не имеет.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.07.2013, 22:22 11
ninja2, расскажите конфигурацию своей машины с бесконечной памятью, мне даже интересно стало.
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
08.07.2013, 22:24  [ТС] 12
Цитата Сообщение от Kastaneda Посмотреть сообщение
для некоторых N и для любых (всех) N это не одно и то же.
Да ты прав, не внимательный просто, согласен с тобой, твое решение катит.
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
08.07.2013, 22:32  [ТС] 13
Цитата Сообщение от Croessmah Посмотреть сообщение
Данная нотация обозначает сложность, а не для скорость выполнения
А в книгах говорилось что если n к бесконечности стремится, ну я понял, просто должно еще n порог перепрыгнуть, токо если перепрыгнет, тогда уже будет тормозить, а так может и быстрее работать .
0
292 / 172 / 47
Регистрация: 22.03.2010
Сообщений: 488
08.07.2013, 22:37 14
На счет реалистичного примера, правда с другими оценками сложности, тем не менее суть не меняется: алгоритм Копперсмита-Винограда (O(n2.3727)) и алгоритм Штрассена (O(n2.81)) для перемножения матриц. И используют в основном второй, либо вообще по определению за O(n3).
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.07.2013, 22:42 15
ninja2, есть понятие предела. Им и пользуйтесь.
n2 < 1000000n верно при n < 1000,
n2 < 1000000000000n верно при n < 1000000,
то есть для любого N мы можем подобрать такой множитель, что квадратичная функция будет быстрее.
И только в пределе
https://www.cyberforum.ru/cgi-bin/latex.cgi?\lim_{n\rightarrow infinity}\frac{N^2}{C*N} = infinity
Для любых С.
1
Croessmah
08.07.2013, 22:46
  #16

Не по теме:

Не по теме, но может кому понадобится табличка:

Нотация O большое

1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.07.2013, 23:29 17
Еще такая есть:

Нотация O большое


и еще такая статейка:

http://habrahabr.ru/post/78728/
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.07.2013, 23:30 18
Правда для массива поиск неверно указан, O(N) для обычного и O(log(n)) для отсортированного.
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
09.07.2013, 08:19 19
Kastaneda, с учетом того, что
Цитата Сообщение от ninja2 Посмотреть сообщение
Приведите реалистичный пример...
то под какую задачу можно подогнать такой алгоритм?

на самом деле, привести реалистичный пример не так-то сложно. далеко ходить не надо. рассмотрим пару сортировок со сложностями O(n) и O(n^2), например, сортировку подсчетом и оптимизированную пузырьковую сортировку. Рассмотрим массив размера n, который подпадает под средний случай пузырьковой сортировки со сложностью
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{n^2}{4}=O(n^2)
сортировка подсчетом имеет сложность
https://www.cyberforum.ru/cgi-bin/latex.cgi?3n=O(n)
осталось найти такие n, при которых имеет место неравенство
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{n^2}{4} < 3n
Получаем
0<n<12.

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
алгоритм со сложностью O(N*N) на современном компьютере может выполниться намного быстрее, чем O(N) на древнем компе
если n > 1 000 000 000, то даже на современном компьютере некоторые такие алгоритмы будут работать сутками и даже месяцами, а на старых, допустим, часы. Здесь же O-большое, асимптотика, а число 1 000 000 000 для асимптотических оценок это мизер

Добавлено через 3 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
просто должно еще n порог перепрыгнуть, токо если перепрыгнет, тогда уже будет тормозить, а так может и быстрее работать
иногда такого порога и вовсе нет. например, возьмите удаление элементов из массива. при правильной реализации нужен всего один проход (меньше, понятно никак нельзя), получается, что линейная сложность хуже квадратичной здесь никак быть не может.
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
09.07.2013, 08:46 20
Цитата Сообщение от ninja2 Посмотреть сообщение
Да тут не так нужно делать наверно. Нужно создать два контейнера, где один подпадает под O(n), а второй под O(n*n) и просто допустим есть операция поиска или там произвольного доступа да, это как пример мы просто добавляем допустим 100 элементов в один контейнер 100 элементов в другой. Конечно же в том контейнере где O(n*n) операция произвольного доступа должна работать медленее ну или какая то другая операция не важно, но нам нужно написать такой пример или такие ситуации найти при которой будет быстрее чем для O(n).
Квадратичный поиск? Серьёзно?

Добавлено через 23 минуты
Сортировка пузырьком массива с произвольным доступом квадратична, то есть требует O(n*n) операций, доступ по индексу элемента массива, реализованного списком линеен, то есть требует O(n). Пусть массив с произвольным доступом к 100-а элементам сортирует интел пентиум 4 2.4 ГГц. 100*8=800 байт, такой массив не может не поместиться в кеш, имеем 10 000 сравнений и перестановок, 5 000 шагов внутреннего цикла, 5 000 сравнений его счётчика, 5 000 инкрементов этого счётчика, 100 шагов внешнего цикла, 100 сравнений его счётчика, 100 его инкрементов, 100 присваиваний счётчика внутреннего цикла и одно внешнего. 35 401 операция, 14 микроисекунд. Пусть теперь спектрум пытается достучаться к сотому элементу. 100 шагов цикла, 100 инкрементов счётчика, 100 его сравнений, 102 присваиваний, 100 косвенных адресаций. 502 операции. 2 миллисекунды. Как видите, не равенство исполнителей переворачивают зависимость на сотне. Но пусть теперь АMD64 3 ГГц должен поменять местами два последних элемента массива, реализованного на списке, по 6 гигабайт каждый. 12 миллирадов только присваиваний с явным переполнением кеша, несколько секунд чистого процессорного времени, не считая задержек на шинах, а в О-нотацию размер элемента не вошёл.
0
09.07.2013, 08:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2013, 08:46
Помогаю со студенческими работами здесь

Венгерская нотация. А что вы думаете?
Уже который день задумываюсь о надобности использования префиксов. С одной стороны - очень...

Обратная польская нотация через структуру
есть такая структура, как через нее сделать ОПН? /*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В СТЕК*/ void...

Кто как обзывает переменные / типы в своём коде? (нотация)
Не ради тролинга, а ради интереса и любопытства. Столько разных API и фрейворков, у всех свой...

Венгерская нотация, оно вообще надо?
Вопрос в заголовке. Больше всего смущает префикс m_ для приватных членов класса, ни информативности...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru