Вложенный цикл, когда индекс внутреннего цикла неравен индекс внешнего цикла - PullRequest
0 голосов
/ 26 декабря 2018

Логика вложенного цикла для пропуска внутреннего цикла, когда его индекс равен индексу внешнего цикла.

Использовал оператор if во внутреннем цикле с эффектом:

for (i=0;i<N;i++)
  for (j=0;j<N;j++)
    if (j!=i)
      ... some code

Я считаю,это дает мне ожидаемые результаты, но есть ли менее ресурсоемкий метод, о котором я могу не знать?

1 Ответ

0 голосов
/ 26 декабря 2018

Вы можете разделить внутренний цикл на 2 отдельных цикла for, чтобы уменьшить количество тестов:

for (i = 0; i < N; i++) {
    for (j = 0; j < i; j++) {
        ... some code
    }
    /* here we have j == i, skip this one */
    j++;
    for (; j < N; j++) {
        ... same code
    }
}

В результате получается больше кода, но вдвое меньше тестов на j.Однако обратите внимание, что если N является константой, компилятор может более эффективно развернуть исходный внутренний цикл.Тщательный бенчмаркинг - единственный способ определить, стоит ли это решение усилий для вашей проблемы, компилятора и архитектуры.

Для полноты код можно упростить следующим образом:

for (i = 0; i < N; i++) {
    for (j = 0; j < i; j++) {
        ... some code
    }
    /* here we have j == i, skip this one */
    while (++j < N) {
        ... same code
    }
}
...