2013-04-02 3 views
8

가장 오래된 요소를 삭제할 수있는 데이터를 해싱하는 데 사용할 수있는 기존 데이터 구조가 있습니까?가장 오래된 요소를 제거하는 제한된 크기의 사전?

내가 지금 생각하고있는 접근 방법은 사전을 사용하여 사전을 빠르게 검색하고 대기열을 사용하여 사전에서 가장 오래된 요소를 삭제할 수있게하는 것입니다.

+0

가장 오래된 요소 이외의 요소를 제거해야합니까? 그리고 많은 요소를 저장해야합니다 - 즉, 삭제시 성능이 얼마나 중요한가? –

+0

이 잠재적 인 콜렉션에 어떤 유형의 데이터가 저장되고 있습니까? – MethodMan

+0

가장 오래된 요소를 삭제하려면 크기 또는 시간이 필요합니다. –

답변

10

OrderedDictionary을 사용할 수 있습니다. 이렇게하면 삽입 순서가 유지됩니다 (키순으로 정렬되는 SortedDictionary과 달리). 그런 다음 가장 오래된 것으로 간주되는 첫 번째 사용 가능한 요소를 제거 할 수 있습니다.

+4

+1. 첫 번째 요소의 제거는 O (n)이며, 질문은 해당 작업에 대한 타이밍 요구 사항을 지정하지 않으므로 ok 일 수 있습니다. –

+0

@AlexeiLevenkov - 좋은 지적입니다. 또한 OP에 최적화가 핵심적인 경우 http://www.dotnetperls.com/dictionary-optimization을 사용하여 OrderedDictionary를 초기화하는 데 필요한 용량 크기를 테스트 해 볼 가치가 있습니다 (기사가 표준 사전 컬렉션과 관련이 있지만 원리는 여전히 적용되어야 함)) – keyboardP

0

System.Collections.Generic.SortedList은 키별로 정렬 된 사전입니다. 키가 어떤 식 으로든 시간적이라면 다른 항목을 추가 할 때 특정 크기에 도달하면 RemoveAt을 사용하여 첫 번째 요소를 제거하면됩니다.

Dictionary을 언급 했으므로 아마도 임시 키가 없습니다. 그러나 DictionaryKeyValuePair<K,V> 개체의 모음 일뿐입니다. 따라서 값이 KeyValuePair<K,V> 인 정렬 된 목록을 가질 수 있으며 키는 요소가 추가 된 날짜/시간입니다.

0

특정 요구 사항이 있으므로 사전에 대기열/버퍼가있는 사전 (예 : 댓글에 언급 된 순환 버퍼)을 구현합니다.

OrderedDictionary는 좋은 방법이며이를 수행하는 방법에 대한 좋은 자료입니다. 여기에 게시하고 싶지는 않지만 쉽게 찾을 수 있습니다. 요소를 보유하기 위해 ArrayList보다 나은 것을 필요로합니다. dequeueing) - 당신이 끊임없이 '첫 번째'를 제거하기 때문에.

관련 문제