1 / 1 / 0
Регистрация: 22.12.2020
Сообщений: 21
1

Дать оценку эффективности и качества программы и улучшить её эффективности

17.04.2022, 09:38. Показов 451. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Программа должна сортировать четные строки матрицы вещественных чисел
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{—ортировка четных строк массива}
program V10;
{$APPTYPE CONSOLE}
uses
  SysUtils;
const N=5;
var m:array  [1..N,1..N] of integer;
i,j,b,d,x,y:integer;
function fcomp(r:byte;x,y:integer):boolean;
begin
case r of
1: if x>y then fcomp:=true else fcomp:=false;
2: if x<y then fcomp:=true else fcomp:=false;
end;
end;
 
Begin
randomize;
x:=5;
for i:=1 to N do begin
writeln;
for j:=1 to N do begin
 m[i,j]:=random(10);
 write(m[i,j]:x) end;
end;
writeln; writeln;
for i:=1 to N do
for j:=1 to N do
for d:=1 to N-1 do
 if odd(i) then
   if fcomp(1,m[i,d],m[i,d+1])then begin
      b:=m[i,d]; m[i,d]:=m[i,d+1]; m[i,d+1]:=b;
      end;
 
x:=5;
for i:=1 to N do begin
for j:=1 to N do write(m[i,j]:x);
writeln;
end;
 readln;
       end.
Тут наверное функция fcomp лишняя и число циклов надо сократить,но говорят что тут можно много что ещё улучшить..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2022, 09:38
Ответы с готовыми решениями:

Разработайте модель, реализуйте её на языке программирования C++ и выполните оценку ускорения, эффективности
ymax=max 1⩽i⩽ N (ai−bi) помогите кто может

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

Составление программы расчета показателей эффективности ФНЧ (Фильтра низкой частоты)
Помогите составить программу, которая бы высчитывала показатели эффективности ФНЧ и выводила...

Оценка эффективности
Здравствуйте! Скажите пожалуйста оценку эффективности у след.сортировок(для наихудшего и...

Диаграмма эффективности
Помогите пожалуйста написать программу на Delphi) Для определения эффективности работы хлебного...

3
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,076
Записей в блоге: 1
17.04.2022, 11:14 2
Pascal
12
13
  1: fcomp:=x>y;
  2: fcomp:=x<y;
Pascal
27
28
29
30
for i:=1 to N do
 if odd(i) then
  for j:=1 to N do
   for d:=1 to N-1 do
или
Pascal
27
28
29
30
31
i:=1;
while i<=N do begin
  ...
  Inc(n,2);
end;
Pascal
6
7
8
9
10
const W=4;
...
  ... Write(' ',m[i,j]:W);
...
  ... Write(' ',m[i,j]:W);
Пути улучшения эффективности (от меньшего к большему):
1) избавиться от вызова fcomp,
2) использовать более эффективный алгоритм сортировки (для малых N неактуально).

Пути улучшения организации кода -- вынести в отдельные процедуры
1) вывод матрицы:
2) сортировку,
3) генерацию.
Получится (как один из вариантов):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const N=5;
var
  i: Integer;
  a: array [0..N-1,0..N-1] of Integer;
begin
  Randomize;
  for i:=0 to n-1 do vGen(a[i]);
  for i:=0 to n-1 do vWrite(a[i]);
  i:=0;
  while i<n do begin
    vSort(a[i]); Inc(n,2);
  end;
  for i:=0 to n-1 do vWrite(a[i]);
end.
Добавлено через 8 минут
Если нужно сохранить возможность передачи функции сравнения:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
type
  TLessF = function (a, b: Integer): Boolean;
 
procedure vSort(var v: array of Integer; IsLess: TLessF);
  ...
  if IsLess(v[i+1],v[i]) then ...
 
function Less(a, b: Integer): Boolean; begin Less:=a<b; end;
function More(a, b: Integer): Boolean; begin More:=a>b; end;
 
  ...
  if Odd(i) then vSort(a[i],@Less) else vSort(a[i],@More);
Добавлено через 21 минуту
Хозяйке на заметку:
Если сортировка и компаратор будут шаблонами (генерики), то потери эффективности от передачи компаратора удастся избежать.
0
1 / 1 / 0
Регистрация: 22.12.2020
Сообщений: 21
17.04.2022, 12:21  [ТС] 3
Извините,но я вас случайно немного велл в небольшое заблуждение )
Я тут всё таки нашёл методичку(закреп) и оказалось что тут есть свои критерии эффективности и качества
Согласно ним,я немного переделал программу =>

Эффективность:
1.Время ответа или выполнения : тут я поменял метод сортировки обменом на метод сортировки вставкой
2.Объем оперативной памяти : тут нечего больше в голову не приходит кроме как поменять массив на динамический
....

качества:
1.универсальность:Невозможность задать размерность матрицы ! это я исправлю
2.проверяемость : вроде как всё нормально с проверяемостью)
3.Точность результатов : Программа не имеет ограничения в точности
...
ну там есть и другие критерии ,но для данного случая они не подходят.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{—ортировка четных строк массива}
program V10;
{$APPTYPE CONSOLE}
uses
  SysUtils;
const N=5;
var m:array  [1..N,1..N] of integer;
i,j,b,d:integer;
 
Begin
randomize;
for i:=1 to N do begin
writeln;
for j:=1 to N do begin
 m[i,j]:=random(10);
 write(m[i,j]:N) 
 end;
end;
writeln;
for d:=1 to N do
if odd(d) then
for i := 2 to N do 
    begin
      b := m[d,i];
      j := i - 1; 
      while (j >= 1) and (m[d,j] >b) do 
        begin
          m[d,j + 1] := m[d,j]; 
          j := j - 1
        end;
        m[d,j + 1] := b {вставляем}
    end;
writeln;
for i:=1 to N do begin
for j:=1 to N do write(m[i,j]:N);
writeln;
end;
 readln;
end.
Вложения
Тип файла: doc L4_TRPS_2019.doc (178.5 Кб, 9 просмотров)
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,076
Записей в блоге: 1
17.04.2022, 14:15 4
Про правильность:
1) в задании матрица вещественных, а у вас целые ;-)
2) в задании не сказано про квадратную матрицу, а у вас NxN.

Про эффективность:
- сложность "пузырька" квадратичная, вставок -- квадратичная. Шило на мыло.

Про защиту от ошибок и сопровождаемость:
1) Write(m[i,j]:N) -- плохо в части N, возможен как большой массив маленьких чисел, так и маленький больших ;-) не нужно нагружать константу N лишним смыслом. N=5 и W=5 это разные по смыслу величины, а то, что значения совпали -- не повод их объединять.
2) Выше предлагал вывод в виде Write(' ',m[i,j]:W). Зачем отдельный пробел? Не даст "сомкнуться" значениям при любом содержимом, пусть и ценой внешнего вида (речь про случай, когда диапазон поправили, а поля забыли ).
3) индексы от 1 -- тут стоит вспомнить, что в динамических массивах индексы от 0 и повлиять на это нельзя, стоит писать код, который подходит и там и там

Добавлено через 21 минуту
Код из #3:

1) монолитный:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const M=5; N=5; W=4; D=1;
 
var
  i, j, k: Integer;
  t: Real;
  a: array [0..m-1,0..n-1] of Real;
begin
  Randomize;
  for i:=0 to m-1 do for j:=0 to n-1 do a[i,j]:=Random*10;
 
  WriteLn('A =');
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Write(' ',a[i,j]:W:D); WriteLn;
  end;
 
  i:=0;
  while i<m do begin
    for j:=1 to n-1 do begin
      t:=a[i,j]; k:=j-1;
      while (k>=0) and (a[i,k]>t) do begin
        a[i,k+1]:=a[i,k]; Dec(k);
      end;
      a[i,k+1]:=t;
    end;
    Inc(i,2);
  end;
 
  WriteLn('A''=');
  for i:=0 to m-1 do begin
    for j:=0 to n-1 do Write(' ',a[i,j]:W:D); WriteLn;
  end;
end.
2) немного процедур:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
procedure vWrite(const v: array of Real);
const W=4; D=1;
var i: Integer;
begin
  for i:=Low(v) to High(v) do Write(' ',v[i]); WriteLn;
end;
 
procedure vGen(var v: array of Real);
var i: Integer;
begin
  for i:=Low(v) to High(v) do v[i]:=10*Random;
end;
 
procedure vSort(var v: array of Real);
var i, j: Integer;
begin
  for i:=Low(v)+1 to High(v) do begin
    t:=v[i]; j:=i-1;
    while (j>=Low(v)) and (v[j]>t) do begin
      v[j+1]:=v[j]; Dec(j);
    end;
    v[j+1]:=t;
  end;
end;
 
var
  i: Integer;
  a: array [0..4,0..4] of Real;
begin
  Randomize;
  for i:=Low(a) to High(a) do vGen(a[i]);
  WriteLn('A ='); for i:=Low(a) to High(a) do vWrite(a[i]);
  i:=Low(a);
  while i<=High(a) do begin
    vSort(a[i]); Inc(i,2);
  end;
  WriteLn('A''='); for i:=Low(a) to High(a) do vWrite(a[i]);
end.
Добавлено через 24 минуты
Обращаю внимание:
при переходе от монолитного варианта избавились от двумерной адресации внутри цикла: было a[i,k], стало v[i].
(Этот критерий у вас в методичке есть)

Добавлено через 15 минут
Что касается эффективности и использования Low(v) внутри процедур:
несмотря на то, что это выражение выглядит как вызов функции, обычно это compiler magic -- вместо нее в сгенерированном коде окажется константа (для параметров-открытых массивов и динамических массивов -- 0).
Если для используемого компилятора это почему-то не так, достаточно заменить внутри процедур Low(v) на 0.

Добавлено через 10 минут
Сортировка Шелла -- усовершенствованная сортировка вставками (от O(n log2n) до O(n2)):
https://www.cyberforum.ru/post13831331.html

Пирамидальная сортировка имеет сложность O(n log n) вместо O(n2):
https://www.cyberforum.ru/post15477354.html
0
17.04.2022, 14:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2022, 14:15
Помогаю со студенческими работами здесь

Об эффективности и целесообразности
Хотелось бы избежать при работе ошибок. Никогда раньше не делал больших правок по сайту и нужды...

определения эффективности
Доброе время суток, Подскажите как определить какая программа работает быстрее или какая...

Оценка эффективности рекламы
Оценка эффективности рекламы

Ключевые показатели эффективности
Здравствуйте. Подскажите, пожалуйста, нужно описать ключевые показатели эффективности прибора....

Оценка эффективности мод
Купил морды - все проиндексировались и показываются у меня в бэках. Если сортировать беки в яндексе...

Анализ эффективности алгоритма
Выбрать подходящее обозначение О, Ѳ,Ω, которое наиболее точно указывало бы на принадлежность к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru