Сегодня я узнал, что алгоритм анализа отличается в зависимости от вычислительной модели. Это то, о чем я никогда не думал и не слышал.
Пример, данный мне, который проиллюстрировал это далее, пользователем @chi был:
Например, рассмотрим задачу: дано вернуть . В оперативной памяти это может быть решено в так как доступ к массиву постоянен. Используя ТМ, нам нужно сканировать весь ввод, так что этоx i O ( 1 ) O ( n )
Это заставляет меня задуматься о функциональных языках; Насколько я понимаю, «функциональные языки тесно связаны с лямбда-исчислением» (из комментария Ювала Фильмуса здесь ). Итак, если функциональные языки основаны на лямбда-исчислении, но работают на машинах, основанных на ОЗУ, каков правильный способ анализа сложности алгоритмов, реализованных с использованием чисто функциональных структур данных и языков?
У меня не было возможности прочитать чисто функциональные структуры данных, но я заглянул на страницу Википедии для предмета, и кажется, что некоторые структуры данных действительно заменяют традиционные массивы:
«Массивы могут быть заменены картой или списком произвольного доступа, который допускает чисто функциональную реализацию, но время доступа и обновления является логарифмическим».
В этом случае вычислительная модель будет другой, правильно?
Ответы:
Это зависит от семантики вашего функционального языка. Вы не можете выполнять анализ алгоритмов на языках программирования изолированно, потому что вы не знаете, что на самом деле означают эти утверждения. Спецификация для вашего языка должна содержать достаточно подробную семантику. Если ваш язык определяет все в терминах лямбда-исчисления, вам нужен какой-то показатель затрат для сокращения (они O (1) или они зависят от размера термина, который вы сокращаете?).
Я думаю, что большинство функциональных языков не делают этого таким образом и вместо этого предоставляют более полезные операторы, такие как «вызовы функций - это O (1), добавление к началу списка - это O (1)», и тому подобное.
источник