Вычисление работы, выполняемой функцией f x = (x, x)
Скажем, у меня есть эта функция: (синтаксис Haskell)
f x = (x,x)
Какова работа (количество вычислений), выполняемая функцией?
Сначала я думал, что он явно постоянен, но что, если тип x
не является конечным, то есть x может принимать произвольный объем памяти? Можно было бы также учитывать работу, выполненную путем копирования x
, правильно?
Это заставило меня поверить, что работа, выполняемая функцией, фактически линейна по размеру ввода.
Это не домашнее задание для себя, но появилось, когда я должен был определить работу, выполняемую функцией:
f x = [x]
У меня такая же проблема.
Ответы
Ответ 1
Очень неформально, проделанная работа зависит от семантики языка. Haskell, ну, это лениво, поэтому вы платите только постоянные факторы:
- наведите указатели на
x
в стеке
- выделить ячейку кучи для
(,)
- применить
(,)
к своим аргументам
- возвращает указатель на ячейку кучи
Готово. O (1) работает, когда вызывающий объект смотрит на результат f
.
Теперь вы начнете дальнейшую оценку, если заглянете внутрь (,)
, и эта работа зависит от работы, чтобы оценить x
. Поскольку в Haskell ссылки на x
являются общими, вы оцениваете их только один раз.
Итак, работа в Haskell - это O (работа x), если вы полностью оцениваете результат. Ваша функция f
добавляет только постоянные факторы.
Ответ 2
У Криса Окасаки есть замечательный метод определения работы, взимаемой с вызова функции, когда вводится какая-то (или общая) лень. Я считаю, что это в его статье "Чисто функциональные структуры данных". Я знаю, что это в книжной версии - я прочитал эту часть книги в прошлом месяце. В основном вы берете постоянный коэффициент для созданного обещания /thunk, ничего не платите за оценку любого переданного в promises/thunks (предположим, что они уже были принудительно/находятся в нормальной форме [а не только WHNF]). Это недооценивается. Если вы хотите завысить плату, также стоимость форсирования/преобразования в обычную форму каждого обещания /thunk, созданного функцией. По крайней мере, это то, как я помню это в моем чрезвычайно усталом состоянии.
Посмотрите в Окасаки: http://www.westpoint.edu/eecs/SitePages/Chris%20Okasaki.aspx#thesis - Клянусь, что тезис, который будет использоваться, будет доступен для загрузки.