이미 C# BCL에 BST가 있고 SortedDictionary<TKey, TValue>
이라고합니다. 키 값 쌍이 필요하지 않고 단일 항목을 원할 경우 SortedSet<T>
(SortedSet은 .NET 4.0에 있음)을 사용할 수 있습니다.
예를 들어 SortedDictionary<int, WhateverValueType>
을 원합니다. 비록 당신이 "균일 무작위 선택"이라고 말할 때 당신이 정확히 무엇인지 확신 할 수는 없지만.
물론, Dictionary<TKey, TValue>
은 O (1)이며 훨씬 빠릅니다. 그래서 당신이 정렬 된 키 순서가 필요하다면, 나는 그것을 사용할 것입니다.
업데이트 : 필요에 따라 효율적으로 조정할 수 있습니다. 데이터 구조에서 임의의 인접 인덱스로 점프 할 수있게하려면 얼마나 자주 삽입/삭제할 것입니까? 자주 (O (n log n)) 후에 배열을 사용하고 Sort()를 사용하거나 항상 순서대로 삽입/삭제 (O (n)) 할 수 있습니다.
또는 당신이 Dictionary<int, YourType>
포장 및 병렬 List<int>
을 유지하고 이후 모든 추가/삭제 업데이트 할 수 있습니다 :
_dictionary.Add(newIndex, newValue);
_indexes.Add(newIndex);
을 그리고 단지 조회의 목록에서 임의의 인덱스를 액세스 할 수 있습니다. 좋은 점은이 방법에서 실제로 Add()가 ~ O (1) (목록 크기가 조정되지 않지만 일부는 피할 수있는 초기 용량을 설정할 수 있음)이지만 O (n) .
조회가 불편하거나 삭제/삽입에 시간이 많이 걸리는 경우가 있습니다. 문제는 모든 액세스 시간 컨테이너가 연속적이지 않다는 것입니다. 듀얼 List<int>/Dictionary<int, YourValue>
콤보를 사용하면 꽤 좋은 믹스를 얻을 수 있습니다.
업데이트 2 : 우리의 계속 된 토론 에서처럼 절대 성능이 요구 사항이라면 자신 만의 행운을 빕니다. 생각 해보니 재미 있었고, 내가 다른 것을 생각하면 업데이트 할 것입니다.
균일 한 임의 선택 기준은 무엇입니까? 키/값 쌍을 사용할 수 있다면 사전이 목적에 부합 할 수 있습니다. – EtherDragon
기본적으로 모든 객체를 모자에 넣고 무작위로 꺼내야합니다 (단, 모자에서 유지해야합니다). 여기서는 객체의 구조가 없습니다. 필요한 경우 각 개체에 고유 한 ID를 연결할 수 있지만 의미가없는 선택입니다. –