웹 응용 프로그램은 양의 정수 집합 쌍을 비교합니다. 각 세트에는 고유 한 값만 있고210 000 000 (28 비트에 맞음)보다 크지 않습니다. 각 세트에서 최대 5 000 000 개의 값.고유 한 자연수 세트를 압축하고 두 세트를 비교하는 방법은 무엇입니까?
세트 A & B를 비교할 때 "A에 고유", "B에 고유", "A & B에 공통"의 결과 세트가 필요합니다. 특정 작업은 "집합 S에 숫자 N이 있습니까?"라는 질문에 대답하는 것입니다.
지금까지 프로젝트는 LAMP 스택에서 제한된 공유 호스팅 리소스에서 실행됩니다. 내가 생각해 낸 빠른 해결책은 더 많은 자원을 가진 호스팅 MySQL에 작업을 아웃소싱하는 것이 었습니다. 각 세트에 대한 임시 테이블, 숫자가있는 유일한 컬럼이 기본 인덱스입니다. 드물게 세트는 엔진 = 메모리에 들어가기에 충분히 작으며 빠릅니다. 그것은 효과가 있지만 너무 느립니다.
이 같은 메모리 내 집합을 유지하는 방법을 찾고, 그 안에있는 특정 번호를 검색하는 작업에 효과적입니다. 가능한 한 메모리 사용량을 줄입니다.
각 세트를 2^28 비트 (32Mb)의 비트 마스크로 코딩하는 아이디어가 떠 올랐습니다. 세트에있는 숫자 = 1 비트 세트. 5 mln numbers =210 mln에서 설정된 5 mln 비트. 많은 0 == 효과적으로 압축 할 수 있습니까?
나는 자전거를 발명하고있는 것처럼 보입니다. 바이너리 압축의 특별한 경우에 대한 "잘 알려진"해결책으로 안내해주십시오. 내 작업은 압축 된 집합을 통해 많은 검색이 필요하지만 그 초점은 크기 축소로 올바른 솔루션으로 보이지 않는 허프만 코딩에 대해 읽었습니다.
업데이트.Golomb coding에 대한 기사와 그 application to run-length encooding의 예가 발견되었습니다.
210,000,000은 28 비트가 필요합니다. 2^23은 8 백만이 조금 넘습니다. – rici
@rici : 당신 말이 맞습니다. 23은 내가 고려한 최적화에서 나온 것입니다.) – Serge