線性表表示集合

集合我們高中都學過吧?

最重要的幾個特點:元素不能重復、各個元素之間沒有關系、沒有順序

集合內的元素可以是單元素或者是集合。

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

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

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

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

下面我們來實現一下:

我們定義一個節點:

typedef int ElemType;
typedef struct SetNode{//節點定義ElemType data;//數據struct SetNode * link;
}*LinkedSet//集合定義

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

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

?

我們說兩個集合的操作:

求兩個集合的并:

兩個鏈表,都是升序。把他們去重合并即可。

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

我就再寫一遍吧。

void UnionSet(LinkedSet & A,LinkedSet & B,LinkedSet & C)
{SetNode *pa=A->link,*pb=B->link,*pc=C;while(pa && pb)//都不為空{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;//只執行一個while(p)//依次復制{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)//都不為空{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;
}

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

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

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

如果AB相同,都向后移。

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

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

?

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445572.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

家用無線路由器購買入門指南

視頻一&#xff1a;「白問」普通大眾 買路由器關注這幾個點就夠了 來源 例如商品名&#xff1a;AC 1200M 雙頻 AX前綴wifi6IEEE 802.11 AX AC前綴wifi5IEEE 802.11 AC AX比AC好 1200M 理論峰值 和網速無關 商家噱頭 MIMO SU-MIMO 單用戶多進多出&#xff08;早期&#xff…

ubuntu linux下執行.sh文件

ubuntu linux下執行.sh文件 首先&#xff0c;要確保這個文件的類型是可執行的。 有兩種辦法把文件設置為可執行文件。 1) 直接在文件屬性標簽中選中 "可執行"&#xff0c;--b 如果用的是圖形界面&#xff0c;這個方法最簡單直接。 2) 使用命令 chmod x file.sh。將可…

鏈表相交問題

本來想自己寫&#xff0c;寫了一半發現一篇文章&#xff0c;解釋寫得簡單易懂&#xff0c;我就直接拿過來了。 這個問題值得反復地寫&#xff0c;鍛煉鏈表coding能力的好題。 //如果兩個鏈表都不帶環 int NotCycleCheckCross(pLinkNode head1,pLinkNode head2) {pLinkNode lis…

用JS寫了一個模擬串行加法器

在重溫《編碼&#xff1a;隱匿在計算機軟硬件背后的語言》第12章——二進制加法器時&#xff0c;心血來潮用JS寫了一個模擬串行加法器。 測試斷言工具TestUtils.js function assertTrue(actual){if(!actual)throw "Error actual: " actual " is not true.&q…

Android學習路線總結

title: Android學習路線總結&#xff0c;絕對干貨 tags: Android學習路線,Android學習資料,怎么學習android grammar_cjkRuby: true --- 一、前言 不知不覺自己已經做了幾年開發了&#xff0c;由記得剛出來工作的時候感覺自己能牛X&#xff0c;現在回想起來感覺好無知。懂的越…

雙棧

利用棧底位置相對不變的特性&#xff0c;可以讓兩個順序棧共享一個空間。 具體實現方法大概有兩種&#xff1a; 一種是奇偶棧&#xff0c;就是所有下標為奇數的是一個棧&#xff0c;偶數是另一個棧。但是這樣一個棧的最大存儲就確定了&#xff0c;并沒有起到互補空缺的作用&a…

Error when loading the SDK:解決方案

錯誤情況&#xff1a; 當打開eclipse時出現如下窗口&#xff08;內容如下&#xff09; Error when loading the SDK: Error: Error parsing \Android\adt-bundle-windows-x86_64-20140702\sdk\system-images\android-22\android-wear\armeabi-v7a\devices.xml cvc-complex-type…

單調隊列優化的背包問題

對于背包問題&#xff0c;經典的背包九講已經講的很明白了&#xff0c;本來就不打算寫這方面問題了。 但是吧。 我發現&#xff0c;那個最出名的九講竟然沒寫隊列優化的背包。。。。 那我必須寫一下咯嘿嘿&#xff0c;這么好的思想。 我們回顧一下背包問題吧。 01背包問題 …

用Python去除掃描型PDF中的水印

內容概述 含水印掃描型PDF文件&#xff0c;其中某頁如下圖所示&#xff0c;用Python去除其頁頂及頁底的水印。 處理思路&#xff1a;PDF中的每一頁的水印的相對位置基本相同&#xff0c;將PDF每一頁輸出成圖片&#xff0c;然后進行圖片編輯&#xff0c;用白色填充方形覆蓋水印…

鏈表實現棧

棧&#xff0c;是操作受限的線性表&#xff0c;只能在一端進行插入刪除。 其實就是帶尾指針的鏈表&#xff0c;尾插 #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define Status int #define SElemType int //只在頭部進行插入和刪除(…

二階有源濾波器

濾波器是一種使用信號通過而同時抑制無用頻率信號的電子裝置, 在信息處理、數據傳送和抑制干擾等自動控制、通信及其它電子系統中應用廣泛。濾波一般可分為有源濾波和無源濾波, 有源濾波可以使幅頻特性比較陡峭, 而無源濾波設計簡單易行, 但幅頻特性不如濾波器, 而且體積較大。…

用JS寫了一個30分鐘倒計時器

效果圖 額外功能 左鍵單擊計時器數字區&#xff0c;不顯示或顯示秒鐘區。左鍵雙擊計時器數字區&#xff0c;暫停或啟動計時器。計時完畢&#xff0c;只能刷新頁面啟動計時器。輸入框可輸入備注信息&#xff0c;輸入框失去焦點或計時完畢后&#xff0c;時間戳附帶備注信息會存入…

為什么高手離不了Linux系統?我想這就是理由!

通過本文來記錄下我在Linux系統的學習經歷&#xff0c;聊聊我為什么離不了Linux系統&#xff0c;同時也為那些想要嘗試Linux而又有所顧忌的用戶答疑解惑&#xff0c;下面將為你介紹我所喜歡的Linux系統&#xff0c;這里有一些你應該知道并為之自豪的事實。 這里你應該首先拋開W…

python學習實例(1)

# #1.2 計算機編程的基本概念 ## #1.2.2 從Python語言進入計算機語言的世界 ##<程序&#xff1a;例子1> def F(x,y):return(x*xy*y) print("F(2,2)",F(2,2)) print("F(3,2)",F(3,2))#<程序&#xff1a;例子2> def Pr():for i in range(0,10)…

用JS寫一個電影《黑客帝國》顯示屏黑底綠字雨風格的唐詩欣賞器

效果圖 放碼過來 <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html;charsetutf-8"/><title>Black Screen And Green Characters</title><style type"text/css">table…

python學習實例(2)

# #2.2 不同進制間的轉換 ## #2.2.1. 二進制數轉換為十進制數 ##<程序&#xff1a;2-to-10進制轉換> binput("Please enter a binary number:") d0; for i in range(0,len(b)):if b[i] 1:weight 2**(len(b)-i-1)d dweight; print(d)#<程序&#xff1a;改…

元器件封裝大全:圖解+文字詳述

先圖解如下&#xff1a; 元器件封裝類型&#xff1a; A.Axial  軸狀的封裝&#xff08;電阻的封裝&#xff09;AGP &#xff08;Accelerate raphical Port&#xff09; 加速圖形接口 AMR(Audio/MODEM Riser) 聲音/調制解調器插卡BBGA&#xff08;Ball Grid Array&#xff09;…

python學習實例(3)

# #3.4 關于Python的函數調用 ## #3.4.2 Python函數入門 ##<程序&#xff1a;計算43*22> #函數f def f(x, y):return x*y*y#主函數部分 c4f(3, 2) print (c)# #3.4.3 局部變量(Local variables)與全局變量(Global variables) ##<程序&#xff1a;打印局部變量a和全局…

用JS寫一個丐版《2048》小游戲

效果圖 放馬過來 <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html;charsetutf-8"/><title>2048</title><style type"text/css">.basic{height:80px;width:80px;back…

如何有效申請TI的免費樣片

轉自如何有效申請TI的免費樣片 TI公司愿意為支持中國大學的師生們的教學、實驗、創新實踐、競賽和科研項目&#xff0c;提供有限數量的免費樣片。首先需要指出的是&#xff1a;所有的樣片申請應該是誠實正當的&#xff0c;所有不恰當的申請&#xff08;包括不必要或多余的&…