确定字符串是否包含字符的最快方法

时间:2013-09-16 19:14:28

标签: string algorithm search unicode

我有一个由unicode字符组成的字符串。相同的字符只能出现一次。 字符串的长度在1到50之间。

检查特定字符是否在字符串中的最快方法是什么?

迭代字符串不是一个好选择,不是吗?为此目的有没有有效的算法?

我的第一个想法是按字母顺序排列字符串中的字符。它可以快速搜索,但是unicode字符的排序和比较并不是那么简单(使用正确的排序规则)并且它有很大的成本,可能比迭代整个字符串更大。

也许有些哈希?也许迭代是最快的方式?

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

如果没有预处理,最简单,最快捷的方法就是遍历字符。

如果有预处理,前面的方法可能仍然是最好的,或者您可以尝试一个小的哈希表来存储字符串是否包含该字符。存储哈希将占用额外的空间,但对于内存缓存可能更好(具有低哈希冲突和假设您不必访问实际字符串)。确保测量性能。

我有一种感觉,你正试图过度设计一项非常简单的任务。您是否确认这是您申请中的瓶颈?

答案 1 :(得分:0)

通过字符串的线性搜索是O(n),每个操作都非常简单。对字符串进行排序是O(n log n),操作更复杂。很明显,线性搜索在所有情况下都会更快。

如果字符以UTF-8或UTF-16编码存储,那么您可能需要搜索多个连续元素。有一些方法可以加快速度,例如Boyer-MooreKnuth-Morris-Pratt。目前还不清楚是否会有如此短的搜索字符串的实际加速。

答案 2 :(得分:0)

是对同一个字符串还是一次性任务重复操作?如果它是一次性任务,那么在完成必须查看所有字符之后,你不能比通过字符串更好。为O(n)

如果是重复操作,那么您可以对字符串进行一些预处理,以使后续操作更快。空间效率最高,速度最快的是为每个字符串中的字符构建bloom filters。一旦构建得很快,你可以说一个字符在0(1)中是否不存在,并且只有在布隆过滤器说是的时才进行有序字符串的二进制搜索。