此问题是关于在主数组中搜索字符串(包含所有UID的列表)。第二个数组包含要搜索的所有字符串。
例如:
第一个数组(主列表)包含:UID1 UID2 UID3... UID99
第二个数组包含:UID3 UID144 UID50
如果在第一个数组中找到匹配,则返回1,否则返回0。因此,上述示例的输出应为101
。
解决上述问题可能是最有效的方法(针对C),请记住处理此问题的传统方法是n^2
!!!
答案 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)
(但你很不可能)。此外,您将使用更多内存,操作也会更慢。在你的情况下,我会使用第一种方法。