以最有效的方式比较两个String数组

时间:2013-11-01 10:05:58

标签: c string performance algorithm

此问题是关于在主数组中搜索字符串(包含所有UID的列表)。第二个数组包含要搜索的所有字符串。

例如:

第一个数组(主列表)包含:UID1 UID2 UID3... UID99

第二个数组包含:UID3 UID144 UID50

如果在第一个数组中找到匹配,则返回1,否则返回0。因此,上述示例的输出应为101

解决上述问题可能是最有效的方法(针对C),请记住处理此问题的传统方法是n^2 !!!

4 个答案:

答案 0 :(得分:1)

对主字符串数组进行排序并进行二进制搜索。

答案 1 :(得分:0)

在什么方面有效?

我会将@ Trying的建议作为良好的运行速度,低内存使用率和非常(非常低)的实现复杂性之间的良好折衷。

只需使用qsort()对第一个主数组进行排序,然后使用bsearch()进行搜索。

假设主阵列中的 n 元素和第二个阵列中的 m ,这应该给出O( m * log n )时间复杂度似乎不错。

答案 2 :(得分:0)

另一种选择是为Master列表中的字符串构建一个哈希值,它是单个O(M)(假设长度为O(1)),然后假设哈希值均匀分布,搜索单个element应该取平均值O(M / S),其中S是散列的大小(均匀分布意味着平均而言这是映射到相同散列条目的元素数量)。您可以进一步控制大小以微调空间和效率之间的权衡

答案 3 :(得分:0)

这个问题主要有两个好方法:

  • 使用二进制搜索:二进制搜索要求对第一个数组中的UID进行排序,并允许您在O(log n) n中找到解决方案是主数组中的元素数。总复杂度为O(m log n)m要搜索的元素数量。

  • 使用 hashmap :您可以将主数组的元素存储在hashmap(O(n))中,然后检查第二个数组的元素是否在hashmap中(O(m))。总复杂度为O(n+m)

虽然第二种方法的复杂性看起来更好,但你必须记住,如果你的哈希是坏的,在最坏的情况下它可能是O(m*n)(但你很不可能)。此外,您将使用更多内存,操作也会更慢。在你的情况下,我会使用第一种方法。