2012-06-24 5 views
1

나는 약 2 백만 개의 값 (각각 20 바이트)의 세트 (정적, 알려진 컴파일 시간)를 가지고 있습니다. 내가 필요한 것은 주어진 값이이 집합에 있는지 검사하는 빠른 O (1) 방법입니다. 비트 배열을 사용한 완벽한 해시 함수가 이상적이라고 생각되지만 간단한 방법으로는 만들 수 없습니다. gperf와 같은 유틸리티가 있지만 너무 복잡합니다. 또한, 제 경우에는 100 %에 가까운 부하율을 가질 필요가 없습니다. 심지어 10 % 정도면 충분하지만 충돌을 보장 할 수는 없습니다. 이 기능에 대한 또 다른 요구 사항은 GPU에서 실행되는 많은 조건이없는 단순성입니다. 이 케이스에 대해 조언을 해 주시겠습니까?OpenCL을위한 완벽한 해싱

+0

N = 2 백만은 꽤 큽니다. 20 바이트의 내용에 대해 알지 못한다면 완벽한 해시 함수를 찾을 수 없습니다. 테이블이 정적 인 경우 시작 시간에 해시 테이블을 구성 할 수 있습니다. 여기서 다른 질문을 보여줍니다. (그것을 파헤쳐 야 할 필요가있다) – wildplasser

+0

나는 컴파일 타임에 (거의 변함이 없다) 집합을 알고 있으며, 간단한 완벽한 해시 함수를 만드는 방법이 필요하다. – aplavin

+0

왜 완벽해야합니까? 2M 값에 대해 완벽한 해시를 찾는 것이 불가능할 경우 어떻게해야할까요? – wildplasser

답변

0

완벽한 해싱에 대한 자세한 정보를 읽은 후에는 구현하지 않기로 결정하고 대신 뻐꾸기 해시 테이블을 사용했습니다. 그것은 훨씬 더 간단하며 완벽한 해싱을 위해서는 테이블에 대한 액세스가 최대 2 회 (또는 다른 모든 값> 1, 가장 많이 사용되는 값은 2..5)가 필요합니다.

2

내 대답보기 here. 문제는 조금 다르지만 솔루션은 사용자의 요구에 맞게 조정될 수 있습니다. 원본은 100 %로드 요소를 사용하지만 쉽게 변경할 수 있습니다. 그것은 시작시에 배열을 내부적으로 섞어서 작동합니다 (컴파일 타임에 수행 할 수 있지만 생성 된 코드를 컴파일하는 것을 의미합니다).

WRT 해시 함수 : 20 바이트 개체의 내용에 대해 알지 못하는 경우 합리적인 해시 함수 (FNV, Jenkins 또는 광산)로 충분합니다.