О сложности времени / пространства в стандартах C / C ++ - PullRequest
3 голосов
/ 24 июня 2019

Недавно я прочитал кое-что об абстрактной машине и правиле «как будто» ( Что такое правило «как будто»? ) и требованиях к временной сложности стандартной библиотеки (например, этой).: Действительно ли list :: size () действительно O (n)? ).

  1. Требования к сложности времени / пространства для стандартной библиотеки в терминах абстрактной машины или в терминахРеальная конкретная машина?

Если это с точки зрения абстрактной машины, кажется, что реализация может на самом деле генерировать менее эффективный код с точки зрения сложности, даже если это кажется не практичным.

Упоминали ли стандарты что-либо о сложности времени / пространства для кода нестандартной библиотеки?

например, я могу написать собственный код сортировки и ожидать O (n log n) времени, но еслиреализация просто обрабатывает это как код в абстрактной машине, ей разрешено генерировать более медленную сортировку в ассемблере и машинном коде, как, например, изменение ее на сортировку O (n ^ 2), даже если в реальной ситуации это вряд ли будет сделано.

Или, может быть, я что-то упустил из-за требований к трансформации между абстрактной машиной и реальной конкретной машиной.Можете ли вы помочь мне уточнить?:)

Даже если я в основном читаю о стандарте C ++, я также хочу узнать ситуацию со стандартом C.Так что этот вопрос теги оба.

Ответы [ 3 ]

1 голос
/ 24 июня 2019
  1. Требования к сложности времени / пространства для стандартной библиотеки с точки зрения абстрактной машины или с точки зрения реальной конкретной машины?

Требования к сложности выражаются в терминахабстрактной машины:

[intro.abstract] Семантические описания в этом документе определяют параметризованную недетерминированную абстрактную машину ...


Упоминали ли стандарты что-либо о сложности времени / пространства для кода нестандартной библиотеки?

Нет.Единственные требования к сложности в стандарте касаются стандартных контейнеров и алгоритмов.

, если реализация просто обрабатывает это как код в абстрактной машине, ей разрешается генерировать более медленную сортировку в сборке и машинном коде, напримеризменение его на O (n ^ 2) sort

Это не самое худшее, что он может сделать.Реализация может перевести процессор в спящий режим на год между каждой инструкцией.Пока вы достаточно терпеливы, программа будет иметь такое же наблюдаемое поведение, как и абстрактная машина, поэтому она будет соответствовать.

0 голосов
/ 24 июня 2019

Многие требования к сложности в стандарте C ++ связаны с определенным количеством конкретных операций.Эти ограничивают реализацию.

Например, std::find_if

Не более last - first приложений предиката.

Это более конкретно, чем " O (N) , где N = std::distance(first, last) ", поскольку он задает постоянный коэффициент 1.

А есть другие, которые имеют границы Big-O, определяющие, какие операцииподсчитано

Например std::sort

O (N · log (N)) , где N = std::distance(first, last) сравнения.

То, что не ограничивает , включает в себя как медленное сравнение, так и количество свопов.Если ваша модель вычислений имеет быстрое сравнение и медленную замену, вы не получите очень полезный анализ.

0 голосов
/ 24 июня 2019

Как вам сказали в комментариях, стандарты не предъявляют никаких требований относительно сложности времени или пространства. И что касается вашего дополнительного неявного вопроса, да, компилятор может изменить ваш код O (n log n) для запуска за O (n²) времени. Или в O (n!), Если захочет.

Основное объяснение состоит в том, что стандарт определяет правильные программы, и программа является правильной независимо от того, сколько времени требуется для выполнения или сколько памяти она использует. Эти детали оставлены для реализации.

Конкретные реализации могут компилировать ваш код любым подходящим способом. Например, было бы вполне допустимо, чтобы реализация добавляла пятисекундную задержку между каждой строкой кода, которую вы написали - программа по-прежнему корректна. Было бы также допустимо, чтобы компилятор нашел лучший способ сделать то, что вы написали, и переписать всю программу, если наблюдаемое поведение одинаково.

Однако тот факт, что реализация соответствует , не означает, что она идеальна. Добавление пятисекундных задержек не повлияет на соответствие реализации, но никто не захочет использовать эту реализацию. Компиляторы не делают этого, потому что в конечном итоге они являются инструментами, и поэтому их авторы ожидают, что они будут полезны для тех, кто их использует, а намеренно ухудшать ваш код бесполезно.

TL; DR: плохая производительность (сложность времени, сложность памяти и т. Д.) Не влияет на соответствие, но заставит вас искать новый компилятор.

...