Иногда я слышу, как люди говорят, что из-за скорости процессоров и объема доступной памяти эффективность алгоритма и время выполнения на практике не представляют большой проблемы.
Но я предполагаю, что есть еще области, где такие соображения остаются первостепенными. Два, которые приходят на ум, - это алгоритмическая торговля, где тысячи транзакций должны проводиться за доли секунды, и программирование встроенных систем, где часто не хватает памяти и мощности. Я прав насчет этих примеров? а какие еще области тоже будут примерами?
algorithms
cocojambles
источник
источник
O(n*log(n))
Алгоритм завершится быстрее на 30 лет компьютер , чемO(n!)
илиO(n*n)
на сегодняшних самых дорогостоящих аппаратных средств , еслиn
это достаточно большой.O(c * f(n))
где константаc
основана на неэффективности оборудования. Вы можете иметь в 1000 раз более быструю систему, так как онаn
уходит в бесконечность, это будет иметь значение все меньше и меньше. Я бы выбралO(10000 * log(n))
вместоO(n)
любого дня, если я подозреваю, что этоn
может быть большим.Ответы:
Скорость всегда востребована. Я думаю, вы правы. Вот несколько примеров, когда требовались аккуратные алгоритмы:
криптография
Поиск больших баз данных
Сортировка и слияние
Поиск текста (не индексируется), включая символы подстановки
Математические задачи с интенсивными вычислениями
моделирование
Приложения для интеллектуального анализа данных
Анимация
искусственный интеллект
Компьютерное зрение
источник
В некоторых случаях время выполнения алгоритма может не иметь большого значения, потому что мы дошли до того, что вы можете просто пробиться через более продолжительный алгоритм с более мощным оборудованием. Но, безусловно, есть места, где ускорение необходимо.
Вообще говоря, все, что использует огромные наборы данных, будет проблемой. Когда у вас есть что-то, что плохо масштабируется с помощью n, а затем вы делаете действительно огромное число, у вас есть проблема. Я подозреваю, что если вы перейдете на сайт бета-версии Computational Science и немного покопаетесь, то сможете найти множество проблем, нуждающихся в более качественных и быстрых алгоритмах. Некоторые области, с которыми я столкнулся:
Вообще говоря, научные вычисления, как правило, представляют собой область, где сложность того, что программируется, создает возможности для серьезных замедлений, если ваш алгоритм работает медленно (многие из них страдают от очень больших n). И, как вы упомянули, есть финансовые приложения. Когда миллисекунды могут определить, зарабатываете ли вы или теряете деньги на сделке, «достаточно хорошие» алгоритмы не собираются ее сокращать, если есть что-то лучшее, что можно сделать.
источник
Возьми это с зерном соли. Большая вычислительная мощность просто означает, что ваш n может стать намного больше, прежде чем он значительно замедлится. Для большинства повседневных проблем это n теперь достаточно велико, и вам не нужно о нем заботиться. Тем не менее, вы все равно должны знать сложности ваших алгоритмов.
При наличии большего количества ресурсов может потребоваться обработка дополнительных данных позже. Сегодня вам нужно проанализировать файл журнала размером 10 МБ с 100 000 строк. Через год у вас может быть файл журнала объемом 100 ГБ с 1 000 000 000 строк. Если объем данных растет быстрее, чем ресурсы, вы столкнетесь с проблемами позже.
Чем больше доступных ресурсов, тем больше слоев накладывается друг на друга. ОС, фреймворк ОС, сторонний фреймворк, интерпретатор языка и, наконец, ваш собственный инструмент. Все ненужные неэффективности во всех различных слоях умножаются. Завтра ваш инструмент может работать на новой ОС с большим количеством наворотов, которая сама по себе съедает больше циклов и больше памяти, оставляя вам меньше.
Таким образом, чтобы ответить на ваш вопрос, вам все равно нужно позаботиться о том, где все больше и больше данных нужно обрабатывать (достаточно примеров, приведенных в других ответах), и где вы не предоставляете окончательный инструмент, а другой уровень абстракции для других инструментов.
источник
Несколько лет назад мне пришлось написать алгоритм, который сортировал бы пробирки, расположенные на
n
стойках, в два отдельных раздела: то есть один набор пробирок был «выбран», а остальные были «не выбраны», и конечным результатом было бы отсутствие стойки будет иметь «выбранную» и «не выбранную» трубку (были некоторые дополнительные требования, такие как сжатие). Каждая стойка содержала максимум 100 пробирок.Алгоритм должен был использоваться для управления роботом для сортировки пробирок в фармацевтической лаборатории.
Когда мне дали оригинальную спецификацию, мне было выделено около 1 минуты времени для расчета, чтобы отсортировать около 2000 пробирок, так как мы думали, что с точки зрения удобства использования это не слишком болезненно. Было требование, чтобы число ходов было минимальным во всех возможных комбинациях, поскольку сам робот был медленным .
Предполагалось, что сложность будет экспоненциальной с числом трубок. Однако, работая над дизайном алгоритма, я обнаружил, что существует быстрый
O(n)
алгоритм, гдеn
есть количество стоек, которые выполнили оптимальное разделение труб. В результате время сортировки алгоритма было мгновенным, поэтому отображение сортировки обновлялось в реальном времени, когда пользователь настраивал операцию сортировки.Для меня разница между пользователем, сидящим в течение минуты после каждого изменения и имеющим мгновенно реагирующий графический интерфейс, была разницей между программным обеспечением, которое было функционально достаточным, и программным обеспечением, которым было приятно пользоваться.
источник
Другие области включают в себя множество видов обработки сигналов в реальном времени, системы управления с обратной связью, деконволюцию разведки нефти, сжатие видео, трассировку лучей и рендеринг видеокадров, системы виртуальной реальности, игры, в которых высокая частота кадров может быть значительным конкурентным преимуществом, а также смартфоны и другие. приложения для мобильных устройств, где большое количество циклов ЦП будет быстрее потреблять заряд батареи пользователя.
Я весьма удивлен, что этот вопрос можно было бы даже задать, поскольку для любого когда-либо созданного суперкомпьютера Top-500, существует, вероятно, список ожидающих исследователей, которые могут максимально его использовать и желать, чтобы вычислительные мощности или величины были лучше, алгоритмы для решения некоторой проблемы (сложите немного белка, чтобы расшифровать рак и т. д.), прежде чем уйти в отставку.
источник
Я думаю, что поисковые системы, такие как Google и Bing, являются одной из самых больших областей, где используются сложные алгоритмы, и они играют ключевую роль в ускорении результатов с релевантностью (ранжированием страниц), принося больше пользы пользователям.
источник
В настоящее время эффективность алгоритмов не является главной проблемой, потому что мы используем эффективные алгоритмы. Если вы используете алгоритм O (n!), Он будет медленным на любом виде оборудования.
источник
Сложность алгоритма становится все более важной по мере увеличения объема данных. К счастью, эффективные общие решения для общих проблем программирования (в основном, поиска и сортировки) включены практически в стандартную библиотеку каждого современного языка программирования, поэтому обычно программисту не приходится сильно беспокоиться об этих вещах. Недостатком является то, что многие программисты вообще не знают, что происходит под капотом и каковы характеристики алгоритмов, которые они используют.
Это становится особенно проблематичным, так как многие приложения не проходят должного стресс-тестирования: люди пишут код, который хорошо работает для небольших наборов тестовых данных, но когда он сталкивается с данными, которые в несколько тысяч раз больше, код останавливается. То, что хорошо работает для десяти записей, быстро взрывается, когда набор данных растет. Пример из реальной жизни: фрагмент кода, который должен был очистить элементы, которые больше не были связаны с какой-либо категорией, использовал трехуровневый вложенный цикл, который равен O (n ^ 3). Имея всего 10 записей в тестовой базе данных, это означало 1000 проверок - вполне выполнимо и не вносило заметной задержки. Однако производственная база данных быстро заполняется примерно 1000 строками, и внезапно код выполняет миллиард проверок каждый раз.
Итак: нет, вам не нужно знать все тонкости реализации всевозможных аккуратных алгоритмов, и вам не нужно иметь возможность изобретать свои собственные, но вам нужны некоторые базовые знания общих алгоритмов, каковы их Сильными и слабыми сторонами являются, когда и когда не следует их использовать, и вам необходимо знать о возможном влиянии алгоритмической сложности, чтобы вы могли решить, какой уровень сложности является приемлемым.
источник
Вопрос не в том, какие домены приложений зависят от времени выполнения. Любая программа в любом месте имеет минимальную производительность, ниже которой она фактически бесполезна. Суть сложности алгоритма заключается в том, как он меняется с увеличением размера ввода. Другими словами, области, где скорость особенно важна, - это те области, где вы ожидаете, что вам придется масштабироваться не только за счет текущего размера проблемы, но и за порядок величины.вашего текущего размера проблемы. Если вы обрабатываете налоговые заявления граждан департамента Франции, задача может быть большой, но маловероятно, что численность населения или сложность обработки одной записи когда-либо увеличатся в десять или сто раз, поэтому все, что работает для Вы сейчас, вероятно, будете продолжать работать. Но если вы пытаетесь создать что - то , что будет вылетать в объемах интернет, сложность алгоритмов является ключевым: все , что зависит больше , чем линейно или логарифмически линейно от размера входных данных будет становиться намного более дорогим очень быстро, и в конечном итоге скорость процессора просто не может идти в ногу с ростом.
источник
В моей области (VFX, которая охватывает такие вещи, как трассировка пути, компьютерная анимация, моделирование частиц, динамика жидкости, обработка изображений и т. Д.), Алгоритмическая сложность является фундаментальной. Нет ничего, что могло бы работать в худшее, чем линейное время время, в любое разумное время на входах, которые обычно достигают миллионов вершин, многоугольников, вокселей, частиц, текселей, особенно когда многие из этих вещей должны завершаться много раз в секунду, чтобы обеспечить интерактивная обратная связь в режиме реального времени.
При этом, как правило, среди коллег нет особого акцента на алгоритмической сложности при обсуждении, возможно, потому, что это воспринимается как нечто само собой разумеющееся и довольно "зачаточное". Обычно предполагается, что если вы пишете трассировщик пути, он будет работать в логарифмическом времени или лучше, и что структуры данных, такие как иерархии ограничивающих томов, знакомы и относительно просты для реализации для читателя. У меня даже был опытный коллега, который все время говорил, что многопоточность и SIMD важнее алгоритмов, и я не думаю, что он имел в виду то, что можно ожидать многого от распараллеливания пузырьковой сортировки. Я думаю, что он сказал, что, поскольку он считал само собой разумеющимся, что мы будем применять разумные алгоритмы,
Зачастую в наши дни основное внимание уделяется принятию многих из этих знакомых алгоритмов и их совершенствованию для использования таких базовых характеристик оборудования, как кэш-память ЦП, регистры и инструкции SIMD, графические процессоры и несколько ядер. Например, Intel придумала новый способ использования знакомой старой BVH и предложила концепцию «пакетов лучей», в основном тестируя несколько когерентных лучей одновременно с рекурсивным видом обхода дерева (что может звучать так будет сопряжено со своей сложностью и накладными расходами, за исключением того, что он более чем компенсируется тем фактом, что эти лучи теперь можно тестировать одновременно для пересечений луча / AABB и луча / треугольника с помощью инструкций и регистров SIMD).
Подобная вещь с подобным подразделением Catmull-Clark, которое является очень элементарным материалом в компьютерной графике. Но в настоящее время конкурентными, горячими и суперэффективными являются реализации графических процессоров, которые приближают подразделение CC с помощью Gregory Patches, популяризированное Charles Loop, а затем принятое Pixar. Более простая реализация CPU теперь устарела не обязательно потому, что она была заменена с точки зрения алгоритмической сложности, а потому, что она была заменена чем-то, что хорошо сочетается с GPU.
И это, как правило, большая проблема в наши дни - не придумать лучший алгоритм, который относительно независим от основных характеристик оборудования. Я действительно вошел в индустрию, придумав новую структуру ускорения, которая значительно ускорила обнаружение столкновений для анимации персонажей и других мягких тел в 90-х годах с использованием подхода иерархической сегментации, в отличие от пространственного индекса, который принес мне много предложения о работе, но в наши дни это уже не так впечатляет, так как я опубликовал его задолго до того, как у нас были такие впечатляющие кэши ЦП, многоядерные и программируемые графические процессоры, а что нет, и в настоящее время я использую совершенно другой подход в результате значительных изменений в базовое оборудование.
источник
Однажды я столкнулся с проблемой, когда алгоритм обычно выполнялся за O (n), но в редких и крайне маловероятных обстоятельствах потребовалось бы время O (n ^ 3) - «редкими» обстоятельствами были каталог, содержащий файлы с именами, которые были действительны в одна операционная система, но не в другой.
Никто никогда не сталкивался с проблемами. Затем один из клиентов использовал стратегию для именования файлов, которые систематически встречались бы в случае O (n ^ 3), и с несколькими сотнями файлов система практически остановилась. Результатом было то, что алгоритм должен был быть изменен.
источник
Еще три, которые не были упомянуты:
1) Многие стратегии в реальном времени. Посмотрите на тех, у кого есть юниты, которые не могут разделить позицию. Посмотрите, что происходит с поиском пути, когда большая группа юнитов движется по ограниченной местности. Мне еще не приходилось сталкиваться с игрой без каких-либо существенных проблем с этим, потому что просто недостаточно мощности процессора.
2) Много проблем с оптимизацией. (Редактировать: так как я написал этот ответ, я нажал один. Моя цель состояла в том, чтобы обрезать избыточные пути так, чтобы все узлы были связаны с минимальным весом соединительных путей. Мой оригинальный подход работал довольно хорошо, пока я не переместил больше сокращения к этой процедуре, тогда я понял, что это было 2 ^ n. Теперь это n ^ 2, хотя иногда это может привести к немного неоптимальному результату.)
3) Вещи, которые должны работать с большими объемами данных в режиме реального времени. Рассмотрим DVD: обычно вы получаете 2 часа видео в 4,7 ГБ. Рассмотрим типичный видеофайл с тем же разрешением: эти 2 часа видео обычно не превышают 1 ГБ. Причина этого заключается в том, что, когда спецификация DVD была установлена, вы не могли создать недорогой DVD-плеер, который мог бы достаточно быстро декодировать более современные форматы.
источник
Что ж, любое приложение, которое обычно запускается на суперкомпьютере ( список самых больших машин ), подходит. Они разнообразны, но большой подкласс из них - физические симуляции:
Это только мои главные темы, но я просто прочитал список различных суперкомпьютеров и понял, что каждый из них создан для того, чтобы выполнять какие-то вычисления, которые были бы невозможны без таких гигантских машин.
И, как только вы увидите, что нам действительно нужны эти машины, поймите, сколько затрат можно сэкономить, просто увеличив скорость их применения на 10% . Любая оптимизация этих кодов напрямую увеличивает количество результатов, которые мы можем получить с этих машин.
источник