- BrainTools - https://www.braintools.ru -

Сложные вычисления — в минимальном объёме памяти

По закону Мура [1] плотность транзисторов на микросхеме удваивается каждые 24 месяца. Производительность CPU, GPU, TPU и NPU растёт уже несколько десятилетий, что привело нас вплотную к задачам эмуляции мозга [2] и Сверхинтеллекта [3].

Искусственный Интеллект быстро прогрессирует, превосходя человеческие возможности в разных бенчмарках (человеческий уровень принят за 0, а первый год разработки моделей за −100), источник: Kiela et al. (2023)

Искусственный Интеллект [4] быстро прогрессирует, превосходя человеческие возможности в разных бенчмарках (человеческий уровень принят за 0, а первый год разработки моделей за −100), источник: Kiela et al. (2023)

Когда-то компьютеры занимали целые комнаты, а сегодня у каждого в кармане маленький «суперкомпьютер». Но специалисты по теории информации решают фундаментальный вопрос: сколько места (памяти [5]) нужно в теории, чтобы выполнить задачу? Этот вопрос лежит в основе понятия вычислительной сложности.

Вычислительная сложность [6] или просто «сложность» в информатике означает объём ресурсов для вычисления задачи. Раздел, изучающий вычислительную сложность, называется теорией сложности вычислений.

Каждый алгоритм требует определённых ресурсов для вычисления. У него есть два ресурса — время [7] (вычислительные циклы CPU, P) и пространство [8] (память, PSPACE). Так мы учитываем временну́ю сложность алгоритма и пространственную сложность.

Временна́я и пространственная сложность алгоритма обычно выражается с использованием математической нотации «O» большое [9]. Например, O(n), O(nlog n), O(n^{alpha }), O(2^{n}), где n является характеристикой входных данных, которые влияют на сложность.

Оптимизации алгоритмов для решения NP-сложных задач

Оптимизации алгоритмов для решения NP-сложных задач

Итак, у нас время и память. Но как они зависят друг от друга? Правда ли, что любая задача, которая решается в полиномиальном пространстве PSPACE, также решается в полиномиальном P? И как они могут друг друга заменять?

Вопрос приобретает новое измерение с учётом дерьмофикации интернета [10] и программного обеспечения, где разработчики легко жертвуют памятью и производительностью. Для них это приемлемый компромисс, который позволяет сэкономить на оптимизации, ведь компьютерное железо гораздо дешевле, чем интеллектуальные ресурсы разработчика. Возможно, в этом тоже причина тотального ожирения софта [11], который становится всё более тормозным, на фоне упрощения всех интерфейсов и массового отупения пользователей [12].

С момента публикации фундаментальной научной работы Джона Хопкрофта с соавторами «О соотношении времени и пространства» [13] (“On Time Versus Space”) 1977 года считалось, что при увеличении сложности задачи (количество шагов алгоритма) пропорционально растёт и объём необходимой памяти. Таково было интуитивно понятная зависимость.

Только недавно выяснилось, что «конвертация сложности» работает иначе. И на самом деле требуется не t памяти, а всего лишь sqrt{t}.

P ≠ PSPACE

В теории сложности вычислений полиномиальное пространство PSPACE означает задачи, которые компьютер может решить, используя ограниченное количество памяти. Например, если с ростом сложности задачи разумно растёт и количество занимаемой памяти (n^2, n^3) — это полиномиальное пространство. Если же объём памяти растёт экспоненциально, как 2^n — не полином, и он за пределами PSPACE.

Аналогично и полиномиальное время P описывает задачи, которые можно решить за ограниченное время.

Вопрос в том, насколько эти два класса пересекаются. Другими словами, насколько мы можем пожертвовать памятью ради производительности — и наоборот. Каков теоретический предел, в какое минимальное «пространство» можно втиснуть вычисления заданной сложности? И как растёт потребление памяти при увеличении сложности задачи?

На протяжении 50-ти лет учёные бьются над проблемой P ≠ PSPACE. За это время они смогли доказать только то, что если задача требует t шагов, то решение возможно с использованием примерно t / log t бит памяти. Но лишь в малом классе задач. Что будет дальше, при увеличении сложности?

Всегда предполагалось, что дальше зависимость тоже соблюдается. Грубо говоря, если задача требует в сто раз больше шагов, то она потребует в сто раз больше памяти.

Но оказалось, что логика [14] здесь не действует. Всё работает иначе.

Неожиданное решение

В прошлом году на симпозиуме ACM по теории вычислений в Праге была официально представлена работа [15], которая вносит неожиданный поворот в эту задачи. Автор статьи Райан Вильямс из Массачусетского технологического института доказал, что любая задача, решаемая за время t, требует не t / log t, а всего около sqrt{t} бит памяти! То есть в сто раз сложнейший алгоритм можно решить, увеличив объём памяти всего в десять раз! Это стало ошеломительным открытием для индустрии.

«Этот результат показывает, что интуитивный подход совершенно неверный, — сказал Уильямс в комментарии [16] журналу Quanta Magazine. — Я сначала даже подумал, что-то неправильно [в моём доказательстве], потому что вывод совершенно неожиданный».

Решение Уильямса основано на редукции — преобразовании одной задачи в другую, которая на первый взгляд кажется не связанной с изначальной задачей, но на самом деле они полностью математически [17] эквивалентна ей. Решение одной задачи напрямую решает другую. Эта идея лежит в основе работы Уильямса: любую задачу можно преобразовать в такую, которую можно решить, умело повторно используя пространство, втиснув необходимую информацию всего лишь в квадратный корень от количества бит. Таким образом, исходная проблема решается в этом компактном контейнере.

«Такой прогресс невероятен, — говорит [18] Махди Черагчи (Mahdi Cheraghchi) из Университета Мичигана. — Раньше были задачи, решаемые за определённое время, но многие считали, что это нельзя сделать в столь крошечном пространстве».

Доказательство

Предположение P ≠ PSPACE требует доказать, что в линейном пространстве существует задача, которую невозможно решить за время O(n^k) для любого постоянного kgeq1.

Требуется показать, что существует задача линейного пространства, которую нельзя решить за O(n^k) времени для любого постоянного kgeq1.

В статье Уильямса делается важный шаг к разделению P и PSPACE, потому что он доказал, что существуют задачи, которые можно решить в O(n) пространства, но невозможно решить за время n^2/{log^c}n для некоторого постоянного c textgreater 0.

Это первое общее полиномиальное разделение времени и пространства в надёжной вычислительной модели (а именно, в многоленточной машине Тьюринга [19]). Разделение достигается за счёт демонстрации удивительно эффективной с точки зрения [20] пространства симуляции общих алгоритмов с ограничением по времени.

Более формально, пусть TIME[t(n)] будет классом задач принятия решений, решаемых многоленточными машинами Тьюринга за время O(t(n)), а SPACE[s(n)] — классом задач, решаемых ими же в памяти O(s(n)).

Далее автор доказывает теорему, что для любой функции t(n) geq n выполняется правило:

TIME[t(n)] ⊆  SPACE[sqrt{t(n) log t(n)}]

Для доказательства этой теоремы автор использует хитрую структуру в виде дерева вычислений (Tree Evaluation), а именно — недавно открытый свежий алгоритм для этого дерева.

Вот доказательство по шагам:

  1. Разбиваем работу многоленточной машины Тьюринга на блоки по b шагов, а ленты — на блоки по b ячеек.

  2. Строим абстрактное дерево вычисления. Каждый узел дерева соответствует тому, что происходит с некоторым блоком ленты за b шагов. Дети каждого узла — предыдущие блоки, от состояния которых он зависит.

  3. Получается задача вида Tree Evaluation. Каждая внутренняя вершина дерева — это функция от значения детей, а листья — исходные данные. Нам нужно узнать значение в корне.

  4. Тут самое главное, с точки зрения вычисления. Автор использует опубликованный в 2012 году алгоритм Кука–Мерца [21] для Tree Evaluation, который умеет считать значение в корне в очень маленькой памяти:

O(d⋅b+h log⁡(d⋅b))

где h — высота дерева, b — размер значения в узле, d — число детей узла.

Подбирая длину блока b, то есть балансируя высоту дерева и размер значений, автор получает как раз значение используемой памяти примерно sqrt{t log t}.

Таким образом, любой алгоритм из t шагов на многоленточной машине Тьюринга можно симулировать, используя всего sqrt{t} памяти, точнее, O(sqrt{t log t}).

Как говорилось в известной книге «Programming Perl» [22]: «Если у вас кончилась память, её можно докупить, но если кончилось время — у вас проблема» (в вольном переводе).

За работы по нижним оценкам вычисляемости алгоритмов Райан Уильямс получил премию Гёделя 2024 года [23], есть видеозапись лекции [24] на церемонии в Таллине, где он рассказывает о своих исследованиях (с 18-й минуты). Вышеупомянутая статья Уильямса «Симуляция времени в квадратном корне пространства» [15] 2025 года непосредственно вытекает из этих исследований:

Эффективность использования памяти

По мнению специалистов, благодаря этому прорыву полностью меняется наше теоретическое понимание эффективности компьютеров. Как выясняется, настоящим ограничением является не объём памяти, а эффективность её использования.

Возможно, этот результат на интуитивном уровне был понятен некоторым выдающимся программистам современности, которые создают программы, крайне эффективно работающие с крошечными ресурсами. Из последних примеров:

  • MicroQuickJS [26] от Фабриса Беллара — движок JavaScript для встроенных систем. Он компилирует и выполняет программы на JavaScript, используя всего 10 КБ оперативной памяти. В ПЗУ движок с библиотекой на С занимает 100 КБ (код ARM Thumb-2). При этом скорость компиляции и выполнения кода сопоставима с QuickJS [27], это предыдущая разработка Фабриса Беллара, тоже минималистичный JS-движок, для x86 систем: только файлы С, никаких зависимостей: демо [28], бенчмарки 1 [29] и 2 [30].

Сравнение производительности движков JavaScript

Сравнение производительности движков JavaScript

Эти примеры показывают, что сложные вычислительные задачи действительно можно упаковать в минимальное количество памяти.


Научная статья «Симуляция времени в квадратном корне пространства» [15] («Simulating Time With Square-Root Space») опубликована 25 февраля 2025 года к симпозиуму ACM по теории вычислений в Праге (arXiv:2502.17779).

© 2026 ООО «МТ ФИНАНС»

Автор: ru_vds

Источник [31]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/27310

URLs in this post:

[1] закону Мура: https://en.wikipedia.org/wiki/Moore%27s_law

[2] эмуляции мозга: https://habr.com/ru/news/1008270/

[3] Сверхинтеллекта: https://en.wikipedia.org/wiki/Superintelligence

[4] Интеллект: http://www.braintools.ru/article/7605

[5] памяти: http://www.braintools.ru/article/4140

[6] Вычислительная сложность: https://en.wikipedia.org/wiki/Computational_complexity

[7] время: https://en.wikipedia.org/wiki/Time_complexity

[8] пространство: https://en.wikipedia.org/wiki/Space_complexity

[9] «O» большое: https://en.wikipedia.org/wiki/Big_O_notation

[10] дерьмофикации интернета: https://habr.com/ru/companies/ruvds/articles/954210/

[11] ожирения софта: https://habr.com/ru/companies/ruvds/articles/925028/

[12] массового отупения пользователей: https://habr.com/ru/companies/ruvds/articles/777420/

[13] «О соотношении времени и пространства»: https://dl.acm.org/doi/10.1145/322003.322015

[14] логика: http://www.braintools.ru/article/7640

[15] работа: https://arxiv.org/abs/2502.17779

[16] комментарии: https://www.quantamagazine.org/for-algorithms-a-little-memory-outweighs-a-lot-of-time-20250521/

[17] математически: http://www.braintools.ru/article/7620

[18] говорит: https://www.scientificamerican.com/article/new-proof-dramatically-compresses-space-needed-for-computation/

[19] многоленточной машине Тьюринга: https://en.wikipedia.org/wiki/Multitape_Turing_machine

[20] зрения: http://www.braintools.ru/article/6238

[21] алгоритм Кука–Мерца: https://dl.acm.org/doi/10.1145/2077336.2077337

[22] «Programming Perl»: https://en.wikipedia.org/wiki/Programming_Perl

[23] премию Гёделя 2024 года: https://eatcs.org/index.php/component/content/article/1-news/2982-2024-05-13-10-59-08

[24] видеозапись лекции: https://www.youtube.com/live/0DrFB2Cp7tg

[25] consent.youtube.com: https://consent.youtube.com/ml?continue=https://www.youtube.com/live/0DrFB2Cp7tg?cbrd%3D1&gl=EE&hl=en&cm=2&pc=yt&src=1&escs=AZ8E49DfdGD8jN6KWxq3l6cbskOLJbMR-WPympIWVCw1ZOFwn0m9dVGoYnPx-NfYXWpfnlQV7J1D9pLyeoVvxYyE1wGsf11ebKYo

[26] MicroQuickJS: https://github.com/bellard/mquickjs/blob/main/README.md

[27] QuickJS: https://bellard.org/quickjs/

[28] демо: https://bellard.org/jslinux/vm.html?url=alpine-x86.cfg

[29] 1: https://boajs.dev/benchmarks

[30] 2: https://zoo.js.org/?arch=amd64&v8=true

[31] Источник: https://habr.com/ru/companies/ruvds/articles/1011548/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1011548

www.BrainTools.ru

Rambler's Top100