Algorithm 快速集合重叠匹配算法
假设我有两套:Algorithm 快速集合重叠匹配算法,algorithm,search,set,match,Algorithm,Search,Set,Match,假设我有两套: A = [1, 3, 5, 7, 9, 11] 及 这两个集合可以是任意的(并且元素数量不同) 我正在编写一个性能关键型应用程序,该应用程序要求我执行搜索,以确定两个集合共有的元素数。我实际上不需要返回匹配项,只需要返回匹配项的数量 显然,一个幼稚的方法将是一种蛮力,但我怀疑这远不是最佳的。是否有执行此类操作的算法 如果有帮助,在所有情况下,集合都将由整数组成。如果两个集合的大小大致相同,则同步遍历它们,类似于合并-排序-合并操作,大约是最快的 看看第一个元素。 如果它们匹配,
A = [1, 3, 5, 7, 9, 11]
及
这两个集合可以是任意的(并且元素数量不同)
我正在编写一个性能关键型应用程序,该应用程序要求我执行搜索,以确定两个集合共有的元素数。我实际上不需要返回匹配项,只需要返回匹配项的数量
显然,一个幼稚的方法将是一种蛮力,但我怀疑这远不是最佳的。是否有执行此类操作的算法
如果有帮助,在所有情况下,集合都将由整数组成。如果两个集合的大小大致相同,则同步遍历它们,类似于合并-排序-合并操作,大约是最快的 看看第一个元素。
如果它们匹配,则将该元素添加到结果中,并向前移动两个指针。
否则,将指向最小值的指针向前移动 一些伪Python:
a = []
b = []
res = []
ai = 0
bi = 0
while ai < len(a) and bi < len(b):
if a[ai] == b[bi]:
res += a[ai]
ai+=1
bi+=1
elif a[ai] < b[bi]:
ai+=1
else:
bi+=1
return res
a=[]
b=[]
res=[]
ai=0
bi=0
而ai
如果一个集合明显大于另一个集合,则可以使用二进制搜索从较大集合中的较小集合中查找每个项目 如果两个集合的大小大致相同,则同步遍历它们(类似于合并-排序-合并操作)的速度差不多是最快的 看看第一个元素。
如果它们匹配,则将该元素添加到结果中,并向前移动两个指针。
否则,将指向最小值的指针向前移动 一些伪Python:
a = []
b = []
res = []
ai = 0
bi = 0
while ai < len(a) and bi < len(b):
if a[ai] == b[bi]:
res += a[ai]
ai+=1
bi+=1
elif a[ai] < b[bi]:
ai+=1
else:
bi+=1
return res
a=[]
b=[]
res=[]
ai=0
bi=0
而ai
如果一个集合明显大于另一个集合,则可以使用二进制搜索从较大集合中的较小集合中查找每个项目 这里是想法(尽管是非常高层次的描述)
顺便说一下,我将冒昧地假设每组中的数字不会出现多次,例如[1,3,5,5,7,7,9,11]不会出现
您定义了两个变量,用于保存在每个数组中检查的索引
从每组的第一个数字开始,比较它们。两个可能的条件:它们相等或一个比另一个大
如果它们相等,则对事件进行计数,并将两个数组中的指针移动到下一个元素
如果它们不同,则将较低值的指针移动到数组中的下一个元素,并重复该过程(比较两个值)
循环在到达任一数组的最后一个元素时结束
希望我能以一种清晰的方式解释它。以下是想法(尽管是非常高层次的描述)
顺便说一下,我将冒昧地假设每组中的数字不会出现多次,例如[1,3,5,5,7,7,9,11]不会出现
您定义了两个变量,用于保存在每个数组中检查的索引
从每组的第一个数字开始,比较它们。两个可能的条件:它们相等或一个比另一个大
如果它们相等,则对事件进行计数,并将两个数组中的指针移动到下一个元素
如果它们不同,则将较低值的指针移动到数组中的下一个元素,并重复该过程(比较两个值)
循环在到达任一数组的最后一个元素时结束
希望我能解释清楚。如果两个集合都被排序,那么两个集合的最小元素要么是第一个集合的最小值,要么是第二个集合的最小值。如果它是第一个集合的最小值,那么下一个最小的元素就是第二个集合的最小值或者第一个集合的第二个最小值。如果重复此操作直到两套结束,则您已订购了两套。对于您的特定问题,您只需要比较元素是否也相等 可以使用以下算法迭代两个集合的并集:
intersection_set_cardinality(s1, s2)
{
iterator i = begin(s1);
iterator j = begin(s2);
count = 0;
while(i != end(s1) && j != end(s2))
{
if(elt(i) == elt(j))
{
count = count + 1;
i = i + 1;
j = j + 1;
}
else if(elt(i) < elt(j))
{
i = i + 1;
}
else
{
j = j + 1;
}
}
return count
}
交点集基数(s1,s2)
{
迭代器i=开始(s1);
迭代器j=开始(s2);
计数=0;
而(i!=结束(s1)和&j!=结束(s2))
{
if(elt(i)=elt(j))
{
计数=计数+1;
i=i+1;
j=j+1;
}
else if(elt(i)
如果两个集合都已排序,则两个集合的最小元素要么是第一个集合的最小值,要么是第二个集合的最小值。如果它是第一个集合的最小值,那么下一个最小的元素就是第二个集合的最小值或者第一个集合的第二个最小值。如果重复此操作直到两套结束,则您已订购了两套。对于您的特定问题,您只需要比较元素是否也相等
可以使用以下算法迭代两个集合的并集:
intersection_set_cardinality(s1, s2)
{
iterator i = begin(s1);
iterator j = begin(s2);
count = 0;
while(i != end(s1) && j != end(s2))
{
if(elt(i) == elt(j))
{
count = count + 1;
i = i + 1;
j = j + 1;
}
else if(elt(i) < elt(j))
{
i = i + 1;
}
else
{
j = j + 1;
}
}
return count
}
交点集基数(s1,s2)
{
迭代器i=开始(s1);
迭代器j=开始(s2);
计数=0;
而(i!=结束(s1)和&j!=结束(s2))
{
if(elt(i)=elt(j))
{
计数=计数+1;
i=i+1;
j=j+1;
}
else if(elt(i)
您是否可以假设这两个集合都是以任何顺序提供的(尽管您的示例中的第二个集合不是)?什么是“暴力”?你是说O(n^2)搜索吗?你需要描述一下你“想象”到了什么@FDavidov我稍微改变了这个问题。您可以假设这两个集合都是按升序排列的