十字链表
~~~~????有需求才有供應(yīng),很多東西,都是為了解決實(shí)際問題才出現(xiàn)的,項(xiàng)目中出現(xiàn)了很多稀疏矩陣,而且需要對(duì)他們進(jìn)行運(yùn)算,而十字鏈表就是為了解決稀疏矩陣而出現(xiàn)的一種數(shù)據(jù)結(jié)構(gòu)。
稀疏矩陣
~~~~????稀疏矩陣(英語:sparse matrix),在數(shù)值分析中,是其元素大部分為零的矩陣。反之,如果大部分元素都非零,則這個(gè)矩陣是稠密的,通常這個(gè)系數(shù)被認(rèn)為是5%。在科學(xué)與工程領(lǐng)域中求解線性模型時(shí)經(jīng)常出現(xiàn)大型的稀疏矩陣。
~~~~????在使用計(jì)算機(jī)存儲(chǔ)和操作稀疏矩陣時(shí),經(jīng)常需要修改標(biāo)準(zhǔn)算法以利用矩陣的稀疏結(jié)構(gòu)。由于其自身的稀疏特性,通過壓縮可以大大節(jié)省稀疏矩陣的內(nèi)存代價(jià)。更為重要的是,由于過大的尺寸,標(biāo)準(zhǔn)的算法經(jīng)常無法操作這些稀疏矩陣。
三元組
~~~~????對(duì)于矩陣,我們第一想法就是使用二維數(shù)組來存儲(chǔ),但是稀疏矩陣的元素大部分都是零,而且稀疏矩陣的尺寸一般都比較大,這個(gè)時(shí)候我們?nèi)绻苯邮褂枚S數(shù)組,會(huì)浪費(fèi)很多的空間,所有通常我們需要對(duì)稀疏矩陣進(jìn)行壓縮,三元組就是一種稀疏矩陣壓縮保存的方法。
~~~~????三元組是指形如((x,y),z)((x,y),z)((x,y),z)的集合(這就是說,三元組是這樣的偶,其第一個(gè)射影亦是一個(gè)偶),常簡(jiǎn)記為(x,y,z)(x,y,z)(x,y,z)。
~~~~????三元組是計(jì)算機(jī)專業(yè)的一門公共基礎(chǔ)課程——數(shù)據(jù)結(jié)構(gòu)里的概念。主要是用來存儲(chǔ)稀疏矩陣的一種壓縮方式,也叫三元組表。
~~~~????三元組有不同的實(shí)現(xiàn)方法,假設(shè)以順序表存儲(chǔ)結(jié)構(gòu)來表示三元組,稱為三元組順序表。
結(jié)構(gòu)如下
~~~~????注意,data域中表示非零元的三元組是以行序?yàn)橹餍蝽樞蚺帕械?#xff0c;如果不排序,你會(huì)發(fā)現(xiàn)你操作和訪問數(shù)據(jù)時(shí),時(shí)間基本都花在查詢數(shù)據(jù)上了。對(duì)于三元組,我們可以進(jìn)行一些運(yùn)算,都是很容易實(shí)現(xiàn)的,比如轉(zhuǎn)置,相加,相減。
~~~~????三元組相比十字鏈表的缺點(diǎn)(暫時(shí)只能想到這些)
- 1、增加或減少矩陣中的非零元素,都需要進(jìn)行數(shù)據(jù)的移動(dòng)
- 2、大小固定,非零數(shù)據(jù)很少時(shí),會(huì)浪費(fèi)很多的空間,過多時(shí)無法保存
- 3、查找元素比較慢(時(shí)間復(fù)雜度)
- 4、矩陣的運(yùn)算數(shù)據(jù)較慢(時(shí)間復(fù)雜度)
十字鏈表
~~~~????十字鏈表(英語:Orthogonal linked list)是計(jì)算機(jī)科學(xué)中的一種高級(jí)數(shù)據(jù)結(jié)構(gòu),在Linux內(nèi)核中應(yīng)用廣泛。具體說,一個(gè)二維十字鏈表是鏈表的元素同時(shí)鏈接左右水平鄰結(jié)點(diǎn)與上下垂直鄰結(jié)點(diǎn)。
~~~~????當(dāng)稀疏矩陣的非零元個(gè)數(shù)和位置在操作過程中變化較大時(shí),就不宜使用順序表存儲(chǔ)結(jié)構(gòu)的三元組來保存稀疏矩陣;這個(gè)時(shí)候我們采用的時(shí)十字鏈表。
十字鏈表節(jié)點(diǎn)結(jié)構(gòu)
~~~~????每一個(gè)非零元可用一個(gè)含5個(gè)域的節(jié)點(diǎn)表示,其中i,j和e這3個(gè)域分別表示該非零元所在的行、列和非零元的值,向右域right用以鏈接同一行中下一個(gè)非零元,向下域down用來鏈接同一列下一個(gè)非零元,同一行的非零元通過right鏈接形成一個(gè)線性鏈表,同一列的非零元通過down鏈接形成一個(gè)線性表,每個(gè)非零元既是某個(gè)行鏈表中的節(jié)點(diǎn),也是某一個(gè)列鏈表中的節(jié)點(diǎn),整個(gè)矩陣構(gòu)成了一個(gè)十字交叉的鏈表,而樣的鏈表存儲(chǔ)結(jié)構(gòu)稱為十字鏈表。
附上十字鏈表實(shí)現(xiàn)(百度抄的)
總結(jié)
- 上一篇: python中numpy模块的aroun
- 下一篇: 视觉SLAM十四讲第三讲