2016-11-30 4 views
1

Мне сложно сформулировать этот вопрос. Поэтому я просто использую пример для иллюстрации.В вложенных for-loops используйте j = i + 1 vs j = 1?

Скажем, у меня есть следующий массив: A = {5,8,1,3,2,6}, размер n = 6 и индексированный в A [0 ... 5].

И я хочу запустить сканирование какого-либо типа для сравнения каждого значения со смежным рядом с ним в обход слева направо. В чем разница между следующими 2 фрагментами кода для запуска вложенного цикла?

// snippet 1, using i to take the first and j to take whatever is next to i. 
for i <- 0 to n-2 do 
    for j <- i+1 to n-1 do 
     // do the scanning, comparing, etc.... 


//snippet 2 using i to take the first and j to take the second. 
for i <- 0 to n-2 do 
     for j <- 1 to n-1 do 
      // do the scanning, comparing, etc.... 

Я думаю, что они точно такие же и не могут найти различий в тестах на перо/бумагу, которые я сделал. Есть ли это?

+2

'(я + 1) .. (п-1)' должен производить различные значения, чем '1 .. (п-1) '. –

+0

@ cricket_007 пожалуйста уточните. Как? – Callat

+1

Не существует экземпляра, когда 'i == j' в первом цикле –

ответ

2

Хорошо, давайте идти через пробеге где n = 3

// snippet 1, using i to take the first and j to take whatever is next to i. 
for i <- 0 to n-2 do 
    for j <- i+1 to n-1 do 
     // do the scanning, comparing, etc.... 

Первая итерация (из внешней петли):

i = 0 и j = 1

i = 0 и j = 2

Второй Итерация:

i = 1 и j = 2

Done!

//snippet 2 using i to take the first and j to take the second. 
for i <- 0 to n-2 do 
     for j <- 1 to n-1 do 
      // do the scanning, comparing, etc.... 

Первая итерация:

i = 0 и j = 1

i = 0 и j = 2

Второй Итерация:

i = 1 и j = 1

i = 1 и j = 2

Обратите внимание на разницу во второй итерации фрагмента 2?

+0

WOW! Я не могу поверить, что пропустил это. С помощью 'j <- 1'. j начинается с 1 каждый раз, когда цикл i перезапускает добавление дополнительных вычислений, сравнений и т. д. Но с 'j <- i + 1'. Я могу гарантировать, что j не запускается до того, как я иду слева направо! Огромное спасибо !!!! – Callat

+1

@KazRodgers Правильно, рад, что это помогло. – mascoj

+0

потрясающе. Я смотрел на два связанных алгоритма, и значение j - единственное, что отделяет их. Я смотрел на это полтора дня и не мог понять разницу. – Callat

3

В первом, j начинает отсчитываться от следующего значения i.

Пример: i = 1, j = 2 | i = 2, j = 3 и т. Д.

Во втором случае вы рассчитываете от 1 независимо от значения i. Другими словами, переменная i не влияет на переменную j.

Оба могут иметь свои применения, но все зависит от того, как вы используете их для принятия элементов массива.

+0

Таким образом, они одинаковы для первых построений зависимости от j до i, а вторая позволяет j функционировать на своем собственном? – Callat

+0

Да в значительной степени это. – SenselessCoder

1

Обе сборки пар элементов массива.Существуют две разные идеи определения того, что представляют собой разные пары:

1) Пара уникальна, только если она включает в себя другой элемент. (A[i], A[j]) == (A[j], A[i])

2) Пара уникальна, если порядок элементов различен. (A[i], A[j]) <> (A[j], A[i])

Кроме того, фрагмент также рассматривает два (A[i], A[i]) как пара (при i == j), за исключением (A[0], A[0]) и (A[n - 1], A[n - 1])