dmitgu

Categories:

Капитан Приём, штурман м-р Доза и 1-й помощник м-р Перебор (Аэроплан 2)

Я не знал, что наши переводчики придумали совершенной свой текст для этого отрывка из Аэроплана-2 (имена команды видны в субтитрах):

Капитан Over (Over — над), штурман Unger (Under — под), помощник Dunn (Dunno — не знаю)

У нас: 

- Господа, познакомьтесь, это ваш капитан - Капитан Прием. - Господа, добро пожаловать на борт нашего лайнера. - Это ваш штурман мистер Доза и ваш старший помощник мистер Перебор.

На самом деле я тут придумываю Модель исполнения алгоритмов, аналогичную компу. Но мне нужна архитектура с бесконечной памятью для математической модели (теории алгоритмов), в отличие от реальных компов, где предельный размер используемой памяти зависит от разрядности процессора.

В принципе ничего особо сложного (если не считать, что я уже Бог знает какой протокол передачи данных придумываю — улучшая прежние), но мне хочется добиться линейности времени работы от i, j при извлечении подстроки размера j символов из строки s, начиная с позиции i:

str(s, i, j)

И раз канал имеет ограниченную пропускную способность — приходится пускать адрес к нужной ячейке, разбив его на разряды. И количество символов — так же. При движении этих пакетов данных, состоящих из «цифр», от них (пакетов) каждая ячейка отнимает 1. И в нужной ячейке значение из i становится равным 1, затем можно передавать символы и уменьшать j, пока он не станет равным 1.

Но тут есть техническая сложность — когда от разряда 1 отнимаешь 1, то не понятно — делать из 1 ноль, или вообще ничего? Ведь следующая по старшинству  цифра после данной цифры (а у меня цифры в пакете данных идут от младшей в числе к самой старшей) может быть, а может и не быть. Если более старшей нет — то это (-1) от самого старшего разряда, который равен 1 и превращение его в 0. А это не правильно — мы же не пишем нули в числе 10 так: 00010. 

А если число 1, то отнимать 1 вообще поздно — мы уже достигли нужной ячейки. А если число 1 превратить в 0, то дальше (при движении пакета данных через следующую ячейку) вычитание даст 9 и необходимость уменьшить следующий (старший) разряд на 1, а старшего разряда нет. 

Получается, что получив разряд, где цифра 1 или 0, надо не вычитать, а дождаться следующего разряда. Из-за этого не получается обеспечить синхронное движение всех цифр — что обеспечило бы линейность времени работы от i и j.

Но! Ведь никто не мешает мне тупо отнимать единицу, даже если это нельзя делать. Просто в таком случае я дойду до конца (где старшие разряды кончаются) и увижу, что мне надо отнять 1, а отнимать не от чего! Ну и прекрасно — ставлю в сообщении отметку «перебор» и отправляю сообщение дальше. И оно уже идет в конце пакета данных, в бесконечность, и ничего не меняет там. 

То есть — каждое сообщение в пакете делает какие-то изменения в ячейке, но конец пакета сообщает «Перебор» и приводит всё в исходное состояние.

Прикольный момент работы с бесконечной памятью — можно отправлять сообщения в бесконечность и считать, что изменения произошли мгновенно — потому что никакой другой сигнал не обгонит предыдущий и все следующие сигналы имеют дело с результатом работы предыдущего сигнала — куда бы они не обратились. Словно все изменения произошли мгновенно.

И тогда всё упрощается и удаётся добиться линейности. Вот на какой математический «финт» — не думать об остановке пакета данных, а лишь менять его «хвост» на «перебор» — навёл меня русский перевод фрагмента Приём-Доза-Перебор фильма Аэроплан-2. :) 

Ячейка — это Приём (капитан Приём) сообщения (цифры) пакета данных (числа) и отнимает 1 от числа. Пока отнимание укладывается в рамки передаваемого числа — это ячейки в состоянии Дозы. Но когда сообщение доходит до слишком дальних ячеек — начинается состояние Перебор. И думать, как остановить передачу пакета данных — нужды нет )

Error

default userpic

Your reply will be screened

Your IP address will be recorded 

When you submit the form an invisible reCAPTCHA check will be performed.
You must follow the Privacy Policy and Google Terms of use.