맵핑 / 양자화를위한 빠른 해싱 알고리즘은 작은 정렬 된 수레의 작은 집합에 수집

cs.stackexchange https://cs.stackexchange.com/questions/128376

  •  29-09-2020
  •  | 
  •  

문제

내 응용 프로그램을 사용하면

가 있습니다.

  • collect x : 값 범위 [0, 1], 정렬되지 않은 수천 개의 부동 소수점 숫자입니다.
  • collection y : 11 [0, 1]에서 범위를 지정합니다.
  • x의 크기가 알려져 있습니다. 그것이
  • 를 보자

목표는 x를 양자화하고 y를 y로 맵핑하여 x에 대한 y의 해시 배열을 얻을 수 있습니다.

조금 더 명확하게 만드는 예제,

  • Y = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
  • X = [0.678, 0.124, ..., 1.0, ., 0.013, 0.475]

알고리즘 출력은 다음과 같이 0 기반 인덱스로 원합니다.

  • H(Y[0]) = H(0.678) = 6
  • H(Y[1]) = H(0.124) = 1
  • H(Y[n-2]) = H(0.013) = 0
  • H(Y[n-1]) = H(0.475) = 4

시도

순진히, 나는 y의 인접한 쌍의 요소 사이에 요소가 발견되도록 x의 각 요소를 위치시키기 위해 선형 및 바이너리 탐색을 시도했다.

그러나 성능은 내 응용 프로그램에 충분하지 않습니다. 이 양자화는 계산이 느린 계산이 바람직하지 않은 실시간 스레드에서 발생합니다.

질문

이런 종류의 해싱 / 양자화의 가장 좋은 방법은 무엇입니까? x는 분류되지 않습니다.

감사합니다!

도움이 되었습니까?

해결책

x를 가져 가서 가장 가까운 정수로 반올림 된 10,000을 곱합니다. 일반 c, z= (int) (x times 10000.0).

z의 10,000 개의 가능한 값이 있습니다. z의 대부분 값의 경우 z에서 인덱스를 확인할 수 있습니다. 그래서 10,000 개의 항목이있는 테이블을 만듭니다. 테이블에서 X가 I을 맵핑하고 Z를 알고,이를 증명할 수 없다면 X를 아는 것과 저장 해야하는 경우 인덱스 i를 저장할 수 있습니다.

결과적으로 9,980 개의 값으로 올바른 값을 얻은 다음 나머지 1에서 500 개의 값을 500 개의 값으로 사용할 수있는 느린 알고리즘을 사용합니다.

ps. 동일한 테이블 크기는 이중 정밀도로 사용됩니다. 테이블 크기가 무엇이든 간에이 방법을 사용하여 10,000 °를 사용하여 올바르게 매핑 할 수없는 값이 거의 없을 것입니다. 10,000 큰 크기의 테이블을 가져 가면 99.8 % 또는 99.9 %가 올바르게 매핑되고 0.1 % 또는 0.2 % 느린 알고리즘이 필요합니다. 똑같은 일이 두 배로 발생합니다. 1000 개의 항목을 사용할 수 있으며 10 또는 20 실패한 것들은 1 % 또는 2 %가됩니다.

및 멋진 것은이 메소드가 작동하지만 y 값이 배포된다는 것입니다. y 값 수가 더 크면 테이블 크기를 늘리려면

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top