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

Вниз

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

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


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


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


 
Sandman29 ©   (2005-12-30 09:23) [81]

Unknowing   (29.12.05 16:21) [77]
Что лучше два цикла или как у мастера Sha множества. Потому как полагаю что для их обработки компилятор  используют цикл.

Множества лучше. Для проверки на вхождение во множества используется не цикл, а одна машинная команда AND. Мастера, поправьте, если ошибаюсь.


 
Unknowing   (2005-12-30 09:23) [82]


> Ega23 ©   (30.12.05 09:11) [80]

Ну, как с сортировкой!! Можно пузырьковым методом: задача выполняется, но не эффективно, а можно быстрой сортировкой: задача выполняется, но уже существенно лучше.


 
Bless ©   (2005-12-30 09:27) [83]


> Unknowing   (30.12.05 09:23) [82]
>
>
> > Ega23 ©   (30.12.05 09:11) [80]
>
> Ну, как с сортировкой!! Можно пузырьковым методом: задача
> выполняется, но не эффективно, а можно быстрой сортировкой:
>  задача выполняется, но уже существенно лучше.


:) Не факт. Боюсь ошибиться, но, имхо, на маленьких массивах быстрая сортировка может быть даже медленнее пузырьковой.


 
Unknowing   (2005-12-30 09:44) [84]


> Bless ©   (30.12.05 09:27) [83]

Джулиан Бакнелл (автор книги "Фундаментальные алгоритмы в Delphi")утверждает, что про пузырьковый метод можно смело забыть.


 
Ega23 ©   (2005-12-30 09:49) [85]


> Джулиан Бакнелл (автор книги "Фундаментальные алгоритмы
> в Delphi")утверждает, что про пузырьковый метод можно смело
> забыть.


Я не знаю, кто такой Джулиан Бакнелл, но на множестве из пяти элементов пузырёк рулит.

Кстати, алгоритм QuickSort - это не бинарное ли дерево?


 
Unknowing   (2005-12-30 09:59) [86]


> Ega23 ©   (30.12.05 09:49) [85]


 
Unknowing   (2005-12-30 10:01) [87]


> Ega23 ©   (30.12.05 09:49) [85]


> Кстати, алгоритм QuickSort - это не бинарное ли дерево?

Это, скорее, я у Вас должен спрашивать! :)


 
ferr ©   (2005-12-30 10:53) [88]

нет, сортировка с помощью бинарного дерева наз-ся "хипом", сортирующим деревом, пирамидальной


 
ferr ©   (2005-12-30 10:58) [89]

Когда-то реализовывал всё это, вот такие результаты на 16 элементах:
Bubble 0.0025
Shaker 0.0025
Selection 0.0024
Insertion 0.0012
InsertionO 0.0013
QuickSort 0.0027
QuickSortO 0.0016
HeapSort 0.0027


 
ferr ©   (2005-12-30 10:58) [90]

MergeSort 0.0015


 
MasterPaleva ©   (2005-12-31 07:39) [91]

Алгоритм распознает все русские слова в тексте, включая слова, которые пишутся через тире ("где-то", например), находит самое длинное и короткое слово в предложении.

Текст для проверки: Где-то на изходной планете времена изменились,  это   ли то  самое     удивительное - то, что называется градусником.

Результат:
Самое длинное слово: 12 сим.
Самое короткое слово: 2 сим.
Всего слов: 15


function slov(st:string):string;

var
mas: array of string;
i, j: integer;
n, n2: integer;  

begin
st:=st+" ";

j:=0;
n:=0;
n2:=length(st);

setlength(mas,1);
for i:=1 to length(st) do begin
// распознает только русские слова
if (ord(st[i])>185+3+3) and (ord(st[i])<253+2+1) then begin
   //showmessage(st[i]+" / "+IntToStr(length(mas)));
   mas[j]:=mas[j]+st[i];
end else begin
  if st[i]="-" then begin
      if (st[i-1]<>" ") and (st[i+1]<>" ") then mas[j]:=mas[j]+st[i];
  end else begin
   if mas[j]<>"" then begin
    if length(mas[j])>n then  n:=length(mas[j]);
    if length(mas[j])<n2 then  n2:=length(mas[j]);
    inc(j);
    setlength(mas, length(mas)+1);
   end;
  end;

end;
end;

result:="Самое длинное слово: "+inttostr(n)+" сим. "#13#10+"Самое короткое слово: "+inttostr(n2)+" сим."#13#10+"Всего слов: "+inttostr(length(mas)-1);

end;


 
Джо ©   (2005-12-31 07:55) [92]


> [91] MasterPaleva ©   (31.12.05 07:39)

Бонч-Бруевич.


 
Sha ©   (2005-12-31 11:15) [93]

> MasterPaleva ©   (31.12.05 07:39) [91]

Давай разбираться.

1. Оператор st:=st+" "; излишен, т.к. непустая ANSI-строка
  оканчивается символом #0, который, по идее, является разделителем.

2. Для того, чтобы подсчитать слова, необязательно выделять их из
  предложения, заносить в список, а затем определять количество
  элементов в списке - достаточно одной целочисленной переменной.

3. Также крайне неэффективны операторы типа mas[j]:=mas[j]+st[i];
  Ведь тебе впоследствии будут нужны не сами данные, а только длина
  текущего слова. Вот и подсчитывай ее в отдельной переменной. Намного
  быстрее и понятнее.

4. Буквы "Ё" и "ё", по-твоему, - иностранные?

5. Если строка начинается с "-", то возвращаемый функцией результат
  зависит от старшего байта длины строки, т.к. делается попытка сравнения
  (st[i-1]<>" ")

Успехов в новом году :)


 
MasterPaleva ©   (2005-12-31 12:47) [94]

Sha ©   (31.12.05 11:15) [93]


> 3. Также крайне неэффективны операторы типа mas[j]:=mas[j]+st[i];
>
>   Ведь тебе впоследствии будут нужны не сами данные, а только
> длина
>   текущего слова. Вот и подсчитывай ее в отдельной переменной.
>  Намного
>   быстрее и понятнее.


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


> 4. Буквы "Ё" и "ё", по-твоему, - иностранные?

Мда, портят всю картину.

function slov(st:string):string;

var
mas: array of string;
i, j: integer;
n, n2: integer;  

begin
st:=st+" ";

j:=0;
n:=0;
n2:=length(st);

setlength(mas,1);
for i:=1 to length(st) do begin
if (ord(st[i])>186) and (st[i]<>"Ё") and (st[i]<>"ё") then begin
  mas[j]:=mas[j]+st[i];
end else begin
 if st[i]="-" then begin
     if (st[i+1]<>" ") then mas[j]:=mas[j]+st[i];
 end else begin
  if mas[j]<>"" then begin
   if length(mas[j])>n then  n:=length(mas[j]);
   if length(mas[j])<n2 then  n2:=length(mas[j]);
   inc(j);
   setlength(mas, length(mas)+1);
  end;
 end;

end;
end;

result:="Самое длинное слово: "+inttostr(n)+" сим. "#13#10+"Самое короткое слово: "+inttostr(n2)+" сим."#13#10+"Всего слов: "+inttostr(length(mas)-1);

end;


 
begin...end ©   (2005-12-31 13:11) [95]

> Sandman29 ©   (30.12.05 09:23) [81]

> Для проверки на вхождение во множества используется не цикл,
> а одна машинная команда AND.

Цикл не используется. Но и одной командой AND дело не обходится. Обычно используется либо команда BT, либо арифметические операции с последующим анализом флагов. Зависит это от многих факторов: является ли множество переменной или константой, какова его максимальная мощность, и т.д.


 
Sha ©   (2005-12-31 16:34) [96]

> begin...end ©   (31.12.05 13:11) [95]
> Sandman29 ©   (30.12.05 09:23) [81]
> Sha ©   (28.12.05 19:54) [50]

Чтобы ускорить работу и оставить только BT, имеет смысл использовать
"полноразмерное" множество (set of char).

Для ускорения пролога и эпилога также хорошо бы объявить входной
параметр как const.

Т.о. процедура должна начинаться так:

procedure TelegramStatistics(const s: string; var wordcount, minlen, maxlen: integer);
const
 characters: set of char= ["0".."9","A".."Z","a".."z","А".."Я","Ё","ё","а".."я"];


 
Unknowing   (2006-01-10 08:26) [97]

Рад снова всех приветствовать!!
Никак мне не дает покоя мой вопрос...:)

> Sha ©   (31.12.05 16:34) [96]

Каково Ваше мнение на предмет:

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


 
Igorek ©   (2006-01-10 08:52) [98]


> Unknowing   (30.12.05 09:44) [84]
> > Bless ©   (30.12.05 09:27) [83]
> Джулиан Бакнелл (автор книги "Фундаментальные алгоритмы
> в Delphi")утверждает, что про пузырьковый метод можно смело
> забыть.

Интересно, а как автор предлагает сортировать большие сильно упорядоченные массивы?


 
Igorek ©   (2006-01-10 08:55) [99]


> Unknowing   (10.01.06 08:26) [97]

-плохо!! Необходимо сделать иначе!

Тут небыло хорошего варианта. Хорошего - в смысле как "в книге написано".


 
Unknowing   (2006-01-10 09:01) [100]


> Igorek ©   (10.01.06 08:55) [99]

Не понял! Есть свой вариант?? Поясните!


 
Думкин ©   (2006-01-10 09:05) [101]

ато я теперь знаюкак правильно составлять телеграммы. Не ставить пробеллы. И платишь за одно слово. Гениально.


 
Unknowing   (2006-01-10 09:08) [102]


> Думкин ©   (10.01.06 09:05) [101]

Это не реальная задача!!!! Это, блин, для начинающих программировать!
> Igorek ©   (10.01.06 08:55) [99]

Не понял! Есть свой вариант?? Поясните!


 
Думкин ©   (2006-01-10 09:12) [103]

Unknowing   (28.12.05 16:35) [6]

> Ega23 ©   (28.12.05 16:31) [3]

Слова здесь все что между пробелами!! Задача посчитать стоимость телеграммы, которая считается из перечисленных параметров.


Я вас за язык не тянул, и за другие части тела тоже.


 
Igorek ©   (2006-01-10 09:13) [104]


> Unknowing   (10.01.06 09:08) [102]

Своего нету. Пока. :)
Хорошим вариантом я считаю полностью по-человечески расписанный конечный автомат. Он и по читабельности и по скорости будет близок к идеалу.


 
Unknowing   (2006-01-10 09:20) [105]


> Igorek ©   (10.01.06 09:13) [104]

См. MBo ©   (28.12.05 17:31) [43]


 
Igorek ©   (2006-01-10 10:00) [106]


> Unknowing   (10.01.06 09:20) [105]

Неужели ты думаешь я не видел [43] когда писал [104]?
И я имел ввиду конечный автомат в одной процедуре.



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

Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.65 MB
Время: 0.044 c
2-1137198269
psyBNC
2006-01-14 03:24
2006.01.29
Помогите с базой данны)(


4-1132037793
rusgl
2005-11-15 09:56
2006.01.29
Можно ли как-нить установить HOOK на реестр?


6-1129746223
Black-Grin
2005-10-19 22:23
2006.01.29
NMFTP.LIST - виснет


2-1136967660
Slaga
2006-01-11 11:21
2006.01.29
Ошибки при запуске сервиса


3-1133232842
DimonS
2005-11-29 05:54
2006.01.29
Фильтрация в RxMemoryData





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский