2011-12-01 2 views
1

에 연결 C99 + SDL 게임에서 사운드 효과 (SDL_mixer 청크 데이터와 몇 가지 추가 플래그 및 파일 이름 문자열)가 포함 된 배열을 가지고 있으며 "sounds [2]와 같은 색인에서 참조됩니다. 데이터".파일 이름 또는 레이블을 숫자 인덱스

나는 파일 이름으로 소리를 불러 낼 수 있기를 원하지만, 일치하는 것이 발견 될 때까지 모든 배열을 strcmp하고 싶지는 않다. 이렇게하면 더 많은 사운드를 추가하거나 순서를 변경하거나 플레이어가 정의한 사운드 모드를 허용 할 수 있으므로 공통 식별자 (예 : "SHOT01"또는 "EXPL04")를 사용하여 호출 할 수 있습니다.

가장 빠른 방법은 무엇입니까? 나는 해싱에 대해 들었는데, 이는 루아의 문자열 색인 (table [ "field"]과 같은)과 비슷한 결과를 낳 겠지만 주제에 대해서는 아무 것도 모른다. 꽤 복잡해 보인다.

중요한 점을 감안할 때 파일 이름이나 레이블의 크기는 모두 6 자 이상 8 자 이하 여야합니다 (예 : "SHOT01.wav").

요약하면 짧은 문자열을 해시하는 방법에 대해 배울 수 있습니까? 아니면 음향 효과와 같은 것을 추적하는 가장 빠른 방법이 될 수 있으므로 임의의 레이블이나 식별자를 사용하여 호출 할 수 있습니까?

답변

1

: 나는 위키 피 디아에이 문서가 해시 테이블 메커니즘을 이해하는 좋은 출발점이 될 것입니다 생각 . 바이너리 검색과 같은 것은 구현이 간단하고 좋은 성능을 제공합니다.

그러나 해시 테이블과 해시에 관심이 있다면 기본 사항은 모두 매우 간단합니다. Wikipedia와 같은 기본 기능을 사용할 수있는 곳이 없기 때문에 더 깊이있는 기사를 찾기 위해 Google에서 더 잘 검색 할 수 있습니다.

기본 사항은 고정 크기 배열로 시작하여 모든 것을 저장하는 것입니다. 무언가를 저장할 위치를 알아 내려면 건반에서 건반 이름 (사운드 이름)을 취하고 값을 찾을 수있는 정확한 위치를 제공하도록 작업을 수행하십시오. 따라서 문자열 해싱에 대한 가장 간단한 경우는 문자열의 모든 문자를 정수 값으로 합친 다음 값을 가져 와서 모듈을 사용하여 배열의 인덱스를 제공하는 것입니다.

위치 = SUM (문자 스트링) % [어레이 크기 물론

자연적 다중 스트링은 동일한 액수를 따라서하면 동일한 위치를 제공한다. 이를 충돌이라고하며 충돌은 여러 가지 방법으로 처리 할 수 ​​있습니다. 가장 간단한 방법은 값 배열보다는 목록 배열을 사용하고 충돌이있을 때마다 목록에 추가하는 것입니다. 값을 검색 할 때 목록을 반복하고 필요한 값을 찾으십시오.

이상적인 해싱 알고리즘은 충돌 및 빠른 해싱 알고리즘이 거의 없으므로 성능이 크게 향상됩니다.

이 도움이 되길 바랍니다.

+0

생각이납니다. 원하는 해시 형식 (예 : 16 비트 배열의 [65535])의 크기 (멤버)의 배열을 가져와 해시 함수를 사용하여 모든 레이블의 인덱스를 가져와야합니다. 맞습니까? 내 문자열이 ascii 전용 (및 모든 대문자) 값으로 제한되는 경우를 조사하는 좋은 알고리즘은 무엇입니까? 해당 문자 세트로 16 비트 해시를 사용할 수 있습니까? 장기적으로 볼 때 공간은 조금은 걱정거리입니다. –

+0

이상적으로 저장되는 예상 요소 수만큼 큰 저장 컨테이너 (어레이)를 원할 수도 있습니다. 12 개의 소리 만 들려면 8에서 16 사이의 크기이면 충분합니다. 해싱 함수에 관해서 ... 모든 ASCII 문자를 정수로 합치면 8 또는 16보다 훨씬 큰 숫자로 끝날 것이므로 계수를 사용합니다. 'index = sum % 16;'은'sum'을'16'으로 나눈 나머지 값을 인덱스로 가져 오므로 항상'16'보다 작은 숫자가됩니다. – Mrafcho001

+0

종합적인 설명 주셔서 감사합니다. 번스타인 해싱과 링크 된 목록 "버킷"을 사용하여 성공적으로 썼습니다. 완벽하게 작동하는 것 같습니다! –

1

문자열 키 집합을 사용하여 개체를 매핑 할 때 해시 테이블을 자주 사용하는 것이 좋습니다. 난 당신이 아마 정렬 된 데이터 구조의 모든 소리를 유지하고 상대를 만나 빠른 검색 알고리즘을 사용하여 귀하의 경우 생각 http://en.wikipedia.org/wiki/Hash_table

관련 문제