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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2021, 22:50   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 620
По умолчанию Еще один вопрос по оптимальности алгоритма

Код:
var
  s:string
  ss: array [a..b] of string
Итак. Есть строка s
Есть массив ss, который надо наполнить "лесенкой" от строки s

То есть ss[3] - последние 4 элемента строки s
То есть ss[4] - последние 5 элементов строки s
То есть ss[5] - последние 6 элементов строки s
И т.д.
При этом, все строки "Поднимая" (делая все буквы большими)

Вопрос: какой алгоритм лучше?

В обоих алгоритмах использую эту функцию:
Код:
function rasr(const s:string; const a:byte): string;
begin
 If (a<length(s)) and (a>=0) then begin
  result:=AnsiUpperCase(Copy(s, length(s)-a, length(s)));
 end else result:='';
end;
Вариант 1:
Код:
For i:=a to b do ss[i]:=rasr(s, i);
Вариант 2:
Код:
ss[a]:=rasr(s, a);

   For i:=a+1 to b do begin
    If length(s)>i then begin
     ss[i]:=UpCase(s[length(s)-i])+ss[i-1];
    end else ss[i]:='';
   end;
В первом случае каждый раз копировать и поднимать всю строку
Во втором, создать первый элемент массива. А потом следующий := новый символ + прошлая строка
Kronos913 вне форума Ответить с цитированием
Старый 07.06.2021, 23:02   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,542
По умолчанию

AnsiUpperCase лучше вынести за цикл и применить один раз.
Arigato вне форума Ответить с цитированием
Старый 07.06.2021, 23:29   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 620
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
AnsiUpperCase лучше вынести за цикл и применить один раз.
Так его ж надо применить к каждой строке массива
Kronos913 вне форума Ответить с цитированием
Старый 07.06.2021, 23:52   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,542
По умолчанию

А каждая строка получается из исходной. То есть можно один раз применить к исходной.
Arigato вне форума Ответить с цитированием
Старый 08.06.2021, 13:50   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 620
По умолчанию

Код:
procedure ForFilter18(const ss:string; var sq:Array of string18; const i1, i2: byte);
 var
  i, j:byte;
begin
   j:=length(ss);
   If i1<j then begin
    sq[i1]:=AnsiUpperCase(Copy(ss, j-i1, i1+1));
    If i2<j then begin
     For i:=i1+1 to i2 do sq[i]:=UpCase(ss[j-i])+sq[i-1];
    end else begin
     For i:=i1+1 to j-1 do sq[i]:=UpCase(ss[j-i])+sq[i-1];
     For i:=j to i2 do sq[i]:='';
    end;
   end else for i:=i1 to i2 do sq[i]:='';
end;
А может даже лучше такой код? Так чтобы внутри цикла не было IF'ов
Kronos913 вне форума Ответить с цитированием
Старый 08.06.2021, 13:51   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 620
По умолчанию

Кстати, еще вопрос в том, что лучше: каждый раз дергать length, или же один раз ее присвоить, а дальше уже через готовую переменную?
Kronos913 вне форума Ответить с цитированием
Старый 08.06.2021, 13:58   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,545
По умолчанию

Это даже не вопрос - конечно, второй вариант.
digitalis вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
еще один вопрос из теста polin11 Общие вопросы C/C++ 2 19.03.2018 11:41
Еще один вопрос по Делфи Djleito Помощь студентам 6 22.06.2012 23:05
Еще один вопрос по DelphiX... Andrew101095 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 25.07.2010 20:55
еще один вопрос. Belomor Общие вопросы C/C++ 9 16.11.2009 01:29
Еще один вопрос, связанный с БД Sweta Общие вопросы C/C++ 3 09.11.2009 17:10