日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线性表表示集合

發(fā)布時間:2023/12/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性表表示集合 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

集合我們高中都學(xué)過吧?

最重要的幾個特點:元素不能重復(fù)、各個元素之間沒有關(guān)系、沒有順序

集合內(nèi)的元素可以是單元素或者是集合。

對集合的操作:交集并集差集等,還有對自身的加減等。

需要頻繁的加減元素,所以順序存儲效率較低,但是我們還是說一下是怎么實現(xiàn)的:

? ? 用01向量表示集合,因為現(xiàn)實中任何一個有窮集合都能對應(yīng)到一個0、1、2.....n這么一個序列中。所以可以對應(yīng)過來,每位的01代表這個元素存在與否即可。

鏈接存儲表示使用有序鏈表來實現(xiàn),雖然集合是無序的,但是我們的鏈表可以是有序的。可以按升序排列。而鏈表理論上可以無限增加,所以鏈表可以表示無限集。

下面我們來實現(xiàn)一下:

我們定義一個節(jié)點:

typedef int ElemType; typedef struct SetNode{//節(jié)點定義ElemType data;//數(shù)據(jù)struct SetNode * link; }*LinkedSet//集合定義

然后要實現(xiàn)那些操作了,首先想插入吧:我們對于一個新元素,查找集合中是否存在,存在就不插入,不存在就插入到查找失敗位置。

刪除也簡單,查找存在就刪除。

?

我們說兩個集合的操作:

求兩個集合的并:

兩個鏈表,都是升序。把他們?nèi)ブ睾喜⒓纯伞?/p>

其實和鏈表歸并的merge過程是一樣的,只是相等的時候插入一個,兩個指針都向后走就行了。

我就再寫一遍吧。

void UnionSet(LinkedSet & A,LinkedSet & B,LinkedSet & C) {SetNode *pa=A->link,*pb=B->link,*pc=C;while(pa && pb)//都不為空{(diào)if(pa->data==pb->data)//相等,插一次,兩邊向后{pc->link=new SetNode;pc->data=pa->data;pa=pa->link;pb=pb->link;}else if(pa->data<pb->data)//插小的,小的向后{pc->link=new SetNode;pc->data=pa->data;pa=pa->link;}else{pc->link=new SetNode;pc->data=pb->data;pb=pb->link;}pc=pc->link;//注意指針}if(pa)p=pa;//剩下的接上else p=pb;//只執(zhí)行一個while(p)//依次復(fù)制{pc->link=new SetNode;pc->data=p->data;pc=pc->link;p=p->link;}pc->link=NULL; }

求兩個集合的交,更簡單,還是這三種情況,誰小誰向后,相等才插入。

void UnionSet(LinkedSet & A,LinkedSet & B,LinkedSet & C) {SetNode *pa=A->link,*pb=B->link,*pc=C;while(pa && pb)//都不為空{(diào)if(pa->data==pb->data)//相等,插一次,兩邊向后{pc->link=new SetNode;pc->data=pa->data;pa=pa->link;pb=pb->link;pc=pc->link;//注意指針,就不是每次都向后了,只有插入才向后}else if(pa->data<pb->data)//小的向后{pa=pa->link;}else{pb=pb->link;}}pc->link=NULL; }

求兩個集合的差:高中可能沒學(xué)這個概念,其實就是A-B,就是B中的元素,A都不能有了。

運算你可以把B元素全過一遍,A中有就去掉,但是這樣時間復(fù)雜度太高了,我們需要O(A+B)而不是O(A*B)

因為有序,很好操作,還是兩個指針,

如果AB相同,都向后移。

或者,B小,B就向后移。

如果A小,說明B中不含這個元素,我們把它復(fù)制到結(jié)果鏈表里。

?

思想還行,實在懶得寫了,有時間再說吧。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的线性表表示集合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。