2009-11-02 2 views
0

저의 목표는 (메모리 제한이없는 세계에서) 약 10^5 x 10^5 인 행렬의 가장 관련있는 항목을 저장하는 효율적인 구조를 만드는 것입니다 복식으로 채워진다. 행렬은 대칭이므로 실제로 (10^10)/2 값만 포함합니다.저장 및 해시하는 가장 좋은 방법 키 (C++)

시뮬레이션에서 여러 번 항목에 액세스해야하므로 빠른 검색이 중요합니다.

구조를 관리하기 쉽게하기 위해 사용하지 않을 수있는 멤버를 삭제합니다. 색인이 (int_x1, int_x2) 인 경우, 예를 들어 x1을 포함하는 모든 쌍을 삭제하려는 경우가 있습니다.

이 작업에 가장 적합한 구조 또는 구조 집합은 무엇입니까? 두 int에 대한 좋은 해시는 무엇입니까?

휴대 성을 위해 Boost를 피하고 싶습니다. 현재 TR1의 unordered_map을 프로그램의 다른 곳에서 사용하고 있습니다. 나는 키 쌍으로 unordered_map을 다시 사용하려고 생각하고 있었지만이 방법으로 항목을 효율적으로 삭제할 수 있을지 잘 모르겠다. 좋은 해시 함수가 어떻게 생겼는지 모르겠다.

저는 시작 프로그래머입니다. 따라서 분명히 말씀해주십시오.

+0

또한 모든 x1 멤버만큼 모든 x2 멤버를 삭제해야합니까? – jmucchiello

+3

CSR과 같은 표준 스파 스 매트릭스 스토리지 구성표를 사용 해본 적이 있습니까? 매트릭스에서 수행해야하는 작업에 따라 제대로 작동 할 수 있습니다. – mch

+0

휴대 성을 위해 부스트를 피 하시겠습니까? 부스트는 꽤 휴대용이며 당신이 필요로 할 수 있습니다 플라이급있다. – Patrick

답변

1

데이터가 매우 희박한 경우 해시 테이블 배열을 사용할 수 있습니다.

hash_map<int,double> matrix[] = new hash_map<int,double>[10000]; 
for (int i = 0; i < 10000; i++) matrix[i] = new hash_map<int,double>(); 

그런 다음 값 (x, y)을 찾으려면 배열을 x로 인덱싱하고 해시 테이블에서 y를 찾습니다. 조심하는

몇 가지 : 당신이 해시 테이블의 많은 반복을 가지고

  • 삭제가 꽤 비싼 얻을 수 있습니다.
  • 삭제/삽입 할 때 총 저장 용량이 커질 수 있으므로 때때로 hash_maps를 trim()해야합니다.
  • 대칭을 이용하는 것이 쉬워야합니다.
+0

이것은 해시 테이블의 해시 테이블을 가지지 않는 이유가 있습니까? – Sarah

+0

해시 테이블의 해시 테이블을 만들지 않아도됩니다. 또한 무엇을 설명하십시오. trim()을 말한거야? 그건 TR1의 unordered_map이나 내가 찾은 다른 해쉬 맵의 멤버 함수가 아닌 것 같습니다. 현재 x1 인덱스에 대해 하나의 해시 테이블이 있습니다. 여기서 x1> x2입니다. 이러한 각 항목은 모든 x2 Sarah

+1

해시 테이블의 해시 테이블은 괜찮지 만 1 차원의 인덱스가 과도하게 밀집 해있을 수 있습니다. 그렇습니다, 벡터는 괜찮을 것입니다. 죄송합니다. 트림은 일반적인 개념이지 특정 기능이 아닙니다. 대부분의 구현은 삽입시 해시 테이블을 자동 확장하지만 삭제시 hash_map을 자동 축소하지는 않습니다. 삽입/삭제 패턴에 따라 일부 메모리를 절약하기 위해 정기적으로 hash_maps를 다듬을 수 있습니다. 이 방법은 C++에서는 없지만 size()가 bucket_count()보다 훨씬 작 으면 새 hash_map에 데이터를 복사하고 이전 데이터를 삭제하면됩니다. –