數據結構05數組和廣義表

第五章 數組 和 廣義表

數組廣義表可以看成是線性表在下述含義上的擴展:表中的數據元素本身也是一個數據結構。

?

5.1 數組的定義

n維數組中每個元素都受著n個關系的約束,每個元素都有一個直接后繼元素。

可以把二維數組看成是這樣一個定長線性表:它的每個數據元素也是一個定長線性表。

數組一旦定義,它的維數和維界就不再改變。因此,除了結構的初始化銷毀之外,數組只能有存取元素修改元素值的操作。

?

5.2 數組的順序表示和實現

次序約定:

1、列序為主序 column major order ?FORTRAN

2、行序為主序 row major order ????C

?

假設每個數據元素占L個存儲單元,則二維數組A中的任一元素aij的存儲位置可由下式確定:

LOC(i,j) = LOC(0,0) + (b2?* i + j)*L

LOC(i,j)是存儲位置 ?LOC(0,0)稱為基地址或基址

?

n維數組定位公式

Array[b1][b2]...[bn]

LOC(j1,j2,...,jn) = LOC(0,0,...,0) + (jn?+jn-1*bn+jn-2*bn-1*bn?+ ... +j2*b3*...*bn?+j1*b2*...*bn)*L

?

數組元素的存儲位置是其下標的線性函數。

由于計算各個元素存儲位置的時間相等,所以存取數組中任一元素的時間也相等,稱具有這一特點的存儲結構為隨機存儲結構。

? ??

5.3 矩陣的壓縮

如何存儲矩陣的元,使矩陣的各種運算能有效的進行。

二維數組可以存儲矩陣的元。

有的程序設計語言中還提供了各種矩陣運算。

?

壓縮存儲:為多個值相同的元只分配一個存儲空間;對零元不分配空間。

應用壓縮的兩種情況:

1、特殊矩陣:值相同的元素或者零元素在矩陣中的分布有一定規律;

2、稀疏矩陣

?

對稱矩陣:aij= aji ?1 <= i,j <= n 稱為n階對稱矩陣

可以為每一對對稱元分配一個存儲空間,即將n2個元壓縮存儲到n(n+1)/2個元空間中

以行序為主序,存儲其下三角。

以一維數組sa[n(n+1)/2]作為n階對稱矩陣A的存儲結構,則sa[k]和矩陣元aij之間存在一一對應的關系:

K =?

i(i - 1)/2 - 1 + j ?當i>=j

j(j - 1)/2 - 1 + i ?當i < j ?//下標誰大誰除2,一維大是下三角內容,二維大是上三角內容

以上存法同樣適用于三角矩陣。

?

三角矩陣:上/下三角中的元均為常數c或0的n階矩陣(不含對角線)。

除了和對稱矩陣一樣,只存儲其上/下三角中的元之外,再加一個存儲常數c的存儲空間即可。

對角矩陣:所有非零元集中在以主對角線為中心的帶狀區域中。即除了主對角線上和直接在對角線上、下方若干條對角線上的元之外,所有其他的元皆為零。

?

以上特殊矩陣,非零元的分布都有一個明顯的規律,從而可以將其壓縮存儲到一維數組中,并找到每個非零元在一維數組中的對應關系。

?

稀疏矩陣:非零元較零元少,而且分布沒有一定規律。

稀疏因子:矩陣中非零元個數與全部個數之比。

通常認為稀疏因子小于等于0.05時稱為稀疏矩陣。

按照壓縮存儲的概念,只存儲稀疏矩陣的非零元。

稀疏矩陣可由表示非零元的三元組?及其行列數唯一確定。

?

三種數據結構:三元組順序表、行邏輯鏈接的順序表、十字鏈表

1、三元組順序表:以行序為主序順序排列。

轉置算法:

1、將矩陣的行列值相互交換;

2、將每個三元組中的i和j相互調換;

3、重排三元組之間的次序;

方法一:找到原矩陣的列序來進行轉置。為了找到M的每一列中所有的非零元素,需要對其三元組表從第一行起整個掃描一遍。O(列數*非零元數)

方法二:先求出原矩陣每一列中非零元的個數,進而求得每一列第一個非零元在轉置矩陣中應有的位置。 O(列數+ 非零元數)

三元組順序表,又稱為有序的雙下標法。

特點:非零元在表中按行序有序存儲,便于進行依行順序處理的矩陣運算。

若需按行號存取某一行的非零元,則需從頭開始進行查找。

2、行邏輯鏈接的順序表

在三元組順序表的基礎上,加入指示各行第一個非零元的順序表。

3、十字鏈表

可以按任意順序輸入非零元素。

鏈式存儲結構,每個非零元用一個含5個域的結點表示,其中i、j、e分別表示該非零元所在的行、列和非零元的值,向右域right鏈接同一行中下一個非零元,向下域down鏈接同一列中下一個非零元。

同一行的非零元通過right域鏈接成一個線性鏈表,

同一列的非零元通過down域鏈接成一個線性鏈表,

每個非零元即是某個行鏈表中的一個結點,又是某個列鏈表中的一個結點整個矩陣構成一個十字交叉的鏈表。

用兩個分別存儲行鏈表的頭指針和列鏈表的頭指針的一維數組表示十字鏈表。

?

矩陣加法:4種情況:

(1)aij+?bij?

(2)aij??插入元素

(3)bij???插入元素

(4)aij+?bij = 0 刪除元素

?

從一個結點看,進行比較、修改指針所需的時間是一個常數;

整個運算過程是對A和B的十字鏈表逐行掃描,其循環次數主要取決于A和B矩陣中非零元素的個數ta和tb,由此算法時間復雜度為O(ta + tb)。

?

5.4廣義表

廣義表是線性表的推廣,列表 lists

廣泛地用于人工智能等領域的表處理語言LISP語言,把廣義表作為基本的數據結構,就連程序也表示為一系列的廣義表。

廣義表一般記作

LS = (a1,a2,...,an?)

LS是廣義表的名稱,n是它的長度。

廣義表中的元素可以是單個元素,也可以是廣義表,分別稱為廣義表的原子子表

廣義表的定義是一個遞歸的定義。

當廣義表非空時,稱第一個元素為LS的表頭(Head),其余元素組成的表是LS的表尾(Tail)

任何非空列表其表頭可能是原子,也可能是列表,但其表尾必定為列表。

?

5.5 廣義表的存儲結構

由于廣義表的數據元素可以是原子,也可以是列表,因此難以用順序存儲結構表示,通常采用鏈式存儲結構,每個數據元素可用一個結點表示。

?

需要兩種結構的結點:

一種是表結點,用以表示列表;

標志域 + 表頭指針域 + 表尾指針域

一種是原子結點,用以表示結點。

標志域 + 值域

兩種方式:

?

enum ElemTag {ATOM,LIST};
typedef struct GLNode
{elemTag tag;union{AtomType atom;struct{GLNode *hp, *tp;}ptr;};
}*GList;

?

?

enum ElemTag {ATOM,LIST};
typedef struct GLNode1
{elemTag tag;union{AtomType atom;GLNode1 *hp;};GLNode1 *tp;
}*GList;

?


?

?

第一種結構:一個列表由表頭和表尾組成,表頭是一個表,表尾是另一個表。

第一種結構不直觀,建議采用第二種結構!

第二種結構:一個列表由表頭和表尾組成,表頭是原子或列表,表尾是原子或列表。

?

5.7 廣義表的遞歸算法

在對問題進行分解、求解過程中得到的是和原問題性質相同的子問題。

分治法(Divide and Conquer)進行遞歸算法的設計。

遞歸定義由基本項歸納項兩部分組成。

基本項:描述一個或幾個遞歸過程的終結狀態。

歸納項:描述了如何實現從當前狀態到終結狀態的變化。

?

在設計遞歸函數時

(1)首先應書寫函數的首部和規格說明,嚴格定義函數的功能和接口;

(2)對函數中的每一個遞歸調用都看成是一個簡單的操作,只要接口一致,必能實現規格說明中定義的功能,切忌想的太深太遠。

?

?

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

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

相關文章

k8s的ingress使用

ingress 可以配置一個入口來提供k8s上service從外部來訪問的url、負載平衡流量、終止SSL和提供基于名稱的虛擬主機。 配置ingress的yaml&#xff1a; 要求域名解析無誤 要求service對應的pod正常 一、test1.domain.com --> service1:8080 apiVersion: extensions/v1beta1…

JDK1.8中如何用ScriptEngine動態執行JS

JDK1.8中如何用ScriptEngine動態執行JS jdk1.6開始就提供了動態腳本語言諸如JavaScript動態的支持。這無疑是一個很好的功能&#xff0c;畢竟Java的語法不是適合成為動態語言。而JDK通過執行JavaScript腳本可以彌補這一不足。這也符合“Java虛擬機不僅僅是Java一種語言的虛擬機…

數據結構06樹和二叉樹

第六章 樹和二叉樹 6.1 樹的定義和基本術語 樹 Tree 是n個結點的有限集。 任意一棵非空樹中&#xff1a; &#xff08;1&#xff09;有且僅有一個特定的稱為根&#xff08;root&#xff09;的結點&#xff1b; &#xff08;2&#xff09;當n>1時&#xff0c;其余結點可…

2019.03.20 mvt,Django分頁

MVT模式 MVT各部分的功能: M全拼為Model&#xff0c;與MVC中的M功能相同&#xff0c;負責和數據庫交互&#xff0c;進行數據處理。 V全拼為View&#xff0c;與MVC中的C功能相同&#xff0c;接收請求&#xff0c;進行業務處理&#xff0c;返回響應。 T全拼為Tem…

CountDownLatch,CyclicBarrier和Semaphore

在java 1.5中&#xff0c;提供了一些非常有用的輔助類來幫助我們進行并發編程&#xff0c;比如CountDownLatch&#xff0c;CyclicBarrier和Semaphore&#xff0c;今天我們就來學習一下這三個輔助類的用法。以下是本文目錄大綱&#xff1a;一.CountDownLatch用法二.CyclicBarrie…

數據結構07排序

第十章內部排序 10.1 概述 排序就是把一組數據按關鍵字的大小有規律地排列。經過排序的數據更易于查找。 排序前KiKj&#xff0c;且Ki在前: 排序方法是穩定的&#xff0c;若排序后Ki在前&#xff1b; 排序方法是不穩定的&#xff0c;如排序后Kj在前。 分類&#xff1a; 內…

數據結構08查找

第九章 查找 另一種在實際應用中大量使用的數據結構--查找表。 所謂查找&#xff0c;即為在一個含有眾多的數據元素的查找表中找出某個“特定的”數據元素。 查找表 search table 是由同一類型的數據元素構成的集合。集合中的數據元素之間存在著完全松散的關系&#xff0c;故…

下載Centos7 64位鏡像

下載Centos7 64位鏡像 1.打開Centos官網 打開Centos官方網站地址&#xff1a;https://www.centos.org/&#xff0c;點擊Get CentOS Now 2.點擊Minimal ISO鏡像 Minimal ISO鏡像&#xff0c;與DVD ISO鏡像的差別有很多&#xff0c;這里只說兩點 1.Minimal ISO類似于Windows的純凈…

[Objective-C語言教程]結構體(17)

Objective-C數組可定義包含多個相同類型的數據項的變量類型&#xff0c;但結構體是Objective-C編程中的另一個用戶定義數據類型&#xff0c;它可組合不同類型的數據項。 結構體用于表示記錄&#xff0c;假設要圖書館中跟蹤書籍信息。可能希望跟蹤每本書的以下屬性 - 標題作者學…

Scala01入門

第1章 可伸展的語言 Scala應用范圍廣&#xff0c;從編寫腳本&#xff0c;到建立大型系統。 運行在標準Java平臺上&#xff0c;與Java庫無縫交互。 更能發揮力量的地方&#xff1a;建立大型系統或可重用控件的架構。 將面向對象和函數式編程加入到靜態類型語言。 在Scala中&a…

架構師之路17年精選80篇

【架構必備】 《互聯網架構如何實現“高并發”》4W 《TCP接入層的負載均衡、高可用、擴展性架構設計》2.2W 《配置中心架構設計演進》1.7W 《跨公網調用的大坑與架構優化》1.4W 《DNS在架構設計中的巧用》1.9W 《消息如何在網絡上安全傳輸》1.2W 《10W定時任務&#xff0c;如何…

iphone手機型號獲取

#import <sys/utsname.h> //手機型號 NSString *device [self iphoneType]; (NSString *)iphoneType { struct utsname systemInfo; uname(&systemInfo); NSString *platform [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if…

Java網絡01基本網絡概念

協議 Protocol&#xff1a;明確規則 &#xff08;1&#xff09;地址格式&#xff1b; &#xff08;2&#xff09;數據如何分包&#xff1b; ... TCP/IP四層模型&#xff1a; 應用層 HTTP SMTP POP IMAP 傳輸層 TCP UDP 網際層 IP 主機網絡層 host to host layer 數模、…

apache的產品分類說明

分類 項目名 說明 開發語言 服務器&#xff08;共20&#xff09; Apache HTTP Server全球第一HTTP服務器C/CTomcatJava的Web服務器JavaJames郵件服務器JavaSpamAssassin反垃圾郵件C/CPerlApache的Perl編程語言支持C/CTclTCL腳本語言C/CDirectory Server超級目錄服務器JavaAxisW…

Java網絡02基本Web概念

URI Uniform Resource Identifier 同一資源標識符 以特定語法標識一個資源的字符串 絕對URI&#xff1a;URI模式模式特有部分 scheme:scheme-specific-part scheme分為&#xff1a; data file本地文件系統 ftp http telnet urn 統一資源名 scheme-specific-part為&am…

解決自建ca認證后瀏覽器警告

前一篇講解了基本的建立證書的過程&#xff0c;但是建立后總是會在瀏覽器那里警告&#xff1a; 此鏈接不是私密鏈接 --谷歌瀏覽器 此證書頒發機構不可信 此證書不是這個網站的 --ie瀏覽器 總之證書是生成成功了&#xff0c;但是其中的內容填寫錯誤了&a…

設計模式學習(三)——單例模式

在Java開發過程中&#xff0c;很多場景下都會碰到或要用到單例模式&#xff0c;在設計模式里也是經常作為指導學習的熱門模式之一&#xff0c;相信每位開發童鞋都用到過。我們總是沿著前輩的足跡去做設定好的思路&#xff0c;往往沒去探究為何這么做&#xff0c;所以這篇文章對…

Java網絡03流

網絡程序所做的很大一部分工作只是輸入和輸出&#xff1a;從一個系統向另一個系統移動數據。 輸出流 Java的基本輸出流類是java.io.OutputStream: public abstract class OutputStream 這個類提供了寫入數據所需的基本方法&#xff0c;包括&#xff1a; public abstract vo…

基于微信小程序開發的仿微信demo

(本文參考自github/liujians,地址:https://github.com/liujians/weApp) 作者聲明&#xff1a; 基于微信小程序開發的仿微信demo 整合了ionic的樣式庫和weui的樣式庫 使用請查看使用必讀! 更新日志請點擊這里 目前功能 查看消息 網絡請求獲取數據&#xff08;download示例server…

設計模式之六大原則

設計模式之設計原則 這軟件設計過程中&#xff0c;有六大設計原則&#xff1a; 單一職責原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則開閉原則由于軟件開發過程中&#xff0c;根據業務不同等因素形成了各種復雜的而不可預料的需求&#xff0c;遵守原則&#xff0c;讓項…