Автор Тема: Поиск в матрице n*n  (Прочитано 10974 раз)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Поиск в матрице n*n
« Ответ #15 : Ноябрь 23, 2013, 04:31:00 pm »
int i, j, k;

for(i=0; i<100; i++) {
   for(j=0; j<10; j + +) {
      for(k=0; k<20; k++) {
         // . ..
         if(something()) {
            goto done;
         }
      }
   }
}

done: // ...
Как видите, используя оператор goto, можно обойтись без дополнительных затрат ресурсов, которые связаны с повторением проверки значения переменной stop в предыдущем варианте.

В Аде для этого используется выход из именованного цикла:
outer_loop:
for i in (0..99) loop
   for j in (0..9) loop
      for k in (0..19) loop
         -- ...
         exit outer_loop when something();
      end loop;
   end loop;
end loop outer_loop;
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Поиск в матрице n*n
« Ответ #16 : Ноябрь 23, 2013, 05:51:23 pm »
Попытался найти вариант где без break никак нельзя.
Нашел это(Java):
Цитировать
int a=...;
int b=...;
int c=...;
m1:
for(int i=0; i<100; i++) {
   int d = 0;
   for(int j=0; j<100; j++) {
      if ((a+i) % (b+j) = c) {
         a = 3*a;
         b = 4*i;
         c = 2+j;
      }
      if (b*c % a == 0) {
          break m1;
      }
      b++;
      d = (a + b)  % c;
      if (a*b % с == 0) {
         
          break;
      }
   }
   if (d = 0) sout("yyy");
}


Как насчёт поупражняться в рефакторинге такого кода?
Про break и continue в циклах

OK. Попробуем завернуть в линейный поиск.
Вникать в алгоритм не стал. Но на первый взгляд преобразуется так(Lua):
function calc(i, j, a, b, c)
   if (a + i) % (b + j) == c then
      a = 3 * a
      b = 4 * i
      c = 2 + j
   end
   return a, b, c
end

local i, j = 0, 0
a, b, c = calc(i, j, a, b, c)

while (i < 100) and (b * c % a ~= 0) do
     
   b = b + 1
   d = (a + b) % c
   
   j = j + 1
   if (j == 100) or (a * b % c == 0) then
      j = 0
      i = i + 1
      if d == 0 then
         print 'yyy'
      end
      d = 0
   end

   a, b, c = calc(i, j, a, b, c)

end

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Поиск в матрице n*n
« Ответ #17 : Ноябрь 28, 2013, 08:25:21 am »
А я для себя вопрос выхода "из середины" закрыл. Если процедура должна быть максимально оптимизирована по быстродействию, и выход "из середины" действиельно даёт выигрыш в производительности, то я его использую без угрызений совести.


ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Поиск в матрице n*n
« Ответ #18 : Ноябрь 28, 2013, 09:31:54 am »
Если процедура должна быть максимально оптимизирована по быстродействию, и выход "из середины" действиельно даёт выигрыш в производительности
Вот как раз по этой причине я сомневаюсь в целесообразности запрета break  :)

Не могу склониться полностью на сторону злаbreak только потому, что профит тут получается не алгоритмический, а машиннозависимый. В идеале этим должен оптимизатор заниматься, имхо.

ps Ручная оптимизация - это наверно единственная печенька стороны злаbreak

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Поиск в матрице n*n
« Ответ #19 : Ноябрь 28, 2013, 09:51:56 am »
ps Ручная оптимизация - это наверно единственная печенька стороны злаbreak
Оберонщики всегда делали упор на ручные оптимизации, утверждая, что компилятор должен быть тупым как пробка.
Поэтому мне непонятен этот их дисонанс с брейком. Как говорится, "или крестик сними, или трусы надень"...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Поиск в матрице n*n
« Ответ #20 : Ноябрь 28, 2013, 10:05:03 am »
Ну можно оптимизировать в рамках структурного программирования, а можно грязно (break).
Думаю, что они как раз грязные оптимизации не признают.  :)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Поиск в матрице n*n
« Ответ #21 : Ноябрь 28, 2013, 10:11:46 am »
Ну можно оптимизировать в рамках структурного программирования, а можно грязно (break).
Думаю, что они как раз грязные оптимизации не признают.  :)

Ну и как структурно соптимизировать выход из тройного цикла? Особенно когда каждый такт на счету?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Поиск в матрице n*n
« Ответ #22 : Ноябрь 28, 2013, 10:12:16 am »
Никак

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Поиск в матрице n*n
« Ответ #23 : Ноябрь 28, 2013, 10:18:10 am »
Хотя нужно потестить и посмотреть на сколько структурный вариант проиграет, и проиграет ли вообще.