国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程!(第五部分、數(shù)組和廣義表詳解)三

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程?。ǖ谖宀糠?、數(shù)組和廣義表詳解)三。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?第五部分、數(shù)組和廣義表詳解

數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程?。ǖ谖宀糠?、數(shù)組和廣義表詳解)三,數(shù)據(jù)結(jié)構(gòu)(C語言版),數(shù)據(jù)結(jié)構(gòu),c語言,java

數(shù)組和廣義表,都用于存儲邏輯關(guān)系為“一對一”的數(shù)據(jù)。

數(shù)組存儲結(jié)構(gòu),99% 的編程語言都包含的存儲結(jié)構(gòu),用于存儲不可再分的單一數(shù)據(jù);而廣義表不同,它還可以存儲子廣義表。

本章重點從矩陣的角度討論二維數(shù)組的存儲,同時講解廣義表的存儲結(jié)構(gòu)以及有關(guān)其廣度和深度的算法實現(xiàn)。

五、行邏輯鏈接的順序表(壓縮存儲稀疏矩陣)詳解

前面學習了如何使用三元組順序表存儲稀疏矩陣,其實現(xiàn)過程就是將矩陣中各個非 0 元素的行標、列標和元素值以三元組的形式存儲到一維數(shù)組中。通過研究實現(xiàn)代碼你會發(fā)現(xiàn),三元組順序表每次提取指定元素都需要遍歷整個數(shù)組,運行效率很低。

本節(jié)將學習另一種存儲矩陣的方法——行邏輯鏈接的順序表。它可以看作是三元組順序表的升級版,即在三元組順序表的基礎(chǔ)上改善了提取數(shù)據(jù)的效率。

行邏輯鏈接的順序表和三元組順序表的實現(xiàn)過程類似,它們存儲矩陣的過程完全相同,都是將矩陣中非 0 元素的三元組(行標、列標和元素值)存儲在一維數(shù)組中。但為了提高提取數(shù)據(jù)的效率,前者在存儲矩陣時比后者多使用了一個數(shù)組,專門記錄矩陣中每行第一個非 0 元素在一維數(shù)組中的位置。

數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程?。ǖ谖宀糠?、數(shù)組和廣義表詳解)三,數(shù)據(jù)結(jié)構(gòu)(C語言版),數(shù)據(jù)結(jié)構(gòu),c語言,java

圖 1 稀疏矩陣示意圖

圖 1 是一個稀疏矩陣,當使用行邏輯鏈接的順序表對其進行壓縮存儲時,需要做以下兩個工作:

  1. 將矩陣中的非 0 元素采用三元組的形式存儲到一維數(shù)組 data 中,如圖 2 所示(和三元組順序表一樣):

    數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程!(第五部分、數(shù)組和廣義表詳解)三,數(shù)據(jù)結(jié)構(gòu)(C語言版),數(shù)據(jù)結(jié)構(gòu),c語言,java

    圖 2 三元組存儲稀疏矩陣

  2. 使用數(shù)組 rpos 記錄矩陣中每行第一個非 0 元素在一維數(shù)組中的存儲位置。如圖 3 所示:

    數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程?。ǖ谖宀糠帧?shù)組和廣義表詳解)三,數(shù)據(jù)結(jié)構(gòu)(C語言版),數(shù)據(jù)結(jié)構(gòu),c語言,java

    圖 3 存儲各行首個非 0 元素在數(shù)組中的位置

通過以上兩步操作,即實現(xiàn)了使用行邏輯鏈接的順序表存儲稀疏矩陣。

此時,如果想從行邏輯鏈接的順序表中提取元素,則可以借助 rpos 數(shù)組提高遍歷數(shù)組的效率。

例如,提取圖 1 稀疏矩陣中的元素 2 的過程如下:

  • 由 rpos 數(shù)組可知,第一行首個非 0 元素位于data[1],因此在遍歷此行時,可以直接從第 data[1] 的位置開始,一直遍歷到下一行首個非 0 元素所在的位置(data[3])之前;
  • 同樣遍歷第二行時,由 rpos 數(shù)組可知,此行首個非 0 元素位于 data[3],因此可以直接從第 data[3] 開始,一直遍歷到下一行首個非 0 元素所在的位置(data[4])之前;
  • 遍歷第三行時,由 rpos 數(shù)組可知,此行首個非 0 元素位于 data[4],由于這是矩陣的最后一行,因此一直遍歷到 rpos 數(shù)組結(jié)束即可(也就是 data[tu],tu 指的是矩陣非 0 元素的總個數(shù))。


以上操作的完整 C 語言實現(xiàn)代碼如下:

#include <stdio.h>

#define MAXSIZE 12500

#define MAXRC 100

#define ElemType int

typedef struct

{

????????int i,j;//行,列

????????ElemType e;//元素值

}Triple;

typedef struct

{

????????Triple data[MAXSIZE+1];

???????? int rpos[MAXRC+1];//每行第一個非零元素在data數(shù)組中的位置

???????? int mu,nu,tu;//行數(shù),列數(shù),元素個數(shù)

}RLSMatrix; /

/矩陣的輸出函數(shù)

void display(RLSMatrix M){

????????for(int i=1;i<=M.mu;i++){

????????????????for(int j=1;j<=M.nu;j++){

????????????????????????int value=0;

????????????????????????if(i+1 <=M.mu){

????????????????????????????????for(int k=M.rpos[i];k<M.rpos[i+1];k++){

????????????????????????????????????????if(i == M.data[k].i && j == M.data[k].j){

????????????????????????????????????????????????printf("%d ",M.data[k].e);

????????????????????????????????????????????????value=1;

????????????????????????????????????????????????break;

????????????????????????????????????????}

????????????????????????????????}

????????????????????????????????if(value==0){

???????????????????????????????????????? printf("0 ");

????????????????????????????????}

????????????????????????}else{

????????????????????????????????for(int k=M.rpos[i];k<=M.tu;k++){

????????????????????????????????????????if(i == M.data[k].i && j == M.data[k].j){

????????????????????????????????????????????????printf("%d ",M.data[k].e);

????????????????????????????????????????????????value=1;

????????????????????????????????????????????????break;

????????????????????????????????????????}

????????????????????????????????}

????????????????????????????????if(value==0){

????????????????????????????????????????printf("0 ");

????????????????????????????????}

????????????????????????}

????????????????}

????????????????printf("\n");

????????}

}

int main(int argc, char* argv[])

{

????????RLSMatrix M;

????????M.tu = 4;

????????M.mu = 3;

????????M.nu = 4;

????????M.rpos[1] = 1;

????????M.rpos[2] = 3;

????????M.rpos[3] = 4;

????????M.data[1].e = 3;

????????M.data[1].i = 1;

????????M.data[1].j = 2;

????????M.data[2].e = 5;

????????M.data[2].i = 1;

????????M.data[2].j = 4;

????????M.data[3].e = 1;

????????M.data[3].i = 2;

????????M.data[3].j = 3;

????????M.data[4].e = 2;

????????M.data[4].i = 3;

????????M.data[4].j = 1;

????????//輸出矩陣

????????display(M);

????????return 0;

}

運行結(jié)果:

0 3 0 5
0 0 1 0
2 0 0 0

總結(jié)

通過系統(tǒng)地學習使用行邏輯鏈接的順序表壓縮存儲稀疏矩陣,可以發(fā)現(xiàn),它僅比三元組順序表多使用了一個 rpos 數(shù)組,從而提高了提取數(shù)據(jù)時遍歷數(shù)組的效率。


六、十字鏈表法,十字鏈表壓縮存儲稀疏矩陣詳解

對于壓縮存儲稀疏矩陣,無論是使用三元組順序表,還是使用行邏輯鏈接的順序表,歸根結(jié)底是使用數(shù)組存儲稀疏矩陣。介于數(shù)組 "不利于插入和刪除數(shù)據(jù)" 的特點,以上兩種壓縮存儲方式都不適合解決類似 "向矩陣中添加或刪除非 0 元素" 的問題。

例如,A 和 B 分別為兩個矩陣,在實現(xiàn) "將矩陣 B 加到矩陣 A 上" 的操作時,矩陣 A 中的元素會發(fā)生很大的變化,之前的非 0 元素可能變?yōu)?0,而 0 元素也可能變?yōu)榉?0 元素。對于此操作的實現(xiàn),之前所學的壓縮存儲方法就顯得力不從心。

本節(jié)將學習用十字鏈表存儲稀疏矩陣,該存儲方式采用的是 "鏈表+數(shù)組" 結(jié)構(gòu),如圖 1 所示。

數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程?。ǖ谖宀糠帧?shù)組和廣義表詳解)三,數(shù)據(jù)結(jié)構(gòu)(C語言版),數(shù)據(jù)結(jié)構(gòu),c語言,java

圖 1 十字鏈表示意圖

可以看到,使用十字鏈表壓縮存儲稀疏矩陣時,矩陣中的各行各列都各用一各鏈表存儲,與此同時,所有行鏈表的表頭存儲到一個數(shù)組(rhead),所有列鏈表的表頭存儲到另一個數(shù)組(chead)中。

因此,各個鏈表中節(jié)點的結(jié)構(gòu)應(yīng)如圖 2 所示:

數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程?。ǖ谖宀糠?、數(shù)組和廣義表詳解)三,數(shù)據(jù)結(jié)構(gòu)(C語言版),數(shù)據(jù)結(jié)構(gòu),c語言,java

圖 2 十字鏈表的節(jié)點結(jié)構(gòu)

兩個指針域分別用于鏈接所在行的下一個元素以及所在列的下一個元素。

鏈表中節(jié)點的 C 語言代碼表示應(yīng)為:

typedef struct OLNode{

????????int i,j;//元素的行標和列標

????????int data;//元素的值

????????struct OLNode * right,*down;//兩個指針域

}OLNode;

同時,表示十字鏈表結(jié)構(gòu)的 C 語言代碼應(yīng)為:

#include<stdio.h>

#include<stdlib.h>

typedef struct OLNode

{

????????int i, j, e; //矩陣三元組i代表行 j代表列 e代表當前位置的數(shù)據(jù)

????????struct OLNode *right, *down; //指針域 右指針 下指針

}OLNode, *OLink;

typedef struct {

????????OLink *rhead, *chead; //行和列鏈表頭指針

????????int mu, nu, tu; //矩陣的行數(shù),列數(shù)和非零元的個數(shù)

}CrossList;

CrossList CreateMatrix_OL(CrossList M);

void display(CrossList M);

int main() {

????????CrossList M;

????????M.rhead = NULL;

????????M.chead = NULL;

????????M = CreateMatrix_OL(M);

????????printf("輸出矩陣M:\n");

????????display(M);

????????return 0;

}

CrossList CreateMatrix_OL(CrossList M)

{

????????int m, n, t;

????????int i, j, e;

????????OLNode *p, *q;

????????printf("輸入矩陣的行數(shù)、列數(shù)和非0元素個數(shù):");

????????scanf("%d%d%d", &m, &n, &t);

????????M.mu = m;

????????M.nu = n;

????????M.tu = t;

????????if (!(M.rhead = (OLink*)malloc((m + 1) * sizeof(OLink))) || !(M.chead = (OLink*)malloc((n + 1) * sizeof(OLink))))

????????{

????????????????printf("初始化矩陣失敗");

????????????????exit(0);

????????}

????????for (i = 1; i <= m; i++)

???????? {

????????????????M.rhead[i] = NULL;

????????}

????????for (j = 1; j <= n; j++)

???????? {

????????????????M.chead[j] = NULL;

????????}

????????for (scanf("%d%d%d", &i, &j, &e); 0 != i; scanf("%d%d%d", &i, &j, &e)) {

????????????????if (!(p = (OLNode*)malloc(sizeof(OLNode))))

???????????????? {

????????????????????????printf("初始化三元組失敗");

????????????????????????exit(0);

????????????????}

????????????????p->i = i;

????????????????p->j = j;

????????????????p->e = e;

????????????????//鏈接到行的指定位置

????????????????if (NULL == M.rhead[i] || M.rhead[i]->j > j)

????????????????{

????????????????????????p->right = M.rhead[i];

????????????????????????M.rhead[i] = p;

????????????????}

????????????????else

????????????????{

????????????????????????for (q = M.rhead[i]; (q->right) && q->right->j < j; q = q->right);

????????????????????????????????p->right = q->right;

????????????????????????????????q->right = p;

????????????????}

???????????????? //鏈接到列的指定位置

????????????????if (NULL == M.chead[j] || M.chead[j]->i > i)

????????????????{

????????????????????????p->down = M.chead[j];

????????????????????????M.chead[j] = p;

????????????????}

????????????????else

????????????????{

????????????????????????for (q = M.chead[j]; (q->down) && q->down->i < i; q = q->down);

????????????????????????????????p->down = q->down;

????????????????????????????????q->down = p;

????????????????????????}

????????????????}

????????return M;

}

void display(CrossList M) {

????????for (int i = 1; i <= M.nu; i++)

????????{

????????????????if (NULL != M.chead[i])

????????????????{

????????????????????????OLink p = M.chead[i];

????????????????????????while (NULL != p)

????????????????????????{

????????????????????????????????printf("%d\t%d\t%d\n", p->i, p->j, p->e);

????????????????????????????????p = p->down;

????????????????????????}

????????????????}

????????}

}

運行結(jié)果:

輸入矩陣的行數(shù)、列數(shù)和非0元素個數(shù):3 3 3
2 2 3
2 3 4
3 2 5
0 0 0
輸出矩陣M:
2?????? 2?????? 3
3?????? 2?????? 5
2?????? 3?????? 4文章來源地址http://www.zghlxwxcb.cn/news/detail-811253.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法教程,數(shù)據(jù)結(jié)構(gòu)C語言版教程!(第五部分、數(shù)組和廣義表詳解)三的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)(c++語言版) 鄧俊輝 第五章:二叉樹學習筆記

    數(shù)據(jù)結(jié)構(gòu)(c++語言版) 鄧俊輝 第五章:二叉樹學習筆記

    5.1二叉樹及其表示 ????????樹是由節(jié)點和邊組成的。 1.有根樹 ??????? 樹是由頂點(vertex)和邊(edge)組成。樹的每個頂點也叫節(jié)點(node)。 2.深度與層次 ????????由樹的連通性,每一節(jié)點與根都有一條路徑相連:根據(jù)樹的無環(huán)性,由根通往每個節(jié)點的路徑必然唯一。 ?

    2024年02月13日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)和算法的部分例題(力扣)

    數(shù)據(jù)結(jié)構(gòu)和算法的部分例題(力扣)

    1.1 合并一個數(shù)組的兩個有序區(qū)間 2.1 反轉(zhuǎn)單向鏈表 (方法1)構(gòu)建一個新的鏈表,從就鏈表依次拿到每個節(jié)點,創(chuàng)建新的節(jié)點添加至新鏈表頭部,完成后的新鏈表就是倒序的,簡單,但是需要創(chuàng)建新的對象 (方法2)與方法1類似,構(gòu)建新的鏈表,從頭部移除節(jié)點,添加至新鏈

    2024年01月18日
    瀏覽(21)
  • Python篇——數(shù)據(jù)結(jié)構(gòu)與算法(第六部分:哈希表)

    Python篇——數(shù)據(jù)結(jié)構(gòu)與算法(第六部分:哈希表)

    ? 目錄 1、直接尋址表 2、直接尋址表缺點 3、哈希 4、哈希表 5、解決哈希沖突 6、拉鏈法 7、常見哈希函數(shù) 8、哈希表的實現(xiàn) 8.1迭代器iter()和__iter__ 8.2str()和repr() 8.3代碼實現(xiàn)哈希表 8.4哈希表的應(yīng)用 ? 直接尋址表:key為k的元素放到k的位置上 改進直接尋址表:哈希(

    2024年02月10日
    瀏覽(43)
  • 【地鐵上的面試題】--基礎(chǔ)部分--數(shù)據(jù)結(jié)構(gòu)與算法--動態(tài)規(guī)劃和貪心算法

    一、動態(tài)規(guī)劃的基本概念和思想 1.1 動態(tài)規(guī)劃的定義和特點 動態(tài)規(guī)劃是一種解決多階段決策問題的算法思想,它通過將問題劃分為若干個子問題,并保存子問題的解來求解原問題的方法。動態(tài)規(guī)劃的特點包括以下幾個方面: 最優(yōu)子結(jié)構(gòu)性質(zhì):動態(tài)規(guī)劃問題具有最優(yōu)子結(jié)構(gòu),即

    2024年02月12日
    瀏覽(20)
  • 【AcWing算法基礎(chǔ)課】第二章 數(shù)據(jù)結(jié)構(gòu)(部分待更)

    【AcWing算法基礎(chǔ)課】第二章 數(shù)據(jù)結(jié)構(gòu)(部分待更)

    本專欄文章為本人AcWing算法基礎(chǔ)課的學習筆記,課程地址在這。如有侵權(quán),立即刪除。 鄰接表 :存儲圖和樹 e數(shù)組存儲每個結(jié)點的值,ne數(shù)組存儲每個結(jié)點的指向的下一個結(jié)點。 數(shù)組模擬鏈表比較快,指針模擬會涉及到new操作,比較慢。 題目鏈接 :826. 單鏈表 1.1題目描述

    2024年02月13日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】4、雙向鏈表(學習 jdk 的 LinkedList 部分源碼)

    【數(shù)據(jù)結(jié)構(gòu)與算法】4、雙向鏈表(學習 jdk 的 LinkedList 部分源碼)

    ?? 單鏈表的節(jié)點中只有一個 next 指針引用著下一個節(jié)點的地址 ?? 當要獲取單鏈表中的最后一個元素的時候,需要從頭節(jié)點開始遍歷到最后 ?? 單鏈表一開始的時候有 first 頭指針引用著頭節(jié)點的地址 ?? 雙向鏈表可以提升鏈表的綜合性能 ?? 雙向鏈表的節(jié)點中有 prev 指針引

    2024年02月12日
    瀏覽(22)
  • Python篇——數(shù)據(jù)結(jié)構(gòu)與算法(第四部分:希爾排序及其討論、計數(shù)排序、桶排序、基數(shù)排序)

    Python篇——數(shù)據(jù)結(jié)構(gòu)與算法(第四部分:希爾排序及其討論、計數(shù)排序、桶排序、基數(shù)排序)

    希爾排序(shell sort)是一種分組插入排序算法 首先取一個整數(shù)d1=n/2,將元素分為d1個組,每組相鄰兩元素之間距離為d1,在各 組內(nèi) 進行直接插入排序 取第二個整數(shù)d2=d1/2,重復上述分組排序過程,知道di=1,即所有元素在同一組內(nèi)進行直接插入排序。 希爾排序每趟并不使某些

    2024年02月07日
    瀏覽(35)
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法

    冒泡排序 例題 順序表下的 冒泡排序 注意:冒泡排序 穩(wěn)定,最多執(zhí)行n(n-1)/2次 選擇排序不穩(wěn)定,平均比較次數(shù)n(n-1)/2 直接插入排序,是在有序基礎(chǔ)上,速度最快且穩(wěn)定的排序方法。 希爾排序是 不穩(wěn)定的 順序查找 二分查找(非遞歸) 二分查找(遞歸) 數(shù)組 鏈表 查詢 快 慢

    2024年02月06日
    瀏覽(92)
  • 數(shù)據(jù)結(jié)構(gòu)——排序算法(C語言)

    數(shù)據(jù)結(jié)構(gòu)——排序算法(C語言)

    本篇將詳細講一下以下排序算法: 直接插入排序 希爾排序 選擇排序 快速排序 歸并排序 計數(shù)排序 排序的概念 排序:所謂排序,就是使一串記錄,按照其中的某個或某寫的大小,按照遞增或遞減0排列起來的操作。 穩(wěn)定性的概念 假定在待排序的記錄序列中,存在多個

    2024年02月08日
    瀏覽(102)
  • 數(shù)據(jù)結(jié)構(gòu)和算法——用C語言實現(xiàn)所有圖狀結(jié)構(gòu)及相關(guān)算法

    數(shù)據(jù)結(jié)構(gòu)和算法——用C語言實現(xiàn)所有圖狀結(jié)構(gòu)及相關(guān)算法

    本文所有代碼均在倉庫中,這是一個完整的由純C語言實現(xiàn)的可以存儲任意類型元素的數(shù)據(jù)結(jié)構(gòu)的工程項目。 首先是極好的工程意識,該項目是一個中大型的CMake項目,結(jié)構(gòu)目錄清晰,通過這個項目可以遇見許多工程問題并且可以培養(yǎng)自己的工程意識。 其次是優(yōu)秀的封裝性(

    2024年02月06日
    瀏覽(1449)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包