2012-07-12 2 views
2

중첩 된 for 루프를 실행하여 동일한 값을 갖는 카운터를 피하는 효율적인 방법이 있습니까? 분명히, 나는 아래 if와 같은 if 문을 실행할 수 있지만 더 효율적인 방법이 있는가?변수를 반복하지 않고 루프에 중첩 실행 중입니까?

for i = 1 to 20: 
    for j = 1 to 20: 
     if (i == j): 
      continue 
     else:    
      for k = 1 to 20: 
       if (i == k) or (j == k): 
        continue 
       else: 
        do something useful with these different numbers 

EDIT : 변수 교체 없으므로 [2, 1, 0]으로 다르다 [0, 1, 2]. "유용한 일을하라"는 숫자를 추가, 제곱 및 제곱에 대한 6 가지 수치 검사가됩니다.

감사하고, 아마도 비정상적인 의사 코드 (및 상수 편집)에 대해 사과드립니다.

+0

if ('i! = j'와'(i! -k)'및 (j! = k)'로직을 뒤집어서 else 섹션을 제거 할 수 있습니다. . – fvu

+0

루프의 중첩은 성능에 영향을 미칠 수 있지만 (분기 예측 및 메모리 지역성에 대한 영향으로 인해) "다른 숫자로 유용한 작업 수행"내부에 무엇이 있는지에 따라 달라집니다. – Brian

답변

1

당신이 할 수있는 가장 효율적인 방법입니다. 어떻게 지니고있어?

나는 이것을 할 필요가있는 이유를 생각할 수없는 부분을 무시할 것입니다. 그렇다면 특정 사례가 있으면 공유하십시오. 귀하가 목록에있는 다른 모든 항목과 항목을 비교하려고하지 않는 한 그 자체가 아닌 것 같습니까? 할 수

list = {1,2,3,4,1,2,3,4} \\where list[0] will return 1, and list.size() will return 8 
for(int i = 0; i < list.size()-1; i++){ 
    for(int j = i + 1; j < list.size(); j++){ 
     System.out.println(list[i] + "," + list[j]); 
    } 
} 

당신이 이미 비교 한 것들 사이의 비교를 반복 그나마 그런 식으로

있다.

세를 들어 둥지

list = {1,2,3,4,1,2,3,4} \\where list[0] will return 1, and list.size() will return 8 
for(int i = 0; i < list.size()-2; i++){ 
    for(int j = i + 1; j < list.size()-1; j++){ 
     for(int k = j + 1; j < list.size(); k++){ 
      System.out.println(list[i] + "," + list[j] + "," + list[k]); 
    } 
} 
+0

이것은 수학적으로 문제가되는데, 세 변수 중 어느 것도 동일하게 허용되지 않습니다. 그리고 나는 그것을 무력하게합니다. 그래서 모든 것을 가능한 한 효율적으로 만들려고합니다. – SiliconCelery

+0

은 문제를 공유합니까? 나는 그것을 무력으로 만드는 더 좋은 방법이 있다는 느낌을 가지고있다 ... –

+0

내가 사용할 다른 최적화가있다. 그러나 나는 그것들을 원래 질문에 넣으면 문제가 혼란 스러울 것이라고 생각했다. 문제는 다음과 같습니다 : http://unsolvedproblems.org/index_files/MagicSquare.htm, 나는 어디서나 그런 미해결 문제가 생기지 않을 것이라는 것을 알고 있습니다. 그것은 재미 있습니다. – SiliconCelery

0

당신이 가능 여기에 효율성을 저장하여 루프 논리입니다 수있는 유일한. 올바르게 구현한다고 가정하면 항상 20 * 19 * 18 작업이 수행됩니다.

제한된 세부 정보가있는 솔루션을 찾을 수 없습니다. '유용한 것'은 무엇입니까?

i, j 및 k의 개별 값이 중요하지 않은 경우 3 개의 숫자 조합을 사용하면 효과가 크게 절감됩니다. 현재 설정을 사용하면 (i, j, k) 값 (1, 2, 3) (1,3,2) (2,1,3) (2,3,1) 등을 전달합니다.

그래서 permutations가 아닌 조합을 찾으려면, i를 1보다 크게하고, 내부 루프마다 j보다 큰 k를 1로 설정하여 6의 팩트로 노력을 줄이려면 수정할 수 있습니다.

+0

나는 이것을 포함하도록 질문을 편집했다. 감사. – SiliconCelery

관련 문제