2013-02-08 2 views
0

이것은 일반적인 프로그래밍 질문입니다.일반 프로그래밍, 2D 배열, 이중 for 루프에 문제가 있습니까?

2 중 루프를 통해 2 차원 배열을 반복하는 "끔찍한" "못생긴"등의 게시물을 많이 보았습니다 ... 이유가 무엇입니까?

배열은 사전과 비교할 때 효율적인 데이터 구조가 아니며 foreach 또는 다른 대안보다 효율적인 이중 루프도 아닙니다. 또한 2 차원 배열을 사용하는 경우 2 차원 좌표계를 자주 사용합니다. x 및 y 위치는 이미 배열의 인덱스로 데이터 구조에 "내장"되어 있으므로 (예 : 터플을 사전 키로 추가 할 필요가 없음) for 루프 매개 변수를 변경하면 매우 저렴하게 반복 할 수 있습니다 그리드의 다른 부분을 통해 반복적으로 반복하고 싶지 않은 부분은 완전히 무시합니다. 예제는 "외부"행과 열을 방지하기 위해 당신은 당신이 컬렉션의 모든을 반복 한 후이 좌표 범위에 있는지 여부를 확인하기 위해 뭔가를 줄 foreach는 함께 ..

for (int x = 1; x < Grid.GetLength(0)-1; x++) 
{ 
     for (int y = 1; y < Grid.GetLength(1)-1; y++) 
     { 
      Grid[x,y].DoSomething(); 
     } 
} 

을 할 수 네가 원해.

+2

모든 요소에 대해 뭔가를 수행하고 있다면 그렇습니다. 특정 요소를 찾으려는 경우 전혀 효율적이지 않습니다. –

+1

이 말을하는 "많은 게시물"중 어떤 예가 있습니까? – Gerrat

+0

아니요, 죄송 합니다만 링크를 유지하지 못했지만 저에게는 반복되는 테마였습니다. 필자는 꽤 많은 게시물을 보았습니다. 또한 제 강사 중 한 명은 coderetreat에서 다차원 배열과 다중 루프를 "더티"로 간주하고 사전, 목록 및 기타 등등의 상위 레벨 구조를 항상 사용하는 것으로 보였습니다. –

답변

1

2D 배열을 반복하는 데 2 ​​루프가 잘못되지 않습니다. 실제로 수행해야하는 경우입니다. 주목해야 할 것은 성능입니다. 일반적으로 반복은 메모리의 배열 레이아웃을 따라야합니다. 예를 들어 2D 배열이 행 n이 행 n-1 (일반 용도 언어의 일반적인 구현 인 경우)에 저장된 1D 메모리 버퍼로 저장되는 경우 외부 루프는 행과 내부 행을 통과해야합니다. 이렇게하면 캐시 누락이 최소화됩니다.

일반적으로 다른 방법에 비해 배열 액세스의 효율성은 특정 언어 구현에 따라 다릅니다. 일반적으로 배열은 가장 원시적 인 데이터 구조가되어 액세스가 가장 빠릅니다. BTW, 사전은 배열 개념의 일반화입니다.

+0

일부 언어 별 예제를 포함하여 다차원 배열을 배치하는 방법에 대한 좋은 설명은 [행 우선 순서] (http://en.wikipedia.org/wiki/Row-major_order)를 참조하십시오. –

+0

그 마지막 줄까지 좋은 대답을 +1하십시오. 사전이 일반화 된 배열이라는 아이디어에 -1. 사전은 어레이와 크게 다른 개념 인 검색 테이블입니다. –

+0

@RossPatterson Dictionary는 연관 배열 개념과 동의어입니다 : http://en.wikipedia.org/wiki/Associative_array. 표준 배열에서 키는 인덱스이고 데이터는 인덱스 (키)에 의해 지정됩니다. – SomeWittyUsername