Чу Гэ распалялся все сильнее. Он вытащил из кармана сигарету и уже собирался закурить, но, бросив взгляд на Чэнь Чжо, с раздражением засунул ее обратно.
— По идее, это простая складская система: сделать фронтенд и прикрутить базу данных. Но босс уперся и потребовал добавить этот безумный алгоритм распределения.
Чу Гэ взмахнул руками.
— Запасы ограничены. Заказы из городских больниц имеют высший приоритет, следом идут крупные аптечные сети и в последнюю очередь — мелкие клиники в уездах. При этом мы не можем полностью отрезать мелкие клиники: нужно резервировать десятипроцентный неснижаемый остаток и распределять его между ними пропорционально.
Чэнь Чжо слушал молча, не перебивая.
— Когда Лу Цзя писала алгоритм распределения, она использовала вложенные циклы.
Чу Гэ потер виски, чувствуя, как начинает болеть голова.
— Если заказ поступает из больницы, он идет по ветке А: проверить склад, списать. Если из аптеки — по ветке Б: проверить склад, списать пропорционально. Логически в этом нет ничего ошибочного.
Чу Гэ умолк, и его лицо помрачнело.
— Но дедлайн — сегодня ночью. Мы с Лу Цзя скормили программе тридцать тысяч строк сгенерированных данных для стресс-теста. Тридцать тысяч заказов с самыми разными метками приоритета хлынули одновременно. Эти условные операторы «если-иначе» оказались вложены друг в друга на пять или шесть уровней. Серверу приходится снова и снова перебирать, сравнивать и сортировать все эти десятки тысяч заказов на бэкенде.
— И что потом? — спросил Чэнь Чжо.
— А потом загрузка ЦП взлетела до ста процентов, память забилась под завязку, корпусный кулер закрутился так бешено, что чуть не задымился, и система рухнула.
Чу Гэ откинулся на спинку стула.
— Временная сложность алгоритма слишком высока. Мы с Лу Цзя провозились весь день, подкручивая параметры, но что бы мы ни меняли, все заканчивалось дедлоком. Босс сказал, что софт должен работать уже сегодня ночью. Если программа не выдержит эти тридцать тысяч одновременных запросов, мы потеряем остаток выплаты — больше десяти тысяч юаней.
Выговорившись, Чу Гэ уставился на Чэнь Чжо глазами, полными отчаянной надежды.
— Братец Чжо, ты голова, и база по математике у тебя мощнейшая. Можешь помочь разобраться? Что в корне не так с базовой логикой?
Чэнь Чжо сидел за столом, его взгляд упал на лежавший на столе том Ландау. Он молча размышлял несколько секунд.
Он все понял.
Проблема, с которой столкнулись Чу Гэ и Лу Цзя, заключалась в попытке пройти лабиринт самым прямолинейным и неуклюжим методом грубой силы.
При малом объеме данных компьютер справляется с проверкой личностей поодиночке, выстраиванием их в очередь и выделением ресурсов.
Но как только объем данных взрывается по экспоненте, вложенные циклы превращаются в вычислительную черную дыру.
С точки зрения чистой логики, это изоморфно тупику, в который он уперся при чтении статьи той принстонской команды.
Команда Делиана пыталась использовать исчисление непрерывного пространства-времени для преодоления сингулярности и столкнулась с расходимостью. Чу Гэ с напарницей пытались обрабатывать громадный массив переплетенных заказов с помощью линейных условных операторов и столкнулись с переполнением памяти.
Чэнь Чжо кивнул.
— Ваш подход изначально был ошибочным.
Тон Чэнь Чжо оставался ровным.
Чу Гэ остолбенел, приоткрыв рот.
— Ошибочным? Распределение на основе условной логики — разве это не самый надежный метод планирования, которому учат в учебниках по программированию?
Чэнь Чжо не спешил с объяснениями.
Он потянулся за чистым листом бумаги, который использовал ранее — исписанным формулами по физике.
Бросив взгляд на плотные вычисления на лицевой стороне — теорию Ландау, которую он только что заканчивал выводить, — Чэнь Чжо небрежно перевернул лист. На обороте был напечатан устаревший код на Си.
Строки кода шли с большими отступами, оставляя между ними множество пустых мест.
На одном из таких свободных участков он легонько чиркнул пером, поставив черную точку.
— Вы обращаетесь с этими заказами так, будто люди выстроились в очередь за билетами.
Объяснял Чэнь Чжо, продолжая делать пометки.
— Очередь становится слишком длинной, поэтому у билетных касс вы организуете три разные линии. Для каждого подошедшего человека приходится спрашивать: откуда ты? — прежде чем решить, в какую сторону его направить. Когда толпа разрастается до предела, проход намертво заклинивает.
Чу Гэ подался ближе, не сводя глаз с черной точки под пером Чэнь Чжо.
— Если они не выстраиваются в очередь, как тогда их сортировать? — спросил Чу Гэ.
Чэнь Чжо набросал еще несколько черных точек на значительном расстоянии от первой, а затем соединил их прямыми линиями.
— Рассматривайте их как отдельные узлы состояния.
Одним взмахом запястья Чэнь Чжо набросал на бумаге структуру двудольного графа, а вовсе не древовидные ветвления, о которых рассказывал Чу Гэ.
— Отбросьте мышление линейного перебора. Представьте больницы, аптеки и клиники в виде алгебраических точек с разными весами. Превратите имеющиеся запасы в множество.
В другом пустом углу листа Чэнь Чжо быстро набросал несколько базовых переменных из дискретной математики, после чего применил минималистичную формулу матричного отображения.
— В этой дискретной матрице не нужно выяснять условия через если. Поступает заказ, и он приносит с собой весовой коэффициент — скажем, три для больницы, два для аптеки, единицу для клиники. Вы напрямую выполняете матричное умножение между матрицей заказов и матрицей запасов. Те, у кого выше вес, разумеется, сопоставятся с узлом запасов первыми.
Чэнь Чжо поставил финальный штрих в формуле.
— Если какой-то узел запасов опустошается до нуля, он деактивируется в матрице, и последующие сопоставления станут пропускать его автоматически. Вся логика выполняется за одну матричную операцию вместо прогона через десятки тысяч вложенных циклов.
Записав последнюю строчку, Чэнь Чжо подвинул черновик к Чу Гэ.
Чу Гэ вгляделся в четкую матричную структуру на бумаге, а его мозг лихорадочно переводил математические символы на привычный язык баз данных.
Хотя математическая база Чу Гэ уступала багажу Чэнь Чжо, он все-таки сумел поступить в такое заведение, как класс одаренной молодежи в Кэда. Его логического мышления вполне хватало для высшего уровня понимания.
Он разглядывал записи около полминуты.
— Охереть...
Чу Гэ резким движением вскинул голову. Упадочнический блеск в его глазах полностью исчез, сменившись яркой искрой внезапного озарения.

Комментарии

Загрузка...