Вопрос № 180301: Дорогие эксперты! У меня есть к вам непростая задачка... Мой преподаватель по Дискретной математике на вот эту процедуру:
Код:
Вопрос № 180301:
Дорогие эксперты!
У меня есть к вам непростая задачка... Мой преподаватель по Дискретной математике на вот эту процедуру:
Код:
const n=10; type t_matr=array[1..n,1..n] of 0..1;
procedure kompozichia(var
a, b, c:t_matr); var x,y,z:integer; begin for x:=1 to n do for y:=1 to n do begin c[x,y]:= 0; for z:=1 to n do c[x,y]:=c[x,y] or a[x,z] and b[z,y]; end; end;
дал задание чтобы я заменил вот этот цикл: for z:=1 to n do c[x,y]:=c[x,y] or a[x,z] and b[z,y];
так, чтобы он работал быстрее... и дал подсказку
чтобы я работал и итерационными циклами а не с фиксированным числом шагов. Я не могу понять как тут модернизировать это все! Помогите прошу идейками...
P/s:замена цикла и то же самое действие не произвело должного впечатления на преподавателя! По моему надо как то вот эту побитовую проверку переделать... Для справки: это процедура одной из операций над отношениями - композиция!
(Композицией (суперпозицией или умножением) А и В (АoВ) называется отношение, состоящее из всех тех и только
тех упорядоченных пар (x,y), для которых найдётся хотя бы один элемент z такой, что (x,z)эA и (z,y)эB, т.е. А?В = {(x,y) | существует z такой, что (x,z)эA и (z,y)эB }.)
Отвечает Тимошенко Дмитрий (Студент) :
Здравствуйте, Юдин Евгений Сергеевич!
Насколько я понимаю вашего преподавателя, он хочет что бы ваш цикл прерывался по нахождении подходящего z, а не как у вас сделано - прогоняется весь диапазон, вне зависимости было ли найдено z ранее или нет. Тогда вместо вашего:
Код:
c[x,y]:= 0; for z:=1 to n do c[x,y]:=c[x,y] or a[x,z] and b[z,y];
Можно сделать например так:
Код:
z
:=1; while ((a[x,z]=0) or (b[z,y]=0)) and (z<n) do inc(z); c[x,y]:=a[x,z] and b[z,y];
или так:
Код:
z:=0; repeat inc(z); until (z=n)or((a[x,z]=1)and(b[z,y]=1)); c[x,y]:=a[x,z] and
b[z,y];
ps:второй вариант создает более быстрый и компактный код. С уважением, Дмитрий
Добавлен второй вариант, по просьбе автора ответа.
-----
∙ Отредактировал: Зенченко Константин Николаевич (Модератор)
∙ Дата редактирования: 14.10.2010, 15:33 (время московское)
Ответ отправил: Тимошенко Дмитрий (Студент)
Ответ отправлен: 14.10.2010, 07:12
Номер ответа: 263493
Оценка ответа: 5 Комментарий к оценке: Спасибо! Оперативно!
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 263493
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.