Design Part 3.2.1

BEGIN {копируем серии попмременно в Result1 и Result2}

Switch:= ‘1’;

Ch:= ‘#’;

WHILE NOT EOLN(FileIn)

DO

BEGIN

LastCh:= Ch;

READ(FileIn, Ch);

{если конец серии, то переключаем переменную Switch на другой файл};

{копируем Ch в Result1, если Switch=’1’, в противном случае – в Result2}

END

END

В переменную Ch заносится произвольное значение # до входа в цикл WHILE, так что окно существует уже при встрече первого символа.

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

Шаг Разделенные строки Склеенные строки
      wrcaot
Разделение w·c r·aot  
Слияние      
  w·c aot r
  c aot rw
  c ot rw·a
    ot rw·ac
     

После первого шага слияния символ r, добавленный к склеенной строке меньше, чем w первой разделенной строки, поэтому эта серия еще не была закончена; однако r больше, чем a второй разделенной строки, поэтому серия во второй строке уже окончена.

Более систематический анализ этой ситуации может быть совершен с использованием таблицы анализа отношений между последним символом, добавленным к склеиваемой серии m, следующим символом s в Temp1 и следующим символом t в Temp2.

  s < t s ≥ t
m ≤ s m ≤ t t > s ≥ m обе серии продолжаются следующий символ – в Temp1 s ≥ t ≥ m обе серии продолжаются следующий символ – в Temp2
m ≤ s m > t t > s ≥ m > t невозможное условие s ≥ m > t серия в Temp2 закончилась следующий символ – в Temp1
m > s m ≤ t t ≥ m > s серия в Temp1 закончилась следующий символ – в Temp2 s ≥ t ≥ m > s невозможное условие
m > s m > t m > t > s обе серии закончились следующий символ – в Temp1 m > s ≥ t обе серии закончились следующий символ – в Temp2

Этот анализ приводит нас к измененному проекту процедуры MergeRuns. Наиболее очевидное изменение в том что символ Ch должен быть инициализирован меньшим значением из In1 и In2, так чтобы могли быть применены проверки.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: