数组与矩阵
数组类型 | 存储地址的计算 |
---|---|
一维数组 a[n] | a[i]的存储地址为:a+i*len |
二维数组 a[m][n] | a[i][j]的存储地址为(按行存储):a+(i*n+j)*len |
a[i][j]的存储地址为(按列存储):a+(j*m+i)*len |
一维数组:
a[i]是数组a的第i个元素,整个数组的首地址是a,偏移量是i*len。也就是每一个数组元素占用的字节数,i通常等于0。a[0]的存储地址未a,a[1]的存储地址(若每个数组i元素只占用一个字节len)是a+1。
二维数组:
在系统当中,并不是真正的开辟一个二位空间,而是按顺次
如图
按行存:
a+(i*n+j)*len ,i是位置在第几行-1,j是第几列-1
1 | 2 | 3 | 4 |
---|---|---|---|
5 | 6 | 7 | … |
按列存: | |||
1 | 4 | 7 | 10 |
– | – | – | – |
2 | 5 | 8 | … |
3 | 6 | 9 |
在操作系统中,页面置换算法在进行置换时,缺页的问题。有时就要结合按行存储、按列存储来综合讨论
题:已知5行5列的二位数组a中各元素占用两个字节,求元素a[2][3]按行优先存储的存储地址?
答:a[2][3]的意思是第a[2]这一行的a[3]列,如图
a[0] | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
a[1] | 0 | 1 | 2 | 3 | 4 | 5 |
a[2] | 0 | 1 | 2 | 3 | … | |
… | ||||||
… |
地址=a+(2*5+3)*2
稀疏矩阵:
一个矩阵中所记录的元素中大量的元素等于零 就是稀疏矩阵
一般存储为上三角或者下三角
代入法求解
线性表
常见两种存储方式
顺序存储结构:顺序表
开辟了连续空间,顺次把这个表存进来,采用的是一维数组的方式存储信息。
链式存储结构:链表
1.分为:单链表、循环链表、双向链表
2.链表的操作:
单链表删除节点:
| head |—>| a1 | —>|a2 | —>|a3 |
|-|-|–|–|–|–|–|–|
删除a2,a1就直接将指针指向a3。 p.next = q.next
单链表插入节点:
s.next=p.next ,p.next=s
双向链表删除节点:
双向链表插入节点:
顺序存储与链式存储对比
1.空间密度 顺序更优 (因链式要存储指针)
2.容量分配 链式更优 (链式动态、顺序事先确定)
3.查找运算 一样(O(n/2))
4.读运算 顺序更优
5.插入运算 链式更优(顺序全部向后移动一格)
6.删除元素 链式更优