Pull to refresh
0
0
Валерий Русаков @valerar

Аналитик

Send message
А вот это уже серьёзный разговор, буду отвечать серьёзно.
Если много раз и из разных источников слышите фразу «разберитесь сначала», то наверно это не просто так.

Ситуация в истории не новая. Поэтому, в любом случае самопроверки и проверки утверждений комментаторов присутствуют. Ещё спасают вменяемые комментаторы.
Обратите внимание на моменты, которые являются однозначными индикаторами понимания, что тут что-то не так:

За последующий разбор отдельное спасибо.
Движение в двух направлениях — либо нужно всю строку держать в памяти либо делать хитрую буферизацию.

Это так. Однако хотелось бы пример где это не так. Формула должна лежать в памяти либо быть разбита на логические блоки.
Минимум 4 разнонаправленных прохода по одним и тем же местам строки с произвольной дистанцией:

Хотелось бы понять что Вас смущает. Тоже самое происходит в алгоритмах с ОПН. Или положить в стек -> вытащить из стека это не вперёд — назад? Или положить "(" в стек -> дойти до ")" -> развернуться и выбрать всё до "(" это не вперёд-назад? Или сначала посимвольно сформировать операнды -> положить операнд в стек -> вытащить операнд из стека Это не вперёд назад? Или в ОПН не считается? И это ещё я кратенько по ОПН.
Модификация строки: предлагается заменять фрагмент (операции копирования, выделение памяти и прочие радости), плюс для этого нужно число сконвертировать в строку и потом опять парсить

Вот здесь вы не очень внимательно прочитали. В Пинг-Понге есть только две рабочих памяти: 1. Рабочая строка 2. строка Фрагмента. В ОПН минимум три: 1. Рабочая строка 2. стек для операций 3. стек для операндов (вариант наиболее эффективного использования ОПН) либо (вариант неэффективного использования) 1. Рабочая строка 2. выходная очередь (ОПН), которая в дальнейшем для расчётов требует дополнительного стека для операндов. То есть всё равно ТРИ памяти. Вас смущает что вместо двух стеков используется строка? — не скажу что это серьёзный аргумент.
Подмена понятий: использование регулярного выражения это не избавление от посимвольного прохода, это использование чего-то готового.

Ну если Вы в курсе регулярных выражений, то скажите чего. Я бы, например, использовал конструкцию практически типа маски и быстро и эффективно. Что применяется при анализе КАЖДОГО символа в ОПН, чтобы определить кто есть кто, это я про символы? или у вас машина каким то неведомым способом узнаёт что это есть операция, а это число, а тут ещё и скобка затерялась. Разочарую всё через сравнение двух символов происходит. А в регулярных выражениях можно было бы попробовать механизмы поиска фрагмента текста. Очень даже эффективная технология.
Ну а по поводу использования чего-то готового, так в любом языке высокого уровня любой оператор это конструкция из блоков более низкоуровневого языка. Предлагаете писать в машинных кодах?
И коллеги должны поверить, что это эффективнее однонаправленного прохода + использование стэка с числами (сортировочная станция + дерево расчета)?

Коллегам стоит поверить что существует не только ОПН. Кстати, в статье я ратовал не за Пинг-Понг, а за отмену монополии ОПН. Про большую эффективность Пинг-Понга по производительности в статье не найдёте ни слова. А вот эффективность ОПН на больших сложных формулах с множественными вложениями скобок у вопросы действительно вызвала.
Нет, об этом всё-таки надо отдельно
эффективнее однонаправленного прохода + использование стэка с числами (сортировочная станция + дерево расчета)?

про однонаправленный проход — если по рабочей строке вы идёте один раз в одну сторону, то стоит посчитать количество суеты, которая образуется в других местах.
про использование одного стека — хотел бы увидеть хоть одного человека, который сможет прийти от исходной инфиксной записи к конечному результату с помощью ОДНОГО стека на достаточно сложной формуле с вещественными операндами длиной >= 3.
Кстати, в силу вышесказанного, мне не кажется что Вы хорошо разбираетесь в ОПН.
С какой целью это необходимо было разбирать в комментариях пошагово, если уже давно описано в литературе?

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

Ну вот Вы и стали упорядочивать мои мозги по вашей задаче :)
«Формулы» на входе — уравнения расчетов, на выходе получаем габариты заготовок. Формулы меняются время от времени из-за изменения технологий или используемых материалов (далеко не каждый день). Список деталей каждый раз новый.

Становится ещё немного понятнее.
Уточните ещё пожалуйста кто запускает эти расчёты и какая ваша связь с такими людьми как разработчика программы
Вы зря записываете меня в антагониста ОПН. Он много где эффективно используется, наверное и в компиляторах очень полезен, не знаю, компиляторами не занимался.
Но давайте реально посмотрим на обсуждение — ну просто битва за предмет религиозного культа.
Да и с Вами у нас очень как-то по смешному:
— это один алгоритм.
— нет это два разных алгоритма
— результат в итоге один?
— нет можно распарсивать деревья для последующей оптимизации
Ну и т.д.
Это не упрёк.
Только что с другим комментатором мы провели разбор обработки записи ОПН по шагам. Товарищ первый сказал что ОПН должна ложиться исходно не в стек (LIFO), а в очередь (FIFO), но чтобы посчитать нужен ещё и пустой стек для операндов. И что эффективнее сразу использовать два стека, чтобы обеспечить расчёты сходу. Но тогда «безскобочники» встают на уши. Не начинают разбираться, а сразу бросаются в бой. Ну и что это как не религиозные убеждения?
Так что, как оказалось, всё ещё хуже чем я думал изначально. Так что даже не просто в ОПН дело.
Хорошо. Давайте я попробую по ваше методе.
Участники: 1. очередь (FIFO) содержит ОПН; 2. стек (LIFO) пустой
Примечание: Это уже не схема с одним стеком, часто отстаиваемая в комментариях
Расчёт:
1.«A B C D E F + / — * +»
2. А — достали из очереди; число — положили в стек; (А) — состояние стека
3. B — достали из очереди; число — положили в стек; (АB) — состояние стека
4. C — достали из очереди; число — положили в стек; (АBC) — состояние стека
5. D — достали из очереди; число — положили в стек; (АBCD) — состояние стека
6. E — достали из очереди; число — положили в стек; (АBCDE) — состояние стека
7. F — достали из очереди; число — положили в стек; (АBCDEF) — состояние стека
8. + — достали из очереди; операция — вытащили E и F = r1 в стек (АBCDr1) — состояние стека
9. / — достали из очереди; операция — вытащили r1 и D = r2 в стек (АBCr2) — состояние стека
10. "- " — достали из очереди; операция — вытащили r2 и C = r3 в стек (АBr3) — состояние стека
11. * — достали из очереди; операция — вытащили r3 и B = r4 в стек (Аr4) — состояние стека
12. + — достали из очереди; операция — вытащили r4 и А = r5 в стек (r5) — состояние стека
Умышленно прошёл всё, чтобы было видно: во-первых, работа возможно только с 2-мя выходными объектами (это любителям рассуждать про один стек, не вам); во-вторых, у нас получается три этапа:1. преобразование в ОПН 2. перенесение операндов в стек 3. непосредственно расчёт формулы. Это уже любителям рассказывать про всё за один проход.
Согласен с Вами, использовать сразу два стека сильно эффективнее (часть расчётов происходит сходу, но тогда придётся работать со скобками, а это уже больно сердцу «безскобочников».
Кстати, Вы очень замечательно заменили первичное хранилище ОПН очередью. Вы первый кто вообще произнёс это слово в обсуждении.
Не знаю как у Вас, а у меня точно складывается ощущение, что большая часть комментирующих плохо представляют работу алгоритмов на ОПН. И не понятно что с этим делать… :((
Вы сейчас серьёзно?
Я уже попросил одного из комментаторов разделить эти алгоритмы между собой на примере из классической книги по алгоритмам, указанной в начале статьи. Можете тоже попробовать.
Не надо мантр, давайте что-нибудь сделаем реальное.
Использовать и понимать несколько разные вещи. Мы часто в жизни используем то, что до конца не понимаем. Поэтому и предложено приверженцам одного стека и простоты суммарного алгоритма преобразование — расчёт провести натурный эксперимент на бумаге. Такие эксперименты сильно прочищают мозги.
В статье присутствует пошаговое исполнение ОПН, правда на небольшом кусочке, который был достаточен для демонстрации. Также в статье присутствует полный расчёт той же формулы на Пинг-Понге.
В данном случае я имел ввиду алгоритм получения конечного результата через преобразование в ОПН. Так что объедините вместе обозначенные вами части и получите результат. Всё просто.
Не вижу смысла. Мы обсуждаем алгоритмы.
Не совсем так. Я считаю, что с учётом преобразования на больших формулах его эффективность под вопросом. Его эффективность максимальна на коротких с одноприоритетными операциями формулах. При появлении скобок и вещественных операндов с длиной > 1 его эффективность сильно падает.
Я правильно понял, что единственный недостаток, вменяемый обратной польской нотации, — это неинтуитивность?

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

Да, я тоже видел. И они, кстати, за редким исключением, предпочитают говорить о конкретике.
Так что я не против ОПН как таковой, я против её роли в современном учебном процессе и превращения её в объект религиозного поклонения.
Я не совсем понял конечный результат расчёта.
надо рассчитать комплектующие для его изготовления.

Это не результат. Ну хотя бы потому, что существует конструкторская документация в которой все комплектующие на изделие определены и описаны, даже если изделие может иметь разные массо-габаритные характеристики.
Если вам интересно, давайте посмотрим на уровне логики.
Про статичность формул. У меня почему-то сложилось впечатление что у вас есть некоторый набор формул, фиксированный, с помощью которых (комбинируя состав которых) вы получаете требуемый результат. То есть сами формулы не изменяются, а становятся фрагментами некоторой общей в той или иной комбинации.
Нет. Вторая, конечно же, существенно тяжелее.
Вопрос только сколько потребуется маленьких в одном месте и сколько больших в другом.
Не подумайте что я ёрничаю, приятно иметь дело с человеком, который может доказать свои слова делом.
если цифры на место подставить то вычисление в ОПН я произведу гораздо быстрее чем вы в оригинале

Предлагаю сделать так: пока Вы подставляете цифры и рисуете пошаговое исполнение (у меня оно просто уже нарисовано для Пинг-Понга), я соберу ваши утверждения с комментариев и мы сопоставим эти утверждения с пошаговым исполнением. Работка, конечно, та ещё, но тогда всё встанет на свои места.
У меня только три вопроса по результату:
1. наличие (-1) каким образом сохранились скобки?
2. выражение «EFGHJ(-1)*-» Нет ли у вас ощущения что операций явно недостаточно для такого количества операндов?
3. Каким образом будет рассчитываться выражение, если оно лежит в одном стеке, а мы должны для выполнения к каждой операции присоединить ещё и пару операндов?
Ну за ссылку я уже поблагодарил.
Нас учили, что там два чёрных ящика, связанные в «конвейер».

Хм-м… давайте обратимся к классикам.
image

Где бы вы поставили на этой картинке разграничение между двумя чёрными ящиками? Действительно интересно. Я, например вижу единый процесс в котором присутствует и считывание и сортировка и вычисления вперемешку.
можно изобретать всё что угодно, но не удивляйтесь тому, что ваших благих побуждений не понимают те, кто занимается вопросом более глубоко.

Читая комментарии я убедился что ОПН, в большинстве случаев, это вера, а перед верой логика бессильна. Так что если хотите, то можно поговорить без мантр и камланий. В ином случае это не имеет смысла.
Спасибо за корректное указание на мои ошибки. Действительно, рассматривая алгоритмы как целостное получение результата от одинаковых исходных данных я несколько упустил специфику терминологии.
Что интересно, так это то, что в комментариях отсутствует пошаговый разбор алгоритма на ОПН. Утверждения есть, а разбора нет. И это говорит о многом, например, о неполном понимании его работы «нажми на кнопку — получишь результат». И это не только в комментариях, но и в достаточно серьёзной литературе.
Если у Вас есть время, то можем в режиме диалога попробовать устранить нестыковки и противоречия, которые присутствуют в описании алгоритма и его реальном пошаговом исполнении.
Собственно это общеизвестно. Но можете посмотреть какие-нибудь материалы по профилированию.
А вопрос по сути — просто из интереса, а как еще можно было этот велосипед соорудить)

Если я правильно понял, то в вашей задаче формулы статичны и изменяются только переменные. В таком случае, ну так сходу с тяжёлой головой, отдать формулы на откуп компилятору — пусть сам разбирается, а потом, в процессе работы скармливать значения переменных упорядоченным массивом. Даже если формул несколько. достаточно помнить только кому какой массив подсунуть.

Information

Rating
Does not participate
Location
Новосибирск, Новосибирская обл., Россия
Date of birth
Registered
Activity