Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.62 MB
Время: 0.036 c
2-1137167570
Tristania
2006-01-13 18:52
2006.01.29
Динамическая таблица строк


3-1132920032
VadimSpb
2005-11-25 15:00
2006.01.29
Копирование таблицы


2-1136819927
tv
2006-01-09 18:18
2006.01.29
mssqlserver &amp; sql-запросы


3-1133514080
Ascan
2005-12-02 12:01
2006.01.29
Autoincrement-номер присоздании записи посредствам SQL


15-1136762101
iZEN
2006-01-09 02:15
2006.01.29
Mind map, или Научите себя думать.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский