2010-02-08 3 views
5

이것은 답을 표현하는 데 문제가있는 할당 질문입니다.트리 : 연결된 목록 대 배열 (효율성)

"노드 당 최대 k 개의 자식을 가질 수 있다고 가정 할 때 노드 당 평균 자식 수를 v라고 가정 할 때 v를 저장하는 데 사용 된 v의 값은 무엇입니까? 링크 된 목록의 자식 노드 대 배열의 저장소? 왜? "

나는 "왜?"라고 대답 할 수 있다고 생각합니다. 보통 영어로 더 많거나 적음 - 링크 된 목록을 사용하는 것이 더 효율적입니다. 빈 노드 (즉, 평균이 최대보다 작은 경우 배열의 빈 인덱스)를 사용하는 것보다 공간을 할당하는 것보다 메모리를 많이 사용하기 때문입니다 실제로 값을 채울 때 링크 된 목록의 노드에 대해.

최대 200 개일 때 평균 6 명의 자녀가있는 경우 트리는 트리를 만들 때 각 노드의 모든 200 명의 자녀를위한 공간을 생성하지만 링크 된 목록은 필요에 따라 노드. 따라서 연결된 목록에서 사용 된 공간은 평균 (?)입니다. 배열과 함께 사용되는 간격은 최대 값이됩니다.

... 배열을 사용하는 것이 더 효율적일 때 나는 볼 수 없습니다. 이게 속임수입니까? 배열을 만들 때 총 노드 수에 배열에 제한이 있어야한다는 사실을 고려해야합니까?

답변

5

일반적으로 많이 사용되는 언어의 경우 배열에는 메모리 주소 (데이터) k을 할당해야합니다. 단일 연결 목록에는 노드 당 2 개의 주소가 필요합니다 (데이터 &). 이중 연결 목록에는 노드 당 3 개의 주소가 필요합니다.

N가 특정 노드 어린이의 실제 개수라고하자 :

  • 어레이는 K 메모리 주소를 사용
  • 단독 링크드리스트 2 개 N 주소를 사용
  • 이중 연결 목록은 3을 사용합니다. n 주소
  • K 10

값은 2 N 3 N 주소를 단순히 배열의 주소를 저장하는 비교 손익에 평균 것인지를 판단 할 수있다.

5

... 배열을 사용하는 것이 더 효율적일 때 나는 볼 수 없습니다. 이게 속임수입니까?

트릭 질문이 아닙니다. 연결된 목록에있는 메모리 의 오버 헤드을 생각해보십시오. 연결된 목록은 어떻게 구현됩니까 (배열과 비교)?

또한 (이것은 질문의 범위를 벗어나지 만!) 실제로 공간 소비가 유일한 결정 요소는 아닙니다. 캐싱은 최신 CPU에서 중요한 역할을하며 링크 된 목록 대신 배열에 개별 하위 노드를 저장하면 캐시 위치 (결과적으로 트리의 성능)를 크게 향상시킬 수 있습니다.

+0

연결 목록의 오버 헤드가 무슨 뜻인지 잘 모르겠습니다. 레퍼런스에 필요한 메모리에 대해 이야기하고 있습니까? –

+0

@dc : 링크드리스트는 어떻게 구현 되나요? 얼마만큼의 메모리가 필요합니까? –

1

나는 그것이 매우 좋은 아이디어와 사람이 사용하는 데이터 항목이 어쨌든 이전 및 다음 항목에 대한 고유 논리가있는 경우, 예를 들어, 어떻게 든입니다 TimeTableItem 또는 아무것도 LinkedList를 사용하는 많은 시나리오에서 매우 효율적이 될 수 상상할 수 시간 관련. 이것들은 인터페이스를 구현해야하기 때문에 LinkedList 구현은이를 활용할 수 있고 항목을 자체 노드 객체로 래핑 할 필요가 없습니다. 내부적으로 배열을 둘러싼 List 구현을 사용하는 것보다 삽입 및 제거가 훨씬 효율적입니다.

3

배열은 공간을 미리 할당해야하지만 우리는이를 사용하여 모든 항목을 매우 빠르게 액세스 할 수 있습니다.
목록은 새 노드를 만들 때마다 메모리를 할당합니다. 따라서 CPU 시간에
메모리 할당 비용이 들기 때문에 이상적이지 않습니다.

팁 : 당신이 원하는 경우, 한 번에 전체 배열을 할당 할 수 있지만, 일반적으로 우리가 할당
는 말할 수, 4 개 항목을 우리는 우리가 더 많은 공간을 필요로 할 때 크기를 두 배로하여 크기를 조정합니다.

+0

질문은 시간에 관한 것이 아니라 공간에 관한 것이 었습니다. –

+0

@Konrad Rudolph, 참으로. 그리고 "배열을 사용하는 것이 더 효율적일 때"를 보지 못하기 때문에 팁을 언급했습니다 :) –

1

배열을 동적으로 다시 할당 할 수 없다고 가정하고 있습니다. 할 수 있으면 배열은 k 항목보다 크고 (일정한 오버 헤드가 필요하기 때문에) 포인터에 대한 항목 단위 저장소가 필요 없기 때문에 이깁니다.