多重表(廣義表)

在深入淺出數據結構系列前面的文章中,我們一直在討論“線性表”,其形式如下:

由a1,a2,a3,……a(n-1)個元素組成的序列,其中每一個元素ai(0<i<n)都是一個“原子”,“原子”的意思就是說元素本身是一個個體,所有元素都是相同的結構。

但是在我們常見的某些應用,比如Excel的表格中,我們發現表并不一定是線性表,Excel中的表就明顯是二維的結構

image

那么在數據結構中,我們會使用這種廣義上的表嗎?答案是會,我們也會、或者說我們也能使用這樣的非線性表。其實我們早就已經在使用這樣的非線性表、廣義表了,那就是多維數組。不難發現二維數組就可以抽象成Excel當中的表的樣子。那么,廣義表的定義是怎樣的呢?其實很簡單,就是在線性表的基礎上稍加修改,我會用綠色將修改了的部分標識出來:

由a1,a2,a3,……a(n-1)個元素組成的序列,其中每一個元素ai(0<i<n)可能又是一個廣義表。

可能會有人發現一個小小的問題,就是為什么我又將廣義表叫作多重表呢?這其實只是一個理解角度的不同而帶來的不同叫法罷了,多重表這種叫法想表達的主要意思是表中的元素可以是另一個表,而這另一個表中的元素又可以是一個表,相當于“一重又一重”的表,所以叫多重表。這個叫法其實并不是很重要。

講到這兒,多重表的定義和可能的使用場景(想想多維數組可能使用的情況)想必大家都心里有數了,但是這篇博文肯定不能就這么結束了? 其實我們今天真正想討論的,是當多維數組不能滿足或者說不適合我們遇到的情況時,我們該如何用其他途徑實現一個多重表?

為了說明這一點,顯然我們需要先舉一個多維數組不適合、卻又需要使用多重表的例子:

假設我們的程序要存儲一所大學的學生選課情況,然后允許用戶執行兩個操作,一個是查詢某名學生選了哪些課程,另一個是查詢某個課程有哪些學生選擇了。對于這樣的應用場景,顯然需要使用到一個多重表,準確的說是一個二維的多重表,其中一維表示課程,另一維表示學生,就像下面的圖。那么提到二維的多重表,我們腦海中最先浮現的應該就是二維數組了?

image

(存儲學生選課的抽象的二維多重表,橫向代表學生A,B,C……縱向代表課程1,2,3……,若某一項打勾則表示該學生選了該課程,比如若A1打勾則表示學生A選擇了課程1)

但是,現在情況有了新條件,這一所大學我們知道三個信息:學生人數大約為5000人,學校所有開設的課程大約有1000門,一般來說一個學生選的課程也就10門。

  那么,根據這三個信息我們會發現,如果我們使用二維數組來存儲學生選課的信息,總共將需要500萬個元素,而平均來說其中只有5萬個元素是“打勾”的,其它495萬個元素都是“空”的,這樣的浪費顯然是巨大的!

  所以我們現在需要的就是一個“不那么浪費空間”的二維多重表。回顧我們學習線性表的歷史,我們會發現,為了避免使用一維數組帶來的巨大浪費,我們使用了一維的鏈表來替代,那么現在我們在二維數組上遇到了麻煩,是否可以用“二維鏈表”來替代呢?或者換句話說,是否有用鏈表實現的多重表呢?答案是肯定的,實現也是簡單的。其實就是令每個課程作為一個鏈表的表頭,每個學生作為一個鏈表的表頭,除去學生結點和課程結點,其他結點均有一個nextStudent指針和一個nextCourse指針,分別指向下一個學生和下一門課程。我們用一張圖片來展示一下用鏈表實現多重表大致是“長什么樣”的:
  
  
image

不難看出,使用鏈表來實現需要的二維多重表能夠節省下很多的空間(495萬個結點),因為我們“跳過了”不需要的那些結點。那么現在,我們給出實現這個二維多重鏈表的各個結點定義:

struct node
{bool choose;struct node *hNextNode;struct node *vNextNode;struct student *student;struct course * course;
}struct student
{char name[SIZE];struct node *firstNode;
}struct course
{char name[SIZE];struct node *firstNode;
}

有了結點的定義,抽象圖,想來實現二維多重鏈表也不是什么難事了,所以對這個問題的討論就到此為止。

  

  稍微回顧一下本文討論的順序就不難發現,其實我們只是將“一維表中浪費空間的解決辦法”擴展到了“二維表中浪費空間的解決辦法”罷了,也可以說將“鏈表替代數組”擴展到了“二維鏈表替代二維數組”的情況,類似的我們還可以繼續擴展到更高的維度,比如上面的例子中,我們除了學生、課程,還可以有“某個學生在某門課程的歷次成績”,這樣一來就出現了第三維度。

轉載于:https://www.cnblogs.com/linhaostudy/p/11193231.html

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

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

相關文章

簡單教你React父子組件間平級組件間傳值

國慶充電特輯&#xff1a; 堵車堵死&#xff0c;廢話不多說直接上菜。 1.父組件對子組件傳值 利用props屬性傳值 class Component extends React.Component {constructor (props) {super(props);}render() {return (<div><h1>I am {this.props.name}</h1>…

Requests庫的主要方法:requests.request為requests.get和requests.post兩個的匯總,只是需要傳方法...

1. requests.request(method,url,**kwargs&#xff09; method&#xff1a;請求方式&#xff0c;對應get/put/post等七種&#xff1a;擬獲取頁面的url鏈接&#xff1a;控制訪問參數&#xff0c;共13個method&#xff1a;請求方式rrequests.request(GET,url,**kwargs) r reques…

jQuery插件開發教程

jQuery插件開發精品教程&#xff0c;讓你的jQuery提升一個臺階 要說jQuery 最成功的地方&#xff0c;我認為是它的可擴展性吸引了眾多開發者為其開發插件&#xff0c;從而建立起了一個生態系統。這好比大公司們爭相做平臺一樣&#xff0c;得平臺者得天下。蘋果&#xff0c;微軟…

Html Email 郵件html頁編寫指南

前言 寫過郵件的html的童學應該都知道&#xff0c;郵件的html一般都用table來布局&#xff0c;為什么呢&#xff1f;原因是大多數的郵件客戶端&#xff08;比如Outlook和Gmail&#xff09;&#xff0c;會過濾HTML設置&#xff0c;讓郵件面目全非。 經過多次的郵件編寫實踐及度…

vue父組件異步獲取動態數據傳遞給子組件獲取不到值

原理&#xff1a; 在父組件中使用axios獲取異步數據傳給子組件&#xff0c;但是發現子組件在渲染的時候并沒有數據&#xff0c;在created里面打印也是空的&#xff0c;結果發現一開始子組件綁定的數據是空的&#xff0c;在請求數據沒有返回數據時&#xff0c;子組件就已經加載了…

MAC 下配置JavaEE開發環境

1、安裝jdk&#xff0c;官網下載 路徑&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 選擇合適的版本下載即可。 2、配置Java環境變量 &#xff08;1&#xff09;commandspace 輸入termimal 打開終端 &#xff08;2&#xff09;在終端中輸…

微服務深入淺出(7)-- 網關路由Zuul

Zuul用于構建邊界服務&#xff0c;致力于動態路由&#xff0c;過濾&#xff0c;監控&#xff0c;彈性伸縮和安全等方向。 1、ZuulRibbonEureka結合&#xff0c;可以實現智能路由和負載均衡 2、網關將所有服務的API接口統一聚合統一暴露 3、網關統一爆率接口后&#xff0c;可以做…

判斷JavaScript對象為null或者屬性為空

首先說下null與undefined區別&#xff1a; 對已聲明但未初始化的和未聲明的變量執行typeof&#xff0c;都返回"undefined"。 null表示一個空對象指針&#xff0c;typeof操作會返回"object"。 一般不顯式的把變量的值設置為undefined&#xff0c;但null相…

font face如何導入自定義字體

首先&#xff0c;瀏覽器支持什么字體取決于用戶系統里安裝了什么字體&#xff0c;比如CSS中這么寫&#xff1a; font-family:"微軟雅黑","黑體","宋體"; 那么瀏覽器會嘗試按照從左到右的順序依次應用&#xff0c;假設用戶電腦上沒有安裝微軟雅黑…

Python中_,__,__xx__方法區別

_xx 單下劃線開頭 Python中沒有真正的私有屬性或方法,可以在你想聲明為私有的方法和屬性前加上單下劃線,以提示該屬性和方法不應在外部調用.如果真的調用了也不會出錯,但不符合規范. 方法就是以單下劃線開頭命名定義了&#xff0c;這種定義不會被*導入&#xff08;from module …

利用@media screen實現網頁布局的自適應

利用media screen實現網頁布局的自適應 優點:無需插件和手機主題,對移動設備友好,能夠適應各種窗口大小。只需在CSS中添加media screen屬性,根據瀏覽器寬度判斷并輸出不同的長寬值 1280分辨率以上&#xff08;大于1200px&#xff09; media screen and (min-width:1200px){#p…

C# webkit內核 網頁填表

比如我要操作的是下面的input 用到的方法是 調用如下&#xff1a; webkit.StringByEvaluatingJavaScriptFromString("document.getElementsByClassName(login_i_con_li_ipt name)[0].valueThis is a Demo."); 類似這種div在webkit中好像是無法通過常規方法模擬的 這時…

p字間距 html段落內文字設置字間距間隔

只對段落p內文字設置字間距&#xff0c;段落<p>是html段落標簽&#xff0c;以<p>開始&#xff0c;以</p>結束&#xff0c;通常文章分段使用p標簽&#xff0c;而有時小局部布局也可以使用p來布局。通過css設置其樣式實現排版目的。 這里針對p設置字間距&…

基本數據類型

上節回顧 1.循環打印數列1&#xff0c;3&#xff0c;5&#xff0c;.........&#xff0c;99 for i in range(100):if i%21:print (i) 2.turtle 庫 # penup 抬筆 # pendown 落筆 # pensize 畫筆大小 # pencolor 畫筆顏色## 畫筆運動函數 # fd 前進 # bk 后退 # goto 到達指定的坐…

修改系統默認 alert 彈框樣式

修改默認 alert 彈框&#xff0c;思路很簡單&#xff0c;定義一個 alert(e) 函數&#xff0c;加載最開頭即可。 css部分&#xff1a; <style>#msg{width:266px;position: fixed;z-index:999;top: 49%;margin-top:-80px;left:50%;margin-left:-133px;background:#fff;bo…

Code Review的重要性

這幾天一直在搞一家客戶的產品升級動作&#xff0c;數據的轉移已經完成大部分&#xff0c;因為升級主要的目標是處理性能問題&#xff0c;所以我針對性的對將要升級的版本進行了一些操作性能檢查&#xff0c;真是不做不知道&#xff0c;一做嚇一跳&#xff0c;有一個查詢選擇人…

Myeclipse快捷鍵總結大全

Myeclipse快捷鍵 Ctrl1 快速修復 CtrlD: 刪除當前行 CtrlQ 定位到最后編輯的地方 CtrlL 定位在某行 CtrlO 快速顯示 OutLine CtrlT 快速顯示當前類的繼承結構 CtrlW 關閉當前Editer CtrlK 快速定位到下一個 CtrlE 快速顯示當前Editer的下拉列表 CtrlJ 正向增量查找(按…

秋蟬鳴泣之時

奇怪的題目背景 所誤入的 是回憶的教室 所響起的 是通向絕望的計時器 所到達的 是開始的結束 你 能相信嗎? 題目背景 最近禮奈醬學會了線段樹和樹狀數組兩種數據結構 由于禮奈醬上課聽的很認真&#xff0c;所以她知道 樹狀數組常見的操作是 單點加區間求和 線段樹常見的操作是…

對淺拷貝與深拷貝的研究

淺拷貝只復制指向某個對象的指針&#xff0c;而不復制對象本身&#xff0c;新舊對象還是共享同一塊內存。 淺拷貝的實現方式 Object.assign()&#xff1a;需注意的是目標對象只有一層的時候&#xff0c;是深拷貝Array.prototype.concat()Array.prototype.slice()深拷貝就是在拷…

:nth-child(n)與:nth-of-type(n)為啥顯示不對呢

首先是二者的區別 :nth-child(n) 是選擇父元素的第n個子元素。 :nth-of-type(n) 是選擇父元素的第n個同類型的子元素 舉個例子&#xff1a; <div class"read"><h1>title</h1><p>paragraph1</p><p>paragraph2</p> <!…