2013-04-08 2 views
8

의 숲을 볼은`t : 내 수학 프로그램을 통해 으로 반복에 항목의 거대한 수집있을 것이다. 주로 항목포인터 (키 값 쌍과 유사한 다른 항목 ((int) item, (int) pointer)로 구성됩니다. 그러나, 자신의 각 항목은해야합니다 여러 이 같은 속성을 다른 :HashSet의, 사전, ArrayList에가 : 나무에 대해

이 에게 이

(항목, 포인터), (속성, 속성, 속성, ...)

항목, 포인터와 속성이됩니다 자주 추가되었습니다.

이 사이트와 다른 프로그램을 검색하면 프로그램에 사용할 컬렉션이 무엇인지 알지 못합니다.

Dictionary<Dictionary<int,int>,Dictionary<int,int> nestedDictionary = 
    new Dictionary<Dictionary<int,int>,Dictionary<int,int> nestedDictionary(); 

또는 일반 언어 :

Dictionary<Dictionary<item, pointer>, 
      Dictionary<attribute,attribute, ...> nestedDictionary =  
    Dictionary<Dictionary<item, pointer>, 
       Dictionary<attribute,attribute, ...>(); 

속성의 숫자가 아니라는 것을 유의하시기 바랍니다을 vcskicks.com에서 발견 사전 솔루션이 가장 적합한 것으로 보인다 지금이 순간

미리 정의 된 길이에 따라 다릅니다. 또한이 순간에 성능 오버 헤드로 인해 객체를 사용하는 것을 꺼려합니다.

해시 세트 중복 항목이 존재하기 때문에 적합하지 않은 것처럼 보이지만 속성이 다를 수 있습니다. 또는 해시 세트에 중복 항목이 있지만 해시 키가 중복되지 않을 수 있습니까? 약간의 혼란이있는 것 같습니다.

일부에 따르면 다음과 같은 HashSet의는 계산되지 않습니다

11011, 0001 
11011, 0011 

그것을 것 다른 사람에 따르면, 다른 hashkey이 때문이다. 그것은 나를 당황하게합니다.

내 질문 : 무엇을 사용하는 가장 좋은 컬렉션 유형 : 모호한에 될 위험이

? 필요하다면 이야기에 더 많은 것을 기꺼이 추가하십시오.

편집 :

거인 의미 항목의 잠재적으로 수백만. 모든 항목에는 포인터와 속성이 있습니다. 일반적인 사용은 특정 항목에 대해을 검색하여 포인터를 검색하고 포인터가 남아 있지 않을 때까지 다음 포인터의 항목을 가져 오는 이됩니다. 동시에 각 항목의 모든 속성이 수집됩니다. 추가 작업은 가끔씩 만 제거하여 정기적으로 수행됩니다. 포인터 : 포인터가 가리키는 항목의 색인입니다. 2 개의 항목이 있고 첫 번째 항목이 두 번째 항목에 연결되어 있으면 첫 번째 항목의 포인터가 두 번째 항목의 색인이됩니다. 최상의은 메모리 사용 및 속도로 정의됩니다.결국 찾은 모든 항목이 서로 비교됩니다. 예 :, 개체의 컬렉션을 유지할 필요가 같은

[Item , pointer] [attribute, attribute, ...] 
[11011, 1001] [ 1101,  1111 ] 
[10001, 1000] [ 1110,  0101 ] 
[11111, 0010] [ 1111,  1110 ] 
[11011, 0001] [ 0010,  1010 ] 

덕분에

+1

단일 링크 된 목록처럼 들립니다. – CodesInChaos

+0

'거인'의 크기는 어느 정도입니까? 일반적인 용도, 많은 독서 또는 많은 추가/삭제가 무엇입니까? 어떤 종류의 공연이 필요합니까? – RvdK

+0

"최고"를 정의해야한다고 생각합니다. 당신은 메모리 소비, 속도, 코딩의 용이성, 다른 것을 생각하고 있습니까? –

답변

2

그래서, 기본적으로 보인다 각각의 다음 속성이 있습니다 논리에

  • 참조 다음 항목
  • 속성

그래서 항목은 (모든 공공 계속 그냥 빨리 예 ... 정확히 가장 좋은 방법,하지만 경우에 당신은 상관하지 않습니다) 같은 같습니다

public struct MyItem 
{ 
    public Dictionary<String, String> attributes; 
    public MyItem next; 
} 

을 모든 당신을 승 때,

MyItem item1 = new MyItem(); 
item1.attributes["name"] = "Joe"; 
item1.next = null; // this is the default behaviour... just illustrating here 
myList.Add(item1); 

MyItem item2 = new MyItem(); 
item2.attributes["name"] = "Mary"; 
item2.next = item1; 
myList.Add(item2); 

을 : 당신이 뭔가를 추가 할 때

List<MyItem> myList; 

, 그것은 쉽게 : 필요 목록을 유지하는 것입니다 개미를 횡단하고 그냥 다음을 따라 가라.

MyItem item = myList[0]; 
while (item != NULL) 
{ 
    Console.WriteLine(item["name"]); 
    item = item.next; 
} 

희망이 도움이됩니다.

+0

질문에서, '11011'은 두 개의 포인터, 즉'1001 '과'0001 '을 가지고 있습니다. 질문의 포스터가 문제를 잘 설명하는지 잘 모르겠습니다. –

+0

필자가 알고있는 것은 단지 하나의 포인터가 있다는 것입니다. 기본적으로 단일 링크 된 목록입니다. 이 대답은 주로 가능한 해결책을 설명하기위한 것입니다 ... 필요에 따라이를 수정할 수 있습니다. – Gigi

+0

안녕 Gigi, 대답 주셔서 감사합니다. 필자는 구조체에 대해 읽었습니다. 그들은 실제로 해결책 인 것 같습니다. 나는 아프다고 생각합니다. 아직도 해시셋이 도움이 될 수 있다면 당신은 여전히 ​​불확실한가요? – user2257315