Это странно, чтобы попытаться оценить временную сложность printf()
, как это блокирование операции ввода/вывода, который выполняет обработку какой-нибудь текст и выполняет операцию записи с помощью серии write()
системных вызовов через промежуточный буферный слой.
Лучшая догадка о части обработки текста состоит в том, что вся входная строка должна быть прочитана, и все аргументы обрабатываются, поэтому, если нет какой-либо черной магии, вы можете принять O (n) в количество символов. Обычно вы не должны подавать аргумент формата printf()
dynamicaly, и поэтому размер известен, поэтому конечен и, следовательно, сложность действительно O (1).
С другой стороны, временная сложность операции блокирующего вывода не ограничена. В режиме блокировки все операции write()
возвращаются либо с ошибкой, либо с хотя бы одним байтом. Предполагая, что система готова принимать новые данные за постоянное время, вы получаете O (1).
Любые другие преобразования также происходят линейно с типично постоянным размером формата или результирующей строки, поэтому с рядом допущений вы можете сказать, что это O (1).
Также ваш код предполагает, что выход возникает только для фактического тестирования функциональности и не должен рассматриваться как часть вычисления вообще. Лучший способ - переместить ввод/вывод из функций, которые вы хотите рассмотреть, для целей сложности, например. к функции main()
, чтобы подчеркнуть, что вход и выход есть только для проверки кода.
Осуществление O (1) функции замены без ввода/вывода:
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
Альтернативная реализация без временной переменной (только для развлечения):
void swap(int *a, int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
Реализация основной функции:
int main(int argc, char **argv)
{
int a = 3, b = 5;
printf("a = %d; b = %d\n", a, b);
swap(&a, &b);
printf("a = %d; b = %d\n", a, b);
return 0;
}
Это O (n), где n - длина вывода. Вероятно. Учитывая множество предположений, некоторые более и некоторые менее разумные. – Deduplicator
Это O (1), потому что набор целых чисел фиксированной ширины конечен ... – 5gon12eder
snprintf (...) возвращает количество символов, которые будут напечатаны, даже если на самом деле напечатано меньше символов. Таким образом, время для snprintf (буфер, 1, «% s», некоторая строка) не ограничено, причем печатается не более 1 байт. – gnasher729