Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Эффективность алгоритма... А Ты сможешь лучше??   Найти похожие ветки 

 
MBo ©   (2005-12-28 17:18) [40]


procedure ParseString(const s:string; var Longest, Shortest, NumWords:Integer);
const
 Delimiters = [" ",",","."];
var
 i, CurrLen, LastDelim:Integer;
 StateInWord: Boolean;

 procedure EndOfWord;
 begin
   CurrLen:=i-LastDelim;
   if CurrLen>Longest then
      Longest:=CurrLen;
   if CurrLen<Shortest then
     Shortest:=CurrLen;
   Inc(NumWords);
   StateInWord := False;
 end;

 procedure StartWord;
 begin
   LastDelim:=i;
   StateInWord:=True;
 end;

begin
 Longest:=0;
 Shortest:=MaxInt;
 LastDelim:=0;
 NumWords:=0;
 StateInWord:=False;
 for i := 1 to Length(s) do
   if (s[i] in Delimiters) then begin
     if StateInWord then
       EndOfWord
   end else
     if not StateInWord then
       StartWord;
 if StateInWord then
   EndOfWord;
 if NumWords=0  then
   Shortest:=0;
end;


 
Джо ©   (2005-12-28 17:21) [41]


> [40] MBo ©   (28.12.05 17:18)

Красиво.


 
Игорь Шевченко ©   (2005-12-28 17:25) [42]

procedure StringStats (const S: string;
 var WordCount, MinWordSize, MaxWordSize: Integer);
var
 P, PStartWord: PChar;
 MinLength, MaxLength, CurrentLength: Integer;
begin
 WordCount := 0;
 MinWordSize := 0;
 MaxWordSize := 0;
 MinLength := Length(S) + 1;
 MaxLength := 0;
 P := PChar(S);
 while P^ = " " do
   Inc(P);
 while P^ <> #0 do begin
   Inc(WordCount);
   PStartWord := P;
   while P^ > " " do
     Inc(P);
   CurrentLength := P - PStartWord;
   if CurrentLength < MinLength then begin
     MinWordSize := CurrentLength;
     MinLength := CurrentLength;
   end;
   if CurrentLength > MaxLength then begin
     MaxWordSize := CurrentLength;
     MaxLength := CurrentLength;
   end;
   while P^ = " " do
     Inc(P);
 end;
end;


 
MBo ©   (2005-12-28 17:31) [43]

Более краткая форма с подчеркнутой "конечноавтоматностью":


procedure ParseString2(const s:string; var Longest, Shortest, NumWords:Integer);
const
 Delimiters = [" ",",","."];
var
 i, CurrLen, LastDelim:Integer;
 StateInWord: Boolean;

 procedure ChangeState;
 begin
   if StateInWord then begin
     CurrLen:=i-LastDelim;
     if CurrLen>Longest then
        Longest:=CurrLen;
     if CurrLen<Shortest then
       Shortest:=CurrLen;
     Inc(NumWords);
   end else
     LastDelim:=i;
   StateInWord := not StateInWord;
 end;

begin
 Longest:=0;
 Shortest:=MaxInt;
 LastDelim:=0;
 NumWords:=0;
 StateInWord:=False;
 for i := 1 to Length(s) do
   if (not (s[i] in Delimiters)) xor StateInWord then
     ChangeState;
 if StateInWord then
   ChangeState;
 if NumWords=0  then
   Shortest:=0;
end;



 
Игорь Шевченко ©   (2005-12-28 17:34) [44]

MBo ©   (28.12.05 17:31) [43]


>   if (not (s[i] in Delimiters)) xor StateInWord then


Ты меня, конечно, извини, но эта строка нечитабельна :)


 
MBo ©   (2005-12-28 17:39) [45]

>Игорь Шевченко ©   (28.12.05 17:34) [44]
>Ты меня, конечно, извини, но эта строка нечитабельна :)

Осознавая это, я сначала и дал развернутую версию ;))


 
DErad   (2005-12-28 17:44) [46]


> Спасибо! Я не претендую на звание вундеркинда и уже работаю.
>  Просто решил несколько автоматизировать свою работу...
> Конечно чтобы написать процедуру я создал нечто вроде блок-
> схемы, но в виде простых предложений. Собственно, изложил
> подход на листе фразами.

А тебе лет сколько? если можно узнать!!!


 
Курдль ©   (2005-12-28 17:51) [47]


> Игорь Шевченко ©   (28.12.05 17:25) [42]


Не мытьем, так катаньем аутор научился писать оптимальные процедуры! Вот его терь на работе похвалють! :)


 
OldNaum ©   (2005-12-28 18:02) [48]

MBo ©   (28.12.05 17:31) [43]
красиво, блин.


 
Vlad433 ©   (2005-12-28 18:22) [49]

procedure StringStats (S: string; var WCount, MinWord, MaxWord: Integer);
var
P:Char; MinLength, MaxLength, i, CurLength: Integer;
begin
WCount:=0; MinWord:=1000000;MaxWord:=0;CurLength:=0;
for i:=1 to Length(S)+1 do
begin
 P:=S[i];
 if P in [" ",#0] then if CurLength=0 then continue else
 begin
  if CurLength<MinWord then MinWord:=CurLength;
  if CurLength>MaxWord then MaxWord:=CurLength;
  CurLength:=0; Inc(WCount);
 end else Inc(CurLength);
end;
end;


 
Sha ©   (2005-12-28 19:54) [50]

procedure TelegramStatistics(s: string; var wordcount, minlen, maxlen: integer);
const
 characters= ["0".."9","A".."Z","a".."z","А".."Я","Ё","ё","а".."я"];
var
 i, len: integer;
begin;
 wordcount:=0;
 minlen:=MaxInt;
 maxlen:=0;
 len:=0;
 if s<>"" then for i:=1 to Length(s)+1 do
   if s[i] in characters
   then inc(len)
   else if len>0 then begin;
     inc(wordcount);
     if minlen>len then minlen:=len;
     if maxlen<len then maxlen:=len;
     len:=0;
     end;
 end;


 
Verg ©   (2005-12-28 20:09) [51]


> Игорь Шевченко ©   (28.12.05 17:34) [44]
> MBo ©   (28.12.05 17:31) [43]
>
>
> >   if (not (s[i] in Delimiters)) xor StateInWord then
>
>
> Ты меня, конечно, извини, но эта строка нечитабельна :)


Хм, чем же?


 
Verg ©   (2005-12-28 20:30) [52]

Ах да, с т.з. логики, xor следовало бы заменить на <>
Было бы очевиднее ? Т.е. "читабельнее"?


 
pasha_golub ©   (2005-12-28 20:32) [53]


> Verg ©   (28.12.05 20:09) [51]
>
>



if (not (s[i] in Delimiters) and not StateInWord) or
  ((s[i] in Delimiters) and StateInWord) then...


Потому шо надо было так ;0))

PS Части разделенные OR можно было писать без скобок, но ради наглядности всегда пишу так...


 
Sha ©   (2005-12-28 20:33) [54]

> Verg ©   (28.12.05 20:30) [52]

Еще читабельнее
if StateInWord=(s[i] in Delimiters) then


 
Verg ©   (2005-12-28 20:38) [55]


> pasha_golub ©   (28.12.05 20:32) [53]


Это вообще ф топку.


 
pasha_golub ©   (2005-12-28 20:40) [56]


> Verg ©   (28.12.05 20:38) [55]


Господе, все такие сурьезные...
Гоню я... По правилу какому-то преобразовал, да и все...

Что наша жизнь? Игра! (с) Пиковая дама, по-моему

;0)


 
Verg ©   (2005-12-28 20:46) [57]


> Что наша жизнь? Игра! (с) Пиковая дама, по-моему

http://lain.ru/trash/curveball.swf


 
pasha_golub ©   (2005-12-28 20:48) [58]


> Verg ©   (28.12.05 20:46) [57]


КЛАСС!!! Блин, а я ссылку на нее потерял в свое время. Огромное спасибо, чессслово.


 
Verg ©   (2005-12-28 20:50) [59]

В догонку...

http://lain.ru/trash/curveball.swf
http://yonkis.com/mediaflash/yeti_gore.htm


 
pasha_golub ©   (2005-12-28 20:55) [60]


> http://yonkis.com/mediaflash/yeti_gore.htm


Оригинальный вариант, интересней, ИМХО.


 
OldNaum ©   (2005-12-28 21:03) [61]

<offtop>
блин, ну не даром Sha на FastProject"e рулит :D

кстати, выигрывал когда-нибудь в итоге? интересно, просто ) я щас частенько туда заглядываю. интересная все-таки штука. щас в инете все чаще можно встретить пакеты компонентов на базе FP.
</offtop>


 
Verg ©   (2005-12-28 21:11) [62]


> pasha_golub ©   (28.12.05 20:55) [60]
>
> > http://yonkis.com/mediaflash/yeti_gore.htm
>
>
> Оригинальный вариант, интересней, ИМХО.


Просто, предложенный мной - это для тех, кому оригинал остопаршивел уже в тошноту. :)) Чтобы было знать что есть хужее :)))


 
MBo ©   (2005-12-28 22:20) [63]

>Verg ©   (28.12.05 20:09) [51]
> >   if (not (s[i] in Delimiters)) xor StateInWord then
> Ты меня, конечно, извини, но эта строка нечитабельна :)
>Хм, чем же?

Ну загнул я там, конечно...  ;)
Стоило сделать так:
if  (s[i] in Delimiters) <> StateInWord then


 
Sha ©   (2005-12-28 22:32) [64]

> OldNaum ©   (28.12.05 21:03) [61]
> выигрывал когда-нибудь в итоге? интересно, просто )

в некоторых номинациях :)


 
Verg ©   (2005-12-28 22:34) [65]


> MBo ©   (28.12.05 22:20) [63]


Нормально все. :)

Делай как хочешь - МЫ - разрешаем :))))))))))))))


 
MasterPaleva ©   (2005-12-29 05:23) [66]

Я так понял, что нужно сделать без использования функций и процедур, чтобы повысить эффективность алгоритма. Не считая length :)



var
i, j, slov,n, n2: integer;
str: string;

...

slov:=0;
j:=0;
n:=0;
n2:=length(str);
for i:=1 to length(str) do begin
 if str[i]=" " then begin
    inc(slov);
    j:=i-j-1;
    if j>n then  n:=j;
    if j<n2 then n2:=j;
 end;

end;


В работе не проверял, щас Делфи не стоит. Вроде быстрее...


 
vidiv ©   (2005-12-29 06:22) [67]

$data = "Стой, собака моя!";

preg_match_all("/[A-Za-zА-Яа-я]+/s", $data, $out);
if (count($out[0])) {
$minlen = strlen($out[0][0]);
$maxlen = strlen($out[0][0]);
for ($i=1; $i<count($out[0]); $i++) {
 if (strlen($out[0][$i])<$minlen) $minlen = strlen($out[0][$i]);
 if (strlen($out[0][$i])>$maxlen) $maxlen = strlen($out[0][$i]);
}
echo "Длина самого короткого слова: ".$minlen."<br>";
echo "Длина самого длинного слова: ".$maxlen."<br>";
echo "Количество слов: ".count($out[0]);
}else{
echo "Слов нет";
}


 
MasterPaleva ©   (2005-12-29 07:09) [68]

Unknowing   (28.12.05 16:21)

Да, твой алгоритм не учитывает же ведь точки, запятые, двоеточия...
Придется еще массив создавать.


 
з. танька   (2005-12-29 07:14) [69]


> MasterPaleva ©   (29.12.05 05:23) [66]

неправильно.. :(


 
Unknowing   (2005-12-29 09:08) [70]

Так, вроде, лучше... Но уже боюсь реакции :)

Procedure Parse(Str: String; var WordCount,MaxWord,MinWord: Integer);
var
 PosAtString     : Integer;
 PosAtWord,
 NumOfLetters,
 LengthOfStr     : Integer;
 Flag            : Boolean;
begin
PosAtString:=1;
WordCount:=0;
MaxWord:=0;
MinWord:=0;
LengthOfStr:=Length(Str)+1;
Flag:=False;
if Str<>"" then
while PosAtString<>LengthOfStr do
 begin
  if (Str[PosAtString]<>" ") and (not Flag) then
    begin
      Inc(WordCount);
      Flag:=True;
      PosAtWord:=PosAtString;
      NumOfLetters:=0;
     while ((PosAtWord<>LengthOfStr) and (Str[PosAtWord]<>" ")) do
       begin
        Inc(NumOfLetters);
        Inc(PosAtWord);
       end;
       if WordCount=1    then MinWord:=NumOfLetters;
       if NumOfLetters>MaxWord  then MaxWord:=NumOfLetters;
       if NumOfLetters<=MinWord then MinWord:=NumOfLetters;
    end
  else  if Str[PosAtString]=" " then  Flag:=False;
  Inc(PosAtString);
end
else Writeln("Нет ни одного слова");
end;


 
Unknowing   (2005-12-29 09:26) [71]

Огромное спасибо всем отозвавшимся!!!
Действительно можно лучше, понятьней и короче! Будем работать над собой :)
С Новым Годом!!!


 
Ega23 ©   (2005-12-29 10:24) [72]

MBo ©   (28.12.05 17:18) [40]
procedure ParseString(const s:string; var Longest, Shortest, NumWords:Integer);
const
Delimiters = [" ",",","."];


Не прокатит, если в предложении прямая речь. Или диалог.

:-)


 
MBo ©   (2005-12-29 10:30) [73]

>Ega23 ©   (29.12.05 10:24) [72]
>Не прокатит, если в предложении прямая речь. Или диалог.
Ну это уже от ТЗ зависит :)  Возможно, лучше, как у Sha, не ограничители, а наоборот, допустимые в "словах" символы проверять


 
Ega23 ©   (2005-12-29 10:32) [74]


> Ну это уже от ТЗ зависит :)


Согласен.
Просто не удержался код мастера покритиковать.  :о)


 
Bless ©   (2005-12-29 12:02) [75]


> MBo ©   (29.12.05 10:30) [73]
>
> >Ega23 ©   (29.12.05 10:24) [72]
> >Не прокатит, если в предложении прямая речь. Или диалог.
>
> Ну это уже от ТЗ зависит :)  Возможно, лучше, как у Sha,
>  не ограничители, а наоборот, допустимые в "словах" символы
> проверять


В варианте Sha не прокатят слова типа "черно-белый"
Нет в мире совершенства.  :o)


 
Bless ©   (2005-12-29 12:03) [76]

Это я тоже не удержался :)


 
Unknowing   (2005-12-29 16:21) [77]

Господа! "ТЗ" было такое: посчитать слова в предложении (словом считать все между пробелами). Мой, боюсь сказать, код, работает полностью при любых введенных словах и в любом кол-ве. Просто я хотел убедиться в том, можно ли вообще так подходить к решению подобных задач. Т.е. я зациклился на термине "эффективность". Что лучше два цикла или как у мастера Sha множества. Потому как полагаю что для их обработки компилятор  используют цикл. Вообщем: то что сделал я это:
-хорошо, но можно сделать иначе
или
-плохо!! Необходимо сделать иначе!
??


 
Ega23 ©   (2005-12-29 17:45) [78]


> -хорошо, но можно сделать иначе
> или
> -плохо!! Необходимо сделать иначе!


Каков критерий "необходимости"?


 
Unknowing   (2005-12-30 08:09) [79]


> Ega23 ©   (29.12.05 17:45) [78]

"Необходимо" - значит можно сделать существенно лучше.


 
Ega23 ©   (2005-12-30 09:11) [80]


> "Необходимо" - значит можно сделать существенно лучше.


Ещё раз: что значит "существенно"?



Страницы: 1 2 3 вся ветка

Текущий архив: 2006.01.29;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.033 c
10-1112627382
SMT
2005-04-04 19:09
2006.01.29
Передача в программу координат выделенной области ячеек на листе


3-1133341391
s77
2005-11-30 12:03
2006.01.29
SQL запрос к Access через ADO дату в строку


15-1136871008
begin...end
2006-01-10 08:30
2006.01.29
С Днём рождения! 10 января


10-1112271485
BPK
2005-03-31 16:18
2006.01.29
Word.Application в окне моего приложения - как?


3-1133261667
dreamse
2005-11-29 13:54
2006.01.29
Как сделать поиск по базе данных без учёта регистра ?