Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2011, 16:54   #1
Lenya
 
Регистрация: 05.01.2011
Сообщений: 3
По умолчанию Оптимизация программы

Все привет) Вот задача:
#34.Дан файл, содержащий русский текст. Найти в тексте N<=2000 самых коротких слов,содержащих 2 раза заданную букву. Записать найденные слова в текстовый файл в порядке неубывания длины. Все найденные слова должны быть разными!
Входной файл большой около 1 МБ. Вот как я её решил:
Код:
program Project2;



{$APPTYPE CONSOLE}
{$R+,Q+,I+}

uses
  SysUtils;
const a='а';
const Wmin =1000;
const ABC=['а'..'я', 'А'..'Я','ё','Ё'];

Function EqualWord(n:string; w: array of string; i:integer):boolean; //проверяет выходном массиве w есть ли такое слово n
var l:integer;
begin
  result:=true;
  for l:=1 to i do
    if ansilowercase(w[l])=ansilowercase(n) then result:=false;
end;

Function ShortestWord (w:string;z:array of string; k:integer):boolean; // Проверяет есть ли в массиве z cлова которые длиннее входного слова w
var i:integer;
begin
  Result:=false;
  if z[1]='' then result:=true;
  for i:=k downto 1 do
    if length(z[i])>length(w) then begin
      Result:=true;
      exit;
    end;
end;

Procedure InsertWord(w:string;var z:array of string; var k:integer); //  проверяем куда нам нужно вставить слово w и вставляет по неубыванию длины
var prev,d:string;
    i:integer;
begin
  prev:=w;
  for i:=k downto 1 do begin
    if length(z[i])<length(prev) then begin
      d:=z[i];
      z[i]:=prev;
      z[i+1]:=d;
    end;
  end;
end;

Function Letter(w:string;a:char):boolean; // Проверяет содержит ли слово два раза заданную букву
var  i,j   : integer;
begin
  j:=0;
  Result:=false;
  for i:=1 to length(w) do
    if w[i]=a then inc(j);
  If j=2 then result:=true;
end;
 {#34.Дан файл, содержащий русский текст. Найти в тексте N<=2000 самых коротких слов,
 содержащих 2 раза заданную букву. Записать найденные слова в текстовый файл в
 порядке неубывания длины. Все найденные слова должны быть разными!}
var
    i,j,k : integer;
    s:string;
    z: array [1..2000] of string;//массив найденных слов
    w: array [1..100] of string; //массив слов теущей строки
begin

  rewrite (output, 'output.txt');
  reset (input, 'input.txt');
  while not seekeof do begin
    readln(s);
    s:=s+' ';
    i:=1;
    j:=0;
    while i<=length(s) do begin
      if s[i] in ABC then begin
        inc(j);
        w[j]:='';
        while s[i] in ABC do begin
          w[j]:=w[j]+s[i];
          inc(i);
        end;
        inc(i);
      end
      else inc (i);
    end;
    k:=Wmin;
    for i:=1 to j do begin
      if (Letter(w[i],a)) and (EqualWord(w[i],z,k)) and (ShortestWord(w[i],z,k)) then InsertWord(w[i],z,k);
    end;
 end;
 for i:=1 to Wmin do
   If z[i]<>'' then writeln (z[i],' ');
end.
Программа работает 7 секунд при N=1000, надо что б хотя бы 2-3 секунды. Подскажите, что можно сделать.
Lenya вне форума Ответить с цитированием
Старый 05.01.2011, 17:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

неужто в РГУ учитесь? 1-й курс, преподаватель Григорьев?..

впрочем, если и нет - неважно.
Посмотрите сюда:
Обработка 1мб текста
цитирую оттуда:
Цитата:
помогите пожалуйста нужно обработать 1мб текста за 1сек
"Дан файл, содержащий русский текст. Найти в тексте N<=2000 самых коротких слов, содержащих сочетание из трех алфавитно упорядоченных букв. Записать найденные слова в текстовый файл в порядке неубывания длины. Все найденные слова должны быть разными!"
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.01.2011, 18:56   #3
Lenya
 
Регистрация: 05.01.2011
Сообщений: 3
По умолчанию

Да, учусь именно там.
В той теме вы написали:
Код:
function CompareWords(var  words : matrix;s : ansistring; Cnt : integer):boolean;
var
  i : integer;
begin
  result:=true;
  for i:=1 to Cnt  do
  if words[i]=s then begin
    result:=false;
    exit;
  end;
end;

а вызов, соответственно:
Код:


      (CompareWords(words,s, j-1))
Почему до j-1 проверяем?
Мою программу тормозит именно проверка на одинаковые слова.
Lenya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
оптимизация Terrance! Помощь студентам 8 24.09.2010 10:58
Оптимизация программы!!! $T@LKER Общие вопросы Delphi 10 08.08.2010 21:23
Оптимизация кода программы insi Фриланс 2 17.05.2008 18:30