минимизировать кол-во сверок на достижение конца входных данных

Тема в разделе "WASM.A&O", создана пользователем varnie, 18 июн 2008.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    доброе утро.

    вопрос такой -- пусть имеется массив некоторых данных. требуется пробежаться по нему и на некоторых шагах при попадании текущей считанной комбинации под определенное правило выполнить нек. действия. мое непонимание в том, что я не знаю, каким образом можно "выкусить" из реализованного кода проверку на кажд. шаге на предмет того, что мы не вылетели за размер массива.
    суть моей задачи сводится к задаче некоего парсера, но вот не ясно мне, каким образом можно минимизировать число проверок на вылет за пределы входных данных.
    в инете что-то читал про добавление "терминального" символа в конец входных данных, и про дальнейшее его "подверстывание". мне не ясно, как это может мне помочь, т.к. проверка по прежнему остается.
    будет что-то типа: "if (curSymbol() == MAGIC_TERMINAL_SYMBOL) {printf("finished!"); exit()}". но выходит что терь эта проверка по сто раз будет чекаться при кажд шаге, а это не выход.

    есть соображения? ;) спасибо.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    varnie
    1. Зачем выкидывать это что так сильно мешает?
    2. можно минимизировать воздействия мы просто делаем цикл от 1 до length(массив).
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    varnie
    Если у тебя проверяюся элементы с i по i+k, то ты можешь проверить что i<N-k, и спокойно обрабатывать эти элементы не проверяя на каждом из них. Или можно приписать k элементов к концу массива и присвоить им такие значения, чтобы алгоритм не стал их обрабатывать.
     
  4. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Pavia
    1. нет, не мешает, но что-то мне подсказывает, что вызовы этой проверки на середине массива избыточны и ее хочется как-то устранить
    2. у меня рекурсивный нисходящий парсер, а потому невозможно тупо ограничить весь его 'забег' циклом от 1 до length(массив). т.е. я задаю точку старта, допустим, ф-цию entry();, далее в ней осуществляется пробег парсером по statement-block(); который выливается в statement-assign() || statement-if() || итд. думаю, суть передал.
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    varnie
    Если у тебя ровно один проход по массиву то ничего страшнего, избыточности нет.
    А если ты читаешь по несколько раз одни и тежи данные или просто проходишься по ним несколько раз, то есть избыточность. И нужно переделывать код.
    Далее совет читать про автоматы.
     
  6. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Pavia
    да, ровно один проход, с проверкой на не вылет за его пределы на каждом шаге прохода...
    про автоматы - у меня, собственно, как КА все и реализовано.
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    varnie
    Если это возможно, то дописать в конец массива "некоторые данные", которые будут удовлетворять "определенному правилу". В этом случае можно будет делать проверку на конец массива не на каждом шаге, а только при нахождении искомой комбинации