Разделение строки на две (оптимизация) - Pascal

Узнай цену своей работы

Формулировка задачи:

Читаю из файла строки. Фишка в том, что каждая строка у меня выдаётся в виде "Example1 Example2", соответственно первую часть до пробела мне надо засунуть в один массив, а вторую соответственно во второй. Я беру конкретную строку, ищу её длину, создаю новый цикл, в котором ищу пробел, и когда нахожу, я делю строку с помощью Copy и Delete. Проблема моя в том, что это всё ужасно долго, и моя программа в системе проверки на одном из тестов начинает вылетать по тайм-вылету, и я как я понял, то именно из-за моего способа деления и записывания. Хотелось бы услышать по оптимизации или вообще кардинально новую идею. Мой код процедуры ниже:
Procedure mas;
var k,l:integer;
begin
for k:=1 to n do begin
readln(f, a[k]);
temp:=a[k];
max1:=length(temp);
for l:=1 to max1 do begin
if temp[l]=' ' then  begin 
a[k]:=copy(temp, l+1, max1);
delete(temp, l, max1);
b[k]:=temp;
break;
end;
end;
end;
end;

Решение задачи: «Разделение строки на две (оптимизация)»

textual
Листинг программы
const
  Reps=100000; WP=22; WT=6;
  TestString='test string';
  sn=7;
  s: array [1..sn] of Integer = (0,1,2,4,6,8,16);
var
  buf: array[1..1024*16] of Byte;
  f: Text;
  i: Integer;
procedure BufWrite(n: Integer);
var
  t1, t2: TTime;
  rep: Longint;
begin
  Rewrite(f);
  if n>0 then begin
    SetTextBuf(f,buf,1024*n);
    Write('Запись с буфером ',n:2,'K: ')
  end else Write('Запись без буфера: ');
  with t1 do GetTime(h, m, s, s100);
  for rep:=1 to Reps do begin
    WriteLn(f,TestString);
  end;
  with t2 do GetTime(h, m, s, s100);
  WriteLn(DiffTime(t1, t2):WT);
  Close(f);
end;
 
begin
  Assign(f,'test.txt');
  for i:=1 to sn do BufWrite(s[i]);
end.

Объяснение кода листинга программы

  1. Объявлены константы: Reps (количество повторений), WP (количество байт в строке), WT (количество миллисекунд на запись одной строки).
  2. Создается строка TestString.
  3. Объявляется переменная sn (количество повторений).
  4. Объявляется массив s (количество повторений).
  5. Объявляются переменные buf (буфер), f (файл).
  6. Создается процедура BufWrite (запись в файл с буфером).
  7. В первой итерации цикла перезаписывается файл f.
  8. Если n больше 0, то записывается строка в файл с использованием буфера.
  9. Записывается информация о времени начала.
  10. В цикле повторяется запись строки TestString в файл.
  11. Записывается информация о времени окончания.
  12. Вычисляется разница между временем начала и окончания.
  13. Закрывается файл f.
  14. Создается файл test.txt.
  15. В цикле от 1 до sn происходит запись в файл test.txt с использованием буфера.
  16. Файл test.txt закрывается.

Оцени полезность:

12   голосов , оценка 3.917 из 5
Похожие ответы