c语言数组左下角便*,数据结构 - 数组
數組與線性表的差異
我們以前應該學習過數組,數組與線性表的區別與聯系呢?
它們的相同之處:
(1)它們的相同之處,它們都是若干個相同數據類型的數據元素a0,a1,a2,…,an-1構成的有限序列
它們的不同之處:
(1)數組要求其元素占用一塊地址連續的內存單元空間,而線性表無此要求
(2)線性表的元素是邏輯意義上不可再分的元素,而數組中的每個元素還可以是一個數組
(3)數組的操作主要是向某個下標的數組元素中存放數據和取某個下標的數組元素,這與線性表的插入和刪除操作不同
數組的定義
數組的邏輯定義: n(n>1)維數組是一個向量,它的每個元素是n-1維數組,且具有相同的上限和下限。
n維數組的元素個數
設n維數組為:
A[c1..d1, c2..d2, … , cn..dn ]
其元素個數為:
- 數組邏輯上是線性結構的推廣
- 數組是以線性表為元素的線性結構,而且元素的結構相同
- 數組可以看作是下標和值的偶對的集合
- 數組是一種邏輯結構
數組的操作 :數組一般不做插入和刪除操作(效率較低)
對于數組的操作一般只有兩類:
(1)給定一組下標,存取相應的數據元素
(2)給定一組下標,修改相應的數據元素的值
數組的順序存儲
(1)一維數組(n個元素)中任一元素ai的內存單元地址
LOC(ai)=LOC(a0)+i*k
(2)一個m行n列的二維數組
LOC(aij)=LOC(a00)+(i*n+j)*k
注意:C語言中數組元素采用行主序的存放方法,即行優先順序。
順序存儲時按行序和列序的約定
以“行序為主序”的存儲映象
二維數組中任一元素a[i][j] 的存儲位置
LOC(i,j) = LOC(0,0) + (b2×i+j)×L
其中:LOC(0,0) 稱為基地址或基址
設二維數組A[c1..d1][c2..d2] 其中c1、c2和d1、d2分別為二維數組A的下標的下界和上界,每個數組元素占L個存儲單元,設第一個元素A[c1][c2]的存儲位置為LOC(c1,c2),則該二維數組中任一元素A[i][j] ( c1≤i≤d1,c2≤j≤d2)的存儲位置可由下式確定:
在C語言中,下標從零開始,即:A[0..d1][0..d2] ,則數組元素A[i][j]的存>儲位置是 :
LOC(i,j)=LOC(0,0)+(i*(d2+1)+j)*L
n維數組的元素存儲位置
N維數組中,數組元素存儲位置的確定:
公式如下:
三維數組的表示方法
LOC(i,j,k) = LOC(l1,l2,l3)+
[ (i-l1) * (u2-l2) * (u3-l3) +( j-l2) * (u3-l3) + (k-l3) ]* L
若l1=l2=l3 = 0;
LOC(i,j,k) = LOC(0,0,0) + ( i * u2* u3 + j * u3 +k )*L
矩陣的壓縮存儲
壓縮存儲思想
當矩陣的階數較高,而且矩陣中的一些元素有特殊的性質時,可以采用節省空間的存儲辦法(壓縮存儲)
特殊矩陣
值相同的元素或非零元素分布有一定的規律
(1) 對稱矩陣
若n 階方陣 A 中的元素滿足下述性質:
aij=aji 1≤i , j≤n
則稱A為n階對稱矩陣。
分析:
對于對稱矩陣來說,n2個元素可以壓縮到n(n+1)/2個空間中
以行序為主序將其下三角(包括對角線)中的元素
存儲到一個向量B[n(n+1)/2]中:
對稱矩陣特點:
向量B[k]和矩陣中的元素aij之間存在著一一對應關系:
下面按下標從從0開始討論
下標變換公式
向量B[k]和矩陣中的元素aij之間的關系:由i和j推導k:
(2) 三角矩陣
什么是三角矩陣呢?
三角矩陣 :
下三角矩陣是指矩陣的上三角(不包括對角線)中的元素均為零或常數的n階方陣
注意:下三角矩陣存儲公式和對稱矩陣存儲主對角線以下元素的公式基本相同,只需額外再增加一個存儲常數或零的存儲空間即可
(3)對角矩陣
三對角矩陣:共3n-2個非零元素,存入B[3n-2]中,元素在一維數組B
中的下標k和元素在矩陣中的下標i和j的對應關系為:
k = 3(i-1)-1(主對角線左下角,即i=j+1)
k = 3(i-1) (主對角線上,即i=j)
k = 3(i-1)+1(主對角線上,即i=j-1)
由以上三式,得
k=2(i-1)+(j-1) (1 ≤ i,j ≤ n; 0 ≤ k ≤ 3n-1)
稀疏矩陣
非零元素少且分布無規律
稀疏因子:
假設 m 行 n 列的矩陣含 t 個非零元素,則
稀疏因子為δ = t/(m*n) <= 0.05
為什么使用稀疏矩陣?
以常規方法,即以二維數組表示高階的稀疏矩陣時產生的問題:
(1)零值元素占了很大空間
(2)計算中進行了很多和零值的運算,遇除法,還需判別除數是否為零
解決問題的原則:
(1)盡可能少存或不存零值元素
(2)盡可能減少沒有實際意義的運算
(3)操作方便。即:能盡可能快地找到與下標值(i,j)對應的元素,能盡可能快地找到同一行或同一列的非零值元
注意:壓縮存儲時,對零元素不分配存儲空間,只存儲稀疏矩陣中的非零元
順序存儲結構 — 三元組表
三元組順序表
三元組類型
#define MAXSIZE 12500
typedef struct {
int i, j; //該非零元的行下標和列下標
ElemType e; // 該非零元的值
} Triple;
稀疏矩陣類型
typedef struct {
Triple data[MAXSIZE + 1];
int mu, nu, tu;
} TSMatrix;
鏈式存儲結構 — 十字鏈表
十字鏈表中非零元結點的結構:
十字鏈表的結構類型
typedef struct OLNode {
int i , j;
ElemType e;
struct OLNode *down, *right;
}OLNode;*OLink;
typedef struct
{
OLink *rhead, *chead ; //行、列鏈表頭指針
int mu, nu , tu ;
} CrossList;
總結
以上是生活随笔為你收集整理的c语言数组左下角便*,数据结构 - 数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页转 markdown 的工具
- 下一篇: 备份 CSDN 博客(上)