Разделение строки на две (оптимизация) - 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.
Объяснение кода листинга программы
- Объявлены константы: Reps (количество повторений), WP (количество байт в строке), WT (количество миллисекунд на запись одной строки).
- Создается строка TestString.
- Объявляется переменная sn (количество повторений).
- Объявляется массив s (количество повторений).
- Объявляются переменные buf (буфер), f (файл).
- Создается процедура BufWrite (запись в файл с буфером).
- В первой итерации цикла перезаписывается файл f.
- Если n больше 0, то записывается строка в файл с использованием буфера.
- Записывается информация о времени начала.
- В цикле повторяется запись строки TestString в файл.
- Записывается информация о времени окончания.
- Вычисляется разница между временем начала и окончания.
- Закрывается файл f.
- Создается файл test.txt.
- В цикле от 1 до sn происходит запись в файл test.txt с использованием буфера.
- Файл test.txt закрывается.