数组与线性表的差异

我们以前应该学习过数组,数组与线性表的区别与联系呢?

它们的相同之处:

(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语言数组左下角便*,数据结构 - 数组相关推荐

  1. c语言如何定义比较大的数组_C语言:数据结构-数组的定义、逻辑结构和特点

    一维数组 (1)定义 一维数组是属于同一种数据类型的元素(变量)的有限序列,其元素称为数组元素,每个元素有统一的名称(数组名),有按序编号的唯一的下标.序列中元素的个数称为数组的长度. 例:a=a0, ...

  2. arraylist 初始化_第一章 C#数据结构--数组和ArrayList

    数组是最通用的数据结构,它出现在几乎所有的编程语言里.在 C#语言中使用数组包括创建 System.Array 类型的数组对象,以及创建针对所有数组的抽象的基类型.Array 类提供了一套方法,这些方 ...

  3. 算法与数据结构--数组和链表的区别

    最近由于在找工作,经历了一些校招面试后,感觉在数据结构和操作系统上面,还有很多的欠缺.所以今天要学习一下数据结构.还是从面试的那到题开始. 数组和链表的区别? C和C++语言中用数组处理一组数据类型相 ...

  4. 内功重修之数据结构----数组

    毕业也有一段时间了,一直在做PHP开发,最近感觉到内功薄弱,所以是重新开始学习内功的时候了(参考郝斌数据结构视频教程) 动态数组的实现,本文以C语言实现一个数组功能(抽取几个基本方法),包括初始化数组 ...

  5. C语言再学习 -- 再论数组和指针

    之前有总结指针数组,但是现在看来总结的太简单了.好多重要的知识点都是一带而过的.本想在后面添加后来想想算了,还是再写一篇文章来详细介绍数组和指针这对冤家吧. 之前总结的,参看:C语言再学习 -- 数组 ...

  6. c++ 数组置0_0基础学习C语言第七章:数组(1)

    C 数组 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量.数组的声明并不是声明一个个单独的变量,比如 numb ...

  7. C语言试题四十四之移动一维数组中的内容,若数组中由n个整数,要求把下标从0到p(p小于等于n-1)的数组元素平移到数组的最后。

    1. 题目 请编写一个函数function,它的功能是:移动一维数组中的内容,若数组中由n个整数,要求把下标从0到p(p小于等于n-1)的数组元素平移到数组的最后. 2 .温馨提示 C语言试题汇总里可 ...

  8. 数据结构数组计算机中的应用,2018考研计算机:数据结构数组和广义表复习重点...

    2018考研计算机:数据结构数组和广义表复习重点 2017-08-17 16:00 | 考研集训营 <数据结构(C语言版)>复习重点在二.三.六.七.九.十章,考试内容两大类:概念,算法, ...

  9. 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

最新文章

  1. 设置Nginx开机自动启动(centos6.8上亲测可用)
  2. 爬虫之requests模块cookieJar对象转换为cookies字典的方法
  3. python学好了能干啥_新手该如何学python怎么学好python?_python学好了能干什么
  4. 条款13:以对象管理资源
  5. Kafka中topic的Partition,Kafka为什么这么快,Consumer的负载均衡及consumerGroup的概念(来自学习笔记)
  6. 程序员修仙之路--设计一个实用的线程池
  7. Scala进阶-函数练习
  8. python 控件id_查看控件id的工具
  9. linux共享文件可读写,在Ubuntu中设置samba共享可读写文件夹
  10. ESXI忘记密码怎么办
  11. Android_activity的生命周期
  12. linux7编译mysql5.7安装,CentOS 7.4 使用源码包编译安装MySQL 5.7.20
  13. MFC中 AfxBeginThread()的函数
  14. 大神干货:算法高手郭大顶级经验分享助你轻松通过初赛!
  15. HP数组转JSON函数json_encode和JSON转数组json_decode函数的使用方法
  16. Redis 快速入门 -- Redis 命令(6)
  17. CentOS出错You don#39;t have permission to access on this server
  18. linux内核配置成qspi挂载,【分享】在Linux/U-Boot里为QSPI Flash使用UBIFS
  19. ps画笔工具、填充选区文字工具、合成
  20. 实时工业以太网EtherCAT高速发展背后

热门文章

  1. python读取api接口频率_Python基础(API接口测试)
  2. python oracle orm_Python ORM
  3. 防止文件重复定义之方法
  4. python的zip()函数
  5. Vivado Bit文件压缩
  6. 史上最全的前端开发面试题(含详细答案)
  7. 将list转为json字符串
  8. SVN版本管理trunk及branch相关merge操作
  9. Standard Driver Routines(标准驱动程序)
  10. 多线程socket 端口扫描程序,实现了,但是速度不行,求指点。