문제

성능을 누르지 않고 항목을 쉽게 추가 할 수있는 일종의 배열 데이터 유형을 찾고 있습니다.

  • 체계.정렬 - Redim Preserve 기존 요소의 양만큼 느리게 전체 RAM을 구식에서 새로 복사합니다.
  • 시스템 수집.배열 목록 - 충분하다?
  • 시스템 수집.일리스트 - 충분하다?
도움이 되었습니까?

해결책

몇 가지 데이터 구조를 요약하려면 다음과 같습니다.

System.Collections.ArrayList: Unttyped 데이터 구조는 더 이상 사용되지 않습니다. 대신 목록 (t)을 사용하십시오.

system.collections.generic.list (t): 이것은 재판용 배열을 나타냅니다. 이 데이터 구조는 무대 뒤에서 내부 배열을 사용합니다. 목록에 항목을 추가하는 것은 기본 배열이 채워지지 않은 한 O (1)입니다. 그렇지 않으면 내부 어레이를 크기를 조정하고 요소를 복사하기위한 O (n+1).

List<int> nums = new List<int>(3); // creates a resizable array
                                   // which can hold 3 elements

nums.Add(1);
// adds item in O(1). nums.Capacity = 3, nums.Count = 1

nums.Add(2);
// adds item in O(1). nums.Capacity = 3, nums.Count = 3

nums.Add(3);
// adds item in O(1). nums.Capacity = 3, nums.Count = 3

nums.Add(4);
// adds item in O(n). Lists doubles the size of our internal array, so
// nums.Capacity = 6, nums.count = 4

항목 추가는 목록 뒷면에 추가 할 때만 효율적입니다. 중간에 삽입하면 배열이 모든 항목을 앞으로 전환하도록합니다. 이는 O (n) 작업입니다. 배열이 항목을 뒤로 이동해야하므로 항목 삭제도 O (N)입니다.

system.collections.generic.linkedlist (t): 목록의 항목에 대한 임의 또는 색인 액세스가 필요하지 않은 경우 예를 들어 항목을 추가하고 첫 번째로 반복 할 계획이라면 링크 사전 목록이 친구입니다. 인서트 및 제거는 O (1)이고 조회는 O (N)입니다.

다른 팁

일반 목록 <>를 사용해야합니다 (System.Collections.generic.list) 이것을 위해. 작동합니다 일정한 상각 시간.

또한 배열과 다음과 같은 기능을 공유합니다.

  • 빠른 무작위 액세스 (O (1)의 목록에있는 요소에 액세스 할 수 있습니다)
  • 빠르게 반복됩니다
  • 시작 또는 중간에 객체를 삽입하고 제거하는 데 천천히 (전체 ListBelieve의 사본을 수행해야하므로)

시작 또는 끝에 빠른 삽입 및 삭제가 필요한 경우 링크리스트 또는 대기열을 사용하십시오.

Linkedlist <t> 구조가 당신에게 효과가 있습니까? 직선 배열만큼 직관적이지는 않지만 매우 빠릅니다.

  • 끝까지 추가하기 위해 Addlast
  • AddBefore/AddAfter는 목록에 삽입합니다
  • Addfirst는 처음에 추가됩니다

그러나 항목에 액세스하기 위해 구조를 반복해야하므로 무작위로 액세스 할 수는 없습니다. 그러나 .tolist () 및 .toArray () 메소드가 있습니다. 따라서 읽기 액세스를 위해서는 핀치로 수행 할 수 있습니다. 인서트의 성능 증가는 무작위 액세스의 필요성의 성능 감소를 능가하거나 그렇지 않을 수 있습니다. 그것은 당신의 상황에 전적으로 의존합니다.

올바른 방법을 결정하는 데 도움이되는이 참조도 있습니다.

배열/배열 목록 위에 링크 된 목록을 사용하는시기?

"충분히 좋은"것은 무엇입니까? 해당 데이터 구조로 정확히 무엇을하고 싶습니까?

어레이 구조 (예 : O (N) 액세스) 없음 O (N) 런타임없이 중간에 삽입 할 수 있습니다. 끝에서 삽입은 O (n) 최악의 경우 A (1) A (1) Arraylist와 같은 자체 재조정 어레이에 대해 상각됩니다.

어쩌면 해시 타이블 (Amortized O (1) 접근 및 삽입, O (n) 삽입의 최악의 경우) 또는 나무 (O (log (n))가 접근 및 삽입을위한 나무 (O (log (n))가 더 적합 할 수 있습니다.

속도가 문제 인 경우, 선택한 답변이 원시 배열을 사용하는 것보다 어떻게 더 나은지 알 수 없지만 자체적으로 크기를 만들지 만 배열 크기를 조정하는 데 사용하는 것과 동일한 메커니즘을 사용합니다 (그리고 더 오래 터치를 필요로합니다. ) 항상 끝에 추가하지 않는 한,이 경우 하나의 요소 대신 한 번에 덩어리를 할당하기 때문에 약간 더 똑똑한 일을해야합니다.

컬렉션의 시작/중간 근처에 자주 추가하고 중간/끝에 자주 색인하지 않으면 링크 된 목록을 원할 것입니다. 그것은 가장 빠른 삽입 시간을 가지며 반복 시간이 큰 시간을 가질 것입니다. 단지 인덱싱에 빠지게됩니다 (예 : 끝에서 3 번째 요소를 보거나 72nd 요소를 보는 것).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top