2010-08-11 2 views
3

상당히 큰 검색을 실행 중이고 System.OutOfMemoryException이 발생합니다.반복 값을 인식하기위한 데이터 구조

문제는 내가 이전에 방문한 각 상태에 대한 문자열 키를 HashSet<sting>으로 저장하고 있습니다. 이것이 약 7 백만 개 요소가되면 충돌합니다. 내 생각에 내가 문자열을 검색 할 필요가 없으며, 문자열이 세트에 있는지 만 인식 할 수있다.

나는 이런 종류의 전문 데이터 구조를 기억하는 것 같다. 그러나 나는 내 삶의 이름을 기억하지 못한다. 올바르게 기억한다면 꽤 일정한 메모리 요구 사항이 있고 그 요소에 요소를 추가하면 이미 값을 추가했는지 여부를 어느 정도 확신 할 수 있습니다. 내가 이것을 만들거나 이것이 존재 하는가? 어떤 팁?

+0

어떤 종류의 검색을 수행하고 있습니까? 연결된 목록, 문자열의 하위 문자열에서 순환을 찾으십니까? 디자인에 큰 영향을 미칩니다. – madcapnmckay

+0

당신이 실제로하고있는 일에 대해 좀 더 설명해 주시겠습니까? 당신은 문자열로 표현하는 몇 가지 것들을 방문하고 있으며, 이전에 그곳에 있었는지 여부를 각 지점에서보고 싶습니까? – Hut8

+0

상태를 반복하지 않아야합니다. 그렇게하기 위해서 나는 내가 방문하고 그것을 저장하는 각 상태를 고유하게 식별하는 문자열을 얻는다. 내가 다시 그 주를 방문하려고하면 나는 그것을 인식 할 수는 있지만 그렇게하지는 않습니다. – captncraig

답변

2

가 이것에 대한 .NET에서 표준 모음은 없지만, 예를 들면보다 훨씬 적은 공간을 사용하여 Trie에서 문자열의 작정 를 저장할 수 있습니다 해시 테이블/세트

0

사전 수업에 대해 이야기하고 있습니까?

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

MSDN에서 발췌

는 :

사전에 모든 키를 사전의 같음 비교에 따라 고유해야합니다. 키는 null 일 수 없지만 값 유형 TValue가 참조 유형 인 경우 값은 이 될 수 있습니다.

ContainsKey 메서드를 사용하여 새 레코드를 삽입하기 전에 항목이 이미 삽입되어 있는지 확인할 수 있습니다.

+1

예, 그렇습니다. 그러나 사전에 필요한 저장소는 요소 수에 선형입니다. 적은 메모리를 사용하는 무언가가 필요합니다. – captncraig

3

아마 Bloom filter을 생각할 것입니다. 문자열이 집합에 있는지 검사 할 때 확률적인 결과를 제공합니다. 그렇다면 항상 찾을 수 있습니다. 그렇지 않은 경우, 설정에 포함 된 나머지 항목에 따라 여전히 해당 항목을 감지 할 수 있습니다. 메모리 요구 사항은 추가하는 고유 한 요소의 수에 따라 변경되지만, 보다 작아서 HashSet을 차지합니다.

+0

예! 그게 다야! 나는 이것을 받아 들일 것이지만 나는 trie를 사용하는 것이 정말로 좋다고 생각한다. – captncraig

2

나는 u가 trie 데이터 구조를 의미한다고 생각합니다. 트라이 그것은 다음과 같은 장점이있는 동안 해시 테이블, 대체 할 수하십시오 트라이 데이터를 올려

  • 빠르게 최악의 경우이다, O (m)의 시간은, 불완전한 해시 테이블에 비해 . 불완전한 해시 테이블은 주요 충돌을 가질 수 있습니다. 키 충돌은 다른 키를 해시 테이블의 동일한 위치에 매핑하는 해시 함수입니다. 불완전한 해시 테이블에서의 최악의 검색 속도는 O (N) 시간이지만 훨씬 더 일반적으로 O (1)이며 O (m) 시간은 해시를 평가하는 데 소비됩니다.
  • 트라이에서 다른 키의 충돌이 없습니다.
  • 키 충돌을 저장하는 해시 테이블 버킷과 유사한 트 리의 버킷은 단일 키가 두 개 이상의 값과 연결되어있는 경우에만 필요합니다.
  • 트라이에 더 많은 키가 추가되면 해시 함수를 제공하거나 해시 함수를 변경할 필요가 없습니다.
  • 트라이는 키를 사용하여 항목의 사전 순 정렬을 제공 할 수 있습니다.