您现在的位置是:主页 > news > 免费网站建站avcom/大庆网络推广
免费网站建站avcom/大庆网络推广
admin2025/4/28 15:51:51【news】
简介免费网站建站avcom,大庆网络推广,网站建设你的选择,做网编去网站还是工作室好一.集合求并集一般算法 1.思路分析: 有两个集合A和B,用线性表L1,L2表示,求他们的并集,一般我们都会想到的方法:用两个循环遍历两个线性表L1,L2中的元素,把L2中的元素与L1中的元素依次比较,如果L2中的元素不和L1中的元素相同,则把L2中这个元素存到L1的末尾,否则不存. 2.代码…
一.集合求并集一般算法
1.思路分析:
有两个集合A和B,用线性表L1,L2表示,求他们的并集,一般我们都会想到的方法:用两个循环遍历两个线性表L1,L2中的元素,把L2中的元素与L1中的元素依次比较,如果L2中的元素不和L1中的元素相同,则把L2中这个元素存到L1的末尾,否则不存.
2.代码实现
//集合求并集,这里使用顺序表表示集合
void Union(SqList *L1,SqList *L2)
{ for(elemType* p=L2->elem;p<(L2->elem+L2->length);++p) //遍历L2中的所有元素 { int rear=L1->length; //顺序表L1的末尾索引序号等于已存元素的数量 bool add=true; //是否添加的标记变量,初始为真 for(elemType* q=L1->elem;q<(L1->elem+L1->length);++q) //遍历L1中的所有元素{ if(*p==*q) //如果L2中遍历到的元素与L1中的某个元素相同 add=false; //则添加标记为假 } if(add) //如果添加标记为真 {L1->elem[rear]=*p; //把L2中遍历到这个的元素添加到L1的末尾 ++(L1->length); //L1的元素数量加1 } }
}
这是非常普通的算法,且时间复杂度过高,以下有一种快速求集合的算法,但是只适用于有序集合.
二.有序集合求并集快速算法
1.思路分析:
有两个有序递增集合A和B,用线性表L1,L2表示,求他们的并集.我们先创建一个新的线性表L3,用来存储并集.初始我们用两个指针分别指向线性表L1,L2的头部,对他们的元素都只遍历1次,没错,只从头到尾遍历一次.在遍历的过程中,对两个指针所指向的元素进行比较,哪个指针指向的元素更小,就把这个元素存入L3中,然后指针下移.而另一个指针不能动.假如相等,就取其中一个元素存入L3中,两个指针同时下移.直到有一个线性表被遍历完,然后把另一个线性表剩下的元素依次存入L3中.
2.代码实现
//有序集合求并集(递增集合),这里使用顺序表表示集合
void MergeList(SqList *L1,SqList *L2,SqList *L3)
{elemType *p=L1->elem; //指向L1的指针 elemType *q=L2->elem; //指向L2的指针elemType *r=L3->elem; //指向L3的指针for(L3->length=0;p<(L1->elem+L1->length)&&q<(L2->elem+L2->length);L3->length++){ if(*p==*q) //两指针所指元素相等情况 {r[L3->length]=*(p++); //这里相等的情况我们都取L1的元素,且指针下移,当然也可以取L2中的元素,因为是一样的,没什么影响 q++; //指向L2的指针也下移 }else //两指针所指元素不相等情况r[L3->length]=(*p)<(*q)?*(p++):*(q++); //取两指针指向的更大的那个元素,并且那个指针下移 }while(p<(L1->elem+L1->length)) //如果是L1中的元素有剩余没有被遍历到 {r[L3->length++]=*(p++); //剩余元素通过循环依次加入到L3的末尾 } while(q<(L2->elem+L2->length)) //如果是L2中的元素有剩余没有被遍历到{r[L3->length++]=*(q++); //剩余元素通过循环依次加入到L3的末尾 }
} //注意:上面两个while语句只有其中一个会被执行
这里可能有人又有疑问了,要是我的集合是递减的怎么办?那原理还是不变,我们就把比较两指针指向的更小元素存入线性表L3改成更大元素存入线性表L3就行了.
三.总结
一般算法虽然效率低但是不管集合是否有序,都能使用,快速算法虽然效率高,但是只能适用于有序集合,所以我们要根据情况来选择算法.