在C99 + SDL游戏中,我有一个包含声音效果的数组(SDL_mixer块数据和一些额外的标志和文件名字符串),并被索引引用,例如“sounds [2] .data”。
我希望能够通过文件名调用声音,但我不希望strcmp所有数组,直到找到匹配项。这样,当我添加更多声音,或更改顺序或允许播放器定义的声音模块时,仍然可以使用公共标识符(例如“SHOT01”或“EXPL04”)调用它们。
最快的方法是什么?我听说过散列,这会导致类似于lua的字符串索引(例如table [“field”]),但我对这个主题一无所知,而且看起来相当复杂。
为了防止重要,我计划让文件名或标签为6到8个全部大写文件名(例如“SHOT01.wav”)。
总而言之,我在哪里可以了解像这样的散列短字符串,或者是什么是跟踪声音效果等最快的方法,以便可以使用任意标签或标识符来调用它们?
答案 0 :(得分:1)
你是对的,当谈到用一组字符串键映射对象时,哈希表通常是要走的路。 我认为维基百科上的这篇文章是理解哈希表机制的一个很好的起点:http://en.wikipedia.org/wiki/Hash_table
答案 1 :(得分:1)
我认为在您的情况下,您可以将所有声音保留在已排序的数据结构中,并使用快速搜索算法来查找匹配项。像二进制搜索这样的东西是非常简单的工具,它提供了良好的性能。
但是,如果您对散列表和散列感兴趣,那么它的基础知识非常简单。没有像维基百科这样的地方可以降低基础知识,然后您可以在Google上更好地定制搜索,以找到更多深度文章。
基础知识是从固定大小的数组开始,并将所有内容存储在那里。要找出存储内容的位置,您可以使用键(在您的情况下是声音名称)并对其执行某些操作,以便为您提供可以找到值的确切位置。因此,字符串哈希的最简单情况是将字符串中的所有字母作为整数值相加,然后取值并使用模数为您提供数组中的索引。
position = SUM(字符串字母)%[数组大小]
当然,自然多个字符串将具有相同的总和,从而为您提供相同的位置。这称为碰撞,可以通过多种方式处理碰撞。最简单的方法是使用一个列表数组而不是值数组,并且每次存在冲突时只需附加到列表中。搜索值时,只需迭代列表并找到所需的值即可。
理想情况下,一个好的哈希算法会有很少的冲突和快速哈希算法,从而提供巨大的性能提升。
我希望这会有所帮助:)