2016-11-08 2 views
1

키가 Tuple<int, int, int> 인 희소 행렬로 3D 배열을 나타내고 있는데 튜플의 각 값은 i, j, k 매트릭스 인덱스 중 하나입니다.모든 키를 열거하지 않고 Dictionary <Tuple <int, int, int>, double>로 표현되는 드문 드문 한 배열 잘라 내기 : 가능합니까?

이제 조각을 가져오고 싶습니다. 예를 들어, Key.Item1에 주어진 인덱스가있는 모든 값을 원합니다.

모든 사전 키를 반복하지 않고도이 값을 얻을 수 있습니까?

보너스로, C#의 다차원 희소 배열을 나타내는 다른 데이터 구조 (사전 외)가 있습니까? 이렇게하면 이러한 슬라이스 작업이보다 간단해질 수 있습니다.

+0

다음과 같이하십시오 : Dictionary , double> (dict = new) var results = dict.Keys.AsEnumerable(). 여기서 (x => x.Item1 == 123) .ToList(); – jdweng

+0

@jdweng 의도는 정확하지만, 똑같은 결과를 얻는 열거보다 더 좋은 방법이 있는지 정확하게 묻습니다. – heltonbiker

+0

@heltonbiker는 dis 데이터 구조가 아닐 수도 있습니다. 어쩌면 당신은 실제로 값으로 가치 참고 목록과 함께 당신의 i, j, k에 키가 세 사전의 튜플을 원합니까? 이렇게하면 j = 5 인 모든 값을 원한다면 Tuple.Item2 [5]로 이동하면됩니까? – user3012759

답변

0

구조가 더 좋을 수도 있지만 사전 대신 List<Tuple<int, int, int, double>>을 사용하고 슬라이스 할 차원을 기준으로 정렬 할 수 있습니다. 그런 다음 이진 검색을 통해 원하는 조각을 찾을 수 있습니다. 물론 이것은 동일한 차원으로 항상 슬라이싱하는 경우에만 작동합니다.

+0

흥미롭지 만 어디에서 값을 저장하겠습니까? 그리고 제거하고 삽입하는 것은 어떨까요? – heltonbiker

+0

죄송합니다 .. 목록에 두 번 추가했습니다.단일 항목에 액세스해야하는 경우 3 개의 2 진 검색을 수행해야합니다. 나는 이것을 클래스로 포장 할 것이다. – AlexDev

1

예, 가능합니다.

진정한 사전을 원하면 주문 된 사전을 사용하십시오. 주문은 Item1*1000000+Item2*1000+Item3과 같은 간단한 계산으로 정의하십시오. 크기를 사용하면 원하는 차원을 따라 이동하도록 모듈 방식의 수학을 수행 할 수 있습니다 (나는 우주의 크기를 모르기 때문에 임의로 요인을 선택했습니다).

모든 항목 2 요소를 얻으려면, 당신은 "발견" 항목 2이 들어있는 첫 번째 계산 된 값을 의미 이진 검색을 할 것입니다. 거기에서 더 이상 항목 2을 포함하지 않는 요소가 나올 때까지 앞으로 앞으로 걸어갑니다. 그것이 당신의 결과입니다. 당신은 당신의 튜플에있는 다른 아이템들과 같은 일을합니다. int 치의 trie 가역 사전, 그리고 당신이 원하는 걸 얻을 수 항목 2에 대한 목록을 넘어

. 단일 튜플에 대한 검색은 트라이의 맨 위에서 시작하여 아래로 걷는 것을 의미합니다. 의 경우 항목 3의 경우 하단에서 시작하여 위로 올라갑니다. 항목 2의 경우 두 번째 목록에서 항목 2 값으로 시작하고 다른 항목에 대해 각각 하나씩 조회합니다.

튜플의 모든 한 차원을 찾는 알고리즘은 위와 같지만 다음 수준은 하나를 찾는 것이 아니라 모든 항목을 방문합니다.