.Net 데이터 구조:Array List, List, HashTable, Dictionary, Sorted List, Sorted Dictionary -- 속도, 메모리, 사용 시기
.NET에는 복잡한 데이터 구조가 많이 있습니다.안타깝게도, 어떤 것들은 꽤 비슷해서 언제 다른 것을 사용해야 할지 항상 잘 모르겠어요.제 C#과 VB 책 대부분은 어느 정도 그것에 대해 이야기하지만, 실제로 자세히 다루지는 않습니다.
Array, ArrayList, List, Hashtable, Dictionary, SortedList 및 SortedDictionary의 차이점은 무엇입니까?
열거 가능한 것(ILIST - 'foreach' 루프를 수행할 수 있는 것)은 무엇입니까?키/값 쌍(IDICT)을 사용하는 것은 무엇입니까?
메모리 풋프린트는 어떻습니까?삽입 속도?검색 속도?
그 밖에 언급할 만한 데이터 구조가 있습니까?
메모리 사용량 및 속도에 대한 자세한 내용은 아직 검색 중입니다(Big-O 표기법).
즉석에서:
Array
* - 구식 메모리 어레이를 나타냅니다.이치노type[]
배열. 열거할 수 있습니다.자동으로 확장할 수 없습니다.매우 빠른 인서트 및 재도입 속도라고 생각합니다.ArrayList
이 커집니다. - 배열이 커집니다.오버헤드가 증가합니다.열거할 수 있습니다. 일반 배열보다 느리지만 여전히 매우 빠릅니다.이치노List
- 제가 좋아하는 것 중 하나 - 제네릭과 함께 사용할 수 있기 때문에 강력한 타입의 어레이를 사용할 수 있습니다.List<string>
에는 아주ArrayList
Hashtable
hashtable - hash레table o o 。O (1 ~ 의 경우O(1)~O(n)는 O(n)입니다.하여 키할 수 있습니다.Dictionary
로 - 위위 、 위ics 、 등 제네릭을Dictionary<string, string>
SortedList
목록 - 정렬된 일반 목록. - 정렬된 일반 목록.물건을 어디에 둘지 생각해야 하기 때문에 삽입이 느리다.열거할 수 있습니다. 재연결할 필요가 없으므로 검색 시 동일할 수 있지만 삭제 속도는 일반 이전 목록보다 느립니다.
저는 자주 쓰는 편이에요.List
★★★★★★★★★★★★★★★★★」Dictionary
항상 - 제네릭과 함께 강력한 타입으로 사용하기 시작하면 표준적인 비제너릭으로 되돌리는 것은 매우 어렵습니다.
여러 KeyValuePair
일을때 쓸 수 그런 게 SortedDictionary
이치노
가능하면 제네릭스를 사용합니다.여기에는 다음이 포함됩니다.
- Array List가 아닌 목록
- HashTable이 아닌 사전
먼저 의 모든 컬렉션입니다.NET 실장 IENumerable.
둘째, 프레임워크 버전 2.0에 제네릭이 추가되었기 때문에 많은 컬렉션이 중복됩니다.
따라서 일반 컬렉션에 기능이 추가될 가능성이 높지만 대부분의 경우 다음과 같습니다.
- List는 Array List의 일반적인 구현입니다.
- 딕셔너리 <T,K>는 해시 테이블의 일반적인 구현입니다.
배열은 지정된 인덱스에 저장된 값을 변경할 수 있는 고정 크기 집합입니다.
Sorted Dictionary는 키에 따라 정렬된 IDictionary <T,K>입니다.Sorted List는 IDirectionary <T,K>로, 필요한 ICMPARER에 근거해 정렬됩니다.
즉, IDirectionary 구현(KeyValuePairs를 지원하는 구현)은 다음과 같습니다.
- 해시 테이블
- 사전 <T,K>
- 정렬 리스트 <T,K>
- Sorted Dictionary <T,K>
에서 추가된 다른 컬렉션.NET 3.5는 해시 세트입니다.이것은 세트 조작을 지원하는 컬렉션입니다.
또한 Linked List는 표준 링크 목록 구현입니다(목록은 빠른 검색을 위한 배열 목록입니다).
다음은 일반적인 힌트입니다.
하시면 됩니다.
foreach
「」를 의 .IEnumerable
IList
으로는 '이행'입니다.IEnumberable
Count
★★★★★★★★★★★★★★★★★」Item
(제로 기반 인덱스를 사용하여 항목 표시) 속성.IDictionary
반면 임의의 인덱스로 항목에 액세스할 수 있습니다.Array
,ArrayList
★★★★★★★★★★★★★★★★★」List
implement " " " 。IList
Dictionary
,SortedDictionary
, , , , 입니다.Hashtable
IDictionary
.를 사용하고 있는 경우.NET 2.0 이후에서는, 전술한 타입의 범용 제품을 사용하는 것을 추천합니다.
이러한 유형의 다양한 작업에 대한 시간과 공간의 복잡성에 대해서는 해당 설명서를 참조하십시오.
. 데이터 는 에 NET을 사용하다
System.Collections
네임스페이스.추가 데이터 구조를 제공하는 PowerCollections 등의 유형 라이브러리가 있습니다.데이터 구조를 자세히 이해하려면 CLRS 등의 리소스를 참조하십시오.
.NET 데이터 구조:
Array List와 List가 실제로 다른 이유에 대한 자세한 설명
어레이
따르면 는 "는 "" 되지만 "오래된" 컬렉션에는 되지 않습니다).System.Collections
그러나, 다른 컬렉션(여기서는 Array List와 List(Of T))과 비교하여 어레이에 대해 「구식」이라고 하는 것은 무엇입니까?먼저 어레이부터 살펴보겠습니다.
처음에 Microsoft 의 Arrays 를 선택합니다.NET은 "여러 [논리적으로 관련된] 아이템을 하나의 컬렉션으로 취급할 수 있는 메커니즘"입니다(링크 기사 참조).그게 무슨 의미죠?어레이는, 개개의 멤버(요소)를 차례차례 메모리에 보존해, 개시 주소를 지정합니다.어레이를 사용하면 해당 주소에서 시작하는 순서대로 저장된 요소에 쉽게 액세스할 수 있습니다.
또한 101개의 일반적인 개념 프로그래밍과는 달리 어레이는 매우 복잡할 수 있습니다.
어레이는 싱글 차원, 다차원 또는 jadded로 할 수 있습니다(잡지 배열은 읽을 가치가 있습니다).어레이 자체는 다이내믹하지 않습니다.초기화가 완료되면 n개의 오브젝트를 저장할 수 있는 충분한 공간이 n개씩 할당됩니다.어레이의 요소 수는 증가하거나 축소할 수 없습니다. Dim _array As Int32() = New Int32(100)
는 어레이에 100개의 Int32 프리미티브타입 오브젝트를 포함할 수 있는 충분한 공간을 메모리블록에 예약합니다(이 경우 어레이는 0을 포함하도록 초기화됩니다).됩니다._array
.
이 기사에 따르면 공통 언어 사양(CLS)에서는 모든 어레이가 제로 베이스여야 합니다.의 어레이.NET은 제로 베이스가 아닌 어레이를 서포트하고 있습니다만, 이것은 그다지 일반적이지 않습니다.제로 베이스 어레이의 「공통성」의 결과, Microsoft는 퍼포먼스를 최적화하는 데 많은 시간을 소비하고 있습니다.따라서 싱글 디멘션 제로 베이스(SZ) 어레이는 「특수」입니다.또, 어레이를 최적으로 실장할 수 있는 것(다차원 등).) - SZ에는 조작을 위한 특정 중간 언어 명령이 있기 때문입니다.
어레이는 항상 참조(메모리 주소로서)로 전달됩니다.이것은 어레이 퍼즐의 중요한 부분입니다.경계 검사를 수행하는 동안(오류가 발생함) 배열에서 경계 검사를 사용하지 않도록 설정할 수도 있습니다.
어레이의 가장 큰 장애는 크기를 변경할 수 없다는 것입니다."고정" 용량이 있습니다.Array List 및 List(Of T)의 이력을 소개합니다.
Array List - 일반적이지 않은 목록
어레이 리스트 (및List(Of T)
- 몇 가지 중요한 차이가 있지만, 여기서 나중에 설명하겠습니다. - 아마도 (넓은 의미에서) 컬렉션의 다음 추가 항목으로 가장 잘 생각될 것입니다.ArrayList는 IList('ICOLection'의 하위) 인터페이스에서 상속됩니다.Array Lists 자체는 Lists보다 더 많은 오버헤드가 필요합니다.
IList
에서는 ArrayLists를 고정 사이즈 리스트(어레이 등)로 취급할 수 있습니다.단, ArrayLists에 의해 추가된 추가 기능 외에 ArrayLists를 사용하면 (어레이에 비해) 고정 사이즈의 ArrayLists를 사용하는 것은 큰 이점이 없습니다.
배열 목록…하다지원되지 않습니다.또한 ArrayLists는 "이 오브젝트의 일 뿐입니다.즉, ArrayLists는 "type"입니다.ArrayLists"는 "type"입니다.Object[]
이로 인해 ArrayLists를 구현할 때 많은 양의 박스화(암시적)와 박스화 해제(명시적)가 필요하게 되어 오버헤드가 증가합니다.
근거 없는 생각:Array Lists는 어레이에서 리스트 타입 컬렉션으로 이행하는 시도에 있어서 서투른 개념의 산물이라고 교수님으로부터 읽었거나 들은 기억이 있습니다.즉, 한때는 어레이가 크게 개선되었습니다.컬렉션에 관한 추가 개발이 이루어졌기 때문에 그것들은 더 이상 최선의 선택이 아니다
리스트(Of T): Array List가 된 것(및 희망)
메모리 사용률의 차이는 List(Of Int32)가 동일한 프리미티브 유형을 포함하는 ArrayList보다 56% 적은 메모리를 소비하는 경우(위 신사 링크 데모에서는 8MB와 19MB 비교), 이는 64비트 머신에 의해 복합된 결과입니다.이 차이는 실제로 두 가지를 나타냅니다.첫 번째 (1) 박스형 Int32 타입의 "object"(ArrayList)는 순수한 Int32 프리미티브 타입(List)보다 훨씬 큽니다.두 번째 (2) 64비트 머신의 내부 동작에 의해 그 차이는 기하급수적으로 커집니다.
그렇다면 무엇이 다릅니까? 리스트(Of T)는 무엇입니까?MSDN은,List(Of T)
수 있는 입니다." ,인덱스로 액세스할 수 있는 강력한 유형의 개체 목록입니다."여기서 중요한 것은 "강력한 유형" 비트입니다. 일람표(Of T)입니다. ★★★★★★★★★★★★★★★.Int32
되다.Int32
한 푼도 없다Object
유형. 이렇게 하면 박스와 언박스로 인한 문제가 없어집니다.
MSDN은 이 차이가 참조 유형이 아닌 원시 유형을 저장할 때만 적용된다고 지정합니다.또, 그 차이는 실제로 대규모로 발생합니다.즉, 500개 이상의 요소가 있습니다.더욱 흥미로운 것은 MSDN 문서에는 "ArrayList 클래스를 사용하는 대신 List(OfT) 클래스의 유형별 구현을 사용하는 것이 유리합니다."
기본적으로 List(Of T)는 ArrayList이지만 더 우수합니다.이는 Array List와 "일반적인 동등한 것"입니다.Array List와 마찬가지로 정렬(그림 참조)할 때까지 정렬할 수 없습니다.List(Of T)에는 몇 가지 기능이 추가되었습니다.
Microsoft Docs on Collection and Data Structure 페이지의 "Choose a Collection" 섹션은 매우 유용했습니다.
기타 기능을 비교하기 위한 다음 매트릭스도 있습니다.
저도 이 질문에 공감합니다.저도 그 선택을 이해하기 어렵기 때문에 어떤 데이터 구조가 가장 빠른지 과학적으로 확인했습니다(VB를 사용하여 테스트를 해봤지만, C#은 CLR 레벨에서 같은 것을 하기 때문에 동일할 것으로 생각됩니다.제가 실시한 벤치마킹 결과를 보실 수 있습니다(어떤 데이터 유형을 어떤 상황에서 사용하는 것이 가장 좋은지에 대한 논의도 있습니다).
그것들은 인텔리센스로 꽤 잘 쓰여져 있다.System 이라고 입력합니다.컬렉션또는 시스템.컬렉션Generics(권장)를 선택하면 이용 가능한 제품의 목록과 간단한 설명이 나타납니다.
해시 테이블/사전은 O(1) 퍼포먼스입니다.즉, 퍼포먼스는 사이즈의 함수가 아닙니다.알아두는 게 중요해요
편집: 실제로 해시 테이블/사전 검색의 평균 복잡도는 O(1)입니다.
일반 컬렉션은 일반적이지 않은 컬렉션보다 성능이 우수합니다. 특히 많은 항목을 통해 반복할 경우 더욱 그렇습니다.이것은 복싱과 언박싱이 더 이상 일어나지 않기 때문입니다.
Hashtable vs Dictionary에 관한 고주파수 체계적인 거래 엔지니어링에 관한 중요한 주의사항:스레드 안전 문제
해시 테이블은 여러 스레드에서 사용하기에 안전한 스레드입니다.사전 공개 스태틱멤버는 스레드 세이프이지만 인스턴스 멤버는 스레드 세이프가 보장되지 않습니다.
따라서 Hashtable은 이 점에 있어서 '표준'으로 남아 있습니다.
일반 컬렉션과 일반적이지 않은 컬렉션 사이에는 미묘하고 그다지 중요하지 않은 차이가 있습니다.서로 다른 기본 데이터 구조를 사용할 뿐입니다.예를 들어 Hashtable은 동기 없이 1개의 라이터-다인 리더를 보증합니다.사전은 그렇지 않습니다.
언급URL : https://stackoverflow.com/questions/128636/net-data-structures-arraylist-list-hashtable-dictionary-sortedlist-sorted
'programing' 카테고리의 다른 글
한 셸 스크립트에서 다른 셸 스크립트로 모든 변수를 전달하시겠습니까? (0) | 2023.04.08 |
---|---|
Bash 스크립트를 사용하여 사용자 계정과 비밀번호를 자동으로 추가하는 방법은 무엇입니까? (0) | 2023.04.08 |
".bat" 파일에서 명령줄 매개 변수를 확인하는 방법 (0) | 2023.04.08 |
Angularjs 세션스토리지 및 범위 (0) | 2023.03.30 |
Json을 사용하여 Web API에서 응답을 직렬화하지 못했습니다. (0) | 2023.03.29 |