当前位置:首页 » 服务存储 » 三元组存储两个字节
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

三元组存储两个字节

发布时间: 2022-07-01 11:08:22

A. 三元组字节数

三元组的内容为 X下标(1字节),Y下标(1字节),整形数(4字节),每个三元组的字节数为6,10个非零元素三元组表所需的最少字节数是 10*6 = 60,此外,应该还需要一个2字节的变量来表明非零元素个数.

B. 什么是数据结构中的二元组、三元组和五元组

二元组的定义:<K,R>
三元组的定义:<D,F,A>
五元组的定义:<V,O,G,M,S>
V是值的集合,O是操作的集合,G是构成名字的文法,M是存储的集合,S是从G能构成的名字几个到M的映射.

C. 抽象数据类型三元组的定义什么意思

三元组指形如((x,y),z)的集合(这就是说,三元组是这样的偶,其第一个射影亦是一个偶),常简记为(x,y,z)。

三元组为计算机专业的一门公共基础课程——数据结构里的概念。主要用来存储稀疏矩阵的一种压缩方式,也叫三元组表。假设以顺序存储结构来表示三元组表(triple table),则得到稀疏矩阵的一种压缩存储方式,即三元组顺序表,简称三元组表。



(3)三元组存储两个字节扩展阅读

抽象数据类型的特征主要体现在以下几个方面:

1、数据抽象。用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。

2、数据封装。将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节,它包含两层含义:

将数据和其行为结合在一起,形成一个不可分割的独立单位;信息隐藏,即尽可能隐藏数据内部细节,只留有限的对外接口形成一个边界,与外部发生联系。封装的原则使得软件错误能够局部化,大大降低排错的难度,便于软件的维护。

3、继承性。数据封装使得一个类型可以拥有一般类型的数据和行为,即对一般类型的继承。若特殊类型从多个一般类型中继承相关的数据和行为,则为多继承。

4、多态性。多态性指在一般类型中定义的数据或行为被特殊类型继承后,具有不同的数据类型或呈现出不同的行为。例如,“苹果”是“水果”的子类,它可以有“水果”的一般“吃”法,但其本身还可以有别的多种“吃法”。

D. 急!三元组顺序表的存储结构形成

/*~~~~稀疏矩阵的三元组顺序表存储结构类型定义及部分常见操作算法(smatrix.c)~~~~*/
#ifndef __SPARSEMATRIX__
#define __SPARSEMATRIX__

#ifndef COMMONELEM
#define COMMONELEM 0 /*公共元的值*/
#endif

#include <stdlib.h>
/*三元组顺序表存储空间长度的最小值*/
#define MATRIXMINSIZE 10
/*三元组顺序表存储结构类型定义*/
typedef struct
{
int row; /*行号*/
int col; /*列号*/
MatrixDT value; /*特殊元的值*/
}ThrElem; /*三元组元素类型*/

typedef struct
{
ThrElem *base; /*三元组表的基地址*/
int listsize; /*三元组表的存储空间尺寸*/
int len; /*三元组表的长度,即矩阵中特殊元的个数*/
int rows,cols; /*矩阵的行数、列数*/
}SMatrix;

/*矩阵初始化*/
void MatrixInitialize(SMatrix *pM, int size, int rows, int cols)
{
if(size<MATRIXMINSIZE)
size=MATRIXMINSIZE;
pM->listsize = size;
pM->base=(ThrElem *)malloc(pM->listsize*sizeof(ThrElem));
if(!pM->base)
exit(EXIT_FAILURE);
pM->rows=rows;
pM->cols=cols;
pM->len=0;
}

/*输出矩阵*/
void MatrixPrint(SMatrix M, void (*cout)(MatrixDT))
{
int i,j,k;
for(k=0,i=0; i<M.rows; i++)
{
for(j=0; j<M.cols; j++)
if(k<M.len && i==M.base[k].row && j==M.base[k].col)
(*cout)(M.base[k++].value);/*输出特殊元*/
else
(*cout)(COMMONELEM); /*输出公共元*/
printf("\n");
}
}

/*取矩阵元素*/
BOOL GetElem(SMatrix M, MatrixDT *pd, int i, int j)
{
int k, addr;
BOOL flg=TRUE;
if(i<0 || i>M.rows-1 || j<0 || j>M.cols-1)
flg=FALSE;/*访问越界*/
else
{
*pd = COMMONELEM;
/*
由于三元组顺序表中特殊元是按"以行优先的顺序并保持同一行中列号从小到大的
规律"保存的,故,可以把矩阵中每个特殊元的二元(行号和列号)逻辑地址转换
成递增有序的一元伪地址addr=行号*列数+列号;
本算法采用的是最简单的顺序查找方法。
由于关键字序列是递增有序的,所以也可以使用折半查找(详见第10章)等算法,
那样效率会更高。
*/
addr=i*M.cols+j;
for(k=0; k<M.len && M.base[k].row*M.cols +M.base[k].col <addr; k++)
;
if(k<M.len && i==M.base[k].row && j==M.base[k].col)
/*M[i][j]是特殊元*/
*pd = M.base[k].value;
}
return flg;
}

/*写矩阵元素*/
BOOL PutElem(SMatrix *pM, MatrixDT d, int i, int j,
BOOL (*equal)(MatrixDT,MatrixDT))
{
int k,m,addr;
BOOL flg=TRUE;
if(i<0 || i>pM->rows-1 || j<0 || j>pM->cols-1 || pM->len >=pM->listsize)
flg=FALSE;/*访问越界*/
else
{
addr=i*pM->cols +j;
/*扫描到i行中j列元素应在的位置*/
for(k=0;k<pM->len &&
pM->base[k].row* pM->cols +pM->base[k].col<addr; k++)
;
if(k<pM->len && i==pM->base[k].row && j==pM->base[k].col)
{
/*原来是特殊元*/
if((*equal)(d,COMMONELEM))
{
/*第1种情况:原来是特殊元,写入的是公共元值。从表中删除元素*/
for(m=k+1; m<pM->len; m++)
pM->base[m-1]=pM->base[m];
pM->len--;
}
else
/*第2种情况:原来是特殊元,写入的是特殊元值,更改元素值*/
pM->base[k].value=d;
}
else /*原来是公共元*/
{
if(!(*equal)(d,COMMONELEM))
{
/*第3种情况:原来是公共元,写入的是特殊元值。在表中k位置插入新元素*/
for(m=pM->len-1; m>=k; m--)
pM->base[m+1]=pM->base[m];
pM->base[k].row=i;
pM->base[k].col=j;
pM->base[k].value =d;
pM->len++;
}
else
/*第4种情况:原来是公共元,写入的是公共元值。空操作*/
;
}
}
return flg;
}

/*拷贝矩阵*/
void MatrixCopy(SMatrix* pM, SMatrix M)
{
int i;
pM->listsize = M.listsize;
pM->rows = M.rows;
pM->cols = M.cols;
pM->len = M.len;
/*申请存储空间*/
pM->base=(ThrElem *)malloc(pM->listsize*sizeof(ThrElem));
if(!pM->base)
exit(EXIT_FAILURE);

for(i=0; i<pM->len; i++)
pM->base[i]=M.base[i];/*复制数组中单元的值*/
}

/*矩阵加法*/
BOOL MatrixAdd(SMatrix* pM, SMatrix M, SMatrix N,
MatrixDT (*add)(MatrixDT,MatrixDT),BOOL (*equal)(MatrixDT,MatrixDT))
{
int i,j,k,addrM,addrN;
/*pM所指矩阵有可能是矩阵M或矩阵N,故先用base缓存结果,最后再给pM->base*/
ThrElem *base;
MatrixDT d;
BOOL flg=TRUE;
if(M.rows !=N.rows || M.cols!=N.cols)
flg=FALSE;
else
{
base=(ThrElem*)malloc((M.len + N.len)*sizeof(ThrElem));
if(!base)
exit(EXIT_FAILURE);
/*i、j和k分别指示M.base、N.base和临时数据区base的首位置*/
i=j=k=0;
while(i<M.len && j<N.len)
{
/*计算矩阵M和矩阵N递增有序的一元伪地址addrM和addrN*/
addrM=M.base[i].row*M.cols + M.base[i].col;
addrN=N.base[j].row*N.cols + N.base[j].col;
if(addrM==addrN)/*两个矩阵中存在位置相同的特殊元*/
{
/*d是两个位置相同的特殊元相加之和*/
d=(*add)(M.base[i].value , N.base[j].value);
if(!(*equal)(d, COMMONELEM))
{
/*d是特殊元,把(i,j,d)追加到base数组*/
base[k].row =M.base[i].row;
base[k].col =M.base[i].col;
base[k++].value =d;
}
i++;
j++;
}
else if(addrM < addrN) /*矩阵M中当前特殊元应先追加到base数组*/
{
base[k]=M.base[i++];
base[k++].value=(*add)(base[k].value, COMMONELEM);
}
else /*矩阵N中当前特殊元应先追加到base数组*/
{
base[k++]=N.base[j++];
base[k++].value=(*add)(base[k].value, COMMONELEM);
}
}
/*将矩阵M或矩阵N中剩余的特殊元追加到base数组*/
for(; i<M.len; i++)
{
base[k]=M.base[i++];
base[k++].value=(*add)(base[k].value, COMMONELEM);
}
for(; j<N.len; j++)
{
base[k]=N.base[j++];
base[k++].value=(*add)(base[k].value, COMMONELEM);
}
if(k>pM->listsize)
exit(EXIT_FAILURE);
/*复制结果数据到pM->base区*/
for(i=0; i<k; i++)
pM->base[i]=base[i];
free(base);
pM->rows=M.rows;
pM->cols=M.cols;
pM->len =k;
}
return flg;
}

/*矩阵转置*/
void MatrixTranspose(SMatrix *pM, SMatrix M)
{
int col,i,j;
ThrElem *base;
/*
本函数允许如下调用方式:
MatrixTranspose(&m, m);
所以要额外申请存储空间base
*/
base=(ThrElem*)malloc(M.listsize*sizeof(ThrElem));
if(!base)
exit(EXIT_FAILURE);
for(i=0,col=0; col<M.cols; col++) /*col是转置后矩阵的行号*/
for(j=0; j<M.len; j++)
if(M.base[j].col == col)
{
/*特殊元行列对换后写入新表空间*/
base[i].row = M.base[j].col;
base[i].col = M.base[j].row;
base[i].value = M.base[j].value;
i++;
}
pM->listsize =M.listsize;
pM->len =M.len;
pM->rows=M.cols;
pM->cols=M.rows;
free(pM->base);
pM->base=base;
}

/*销毁矩阵*/
void MatrixDestroy(SMatrix M)
{
free(M.base);
}

#endif
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/*
建议性测试用程序
*/
typedef enum {TRUE=1,FALSE=0} BOOL;
typedef int MatrixDT;
#include "smatrix.c"

#define inFORMAT "%d"
#define outFORMAT "%3d"

void printdata(MatrixDT x)
{
printf(outFORMAT,x);
}
MatrixDT add(MatrixDT x, MatrixDT y)
{
return x+y;
}
BOOL equal(MatrixDT x, MatrixDT y)
{
return x==y ? TRUE: FALSE;
}
void main()
{
int i,j,x, y, tlimit;
MatrixDT d;
SMatrix M,N;
BOOL valid=TRUE;
printf("请输入矩阵M的行数、列数及特殊元个数的上限值:\n");
scanf("%d%d%d",&x,&y, &tlimit);
MatrixInitialize(&M,tlimit, x, y);
while(valid)
{
printf("请输入特殊元的行号、列号(行号或列号无效时结束):\n");
scanf("%d%d",&x, &y);
printf("请输入特殊元的值\n");
scanf(inFORMAT, &d);
valid=PutElem(&M,d,x,y,equal);
}
printf("原矩阵=\n");
MatrixPrint(M, printdata);
MatrixTranspose(&M,M);
printf("转置后矩阵=\n");
MatrixPrint(M, printdata);
printf("请输入要读取的单元的行号和列号:\n");
scanf("%d%d",&i,&j);
if(GetElem(M,&d,i,j))
{
printf("M[%d][%d]=",i,j);
printf(outFORMAT, d);
printf("\n");
}
else
printf("Invalid.\n");
MatrixPrint(M, printdata);
printf("Copy M to N.\n");
MatrixCopy(&N,M);
if(MatrixAdd(&M,M,N, add, equal))
{
printf("M+N=\n");
MatrixPrint(M, printdata);
}
MatrixDestroy(M);
}

E. 三元组表示稀疏矩阵是什么

三元组表示稀疏矩阵是行列形式。为了方便某些矩阵运算,在按行优先存储的三元组表中,加入一个行表来记录稀疏矩阵中每行的非零元素在三元组表中的起始位置。

在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。

优点

稀疏矩阵的计算速度更快,因为 MATLAB 只对非零元素进行操作,这是稀疏矩阵的一个突出的优点。

假设矩阵 A,B 中的矩阵一样,计算 2*A 需要一百万次的浮点运算,而计算 2*B 只需要 2000 次浮点运算。

因为 MATLAB 不能自动创建稀疏矩阵,所以要用特殊的命令来得到稀疏矩阵。算术和逻辑运算都适用于稀疏矩阵。

对于一个用二维数组存储的稀疏矩阵 Amn ,如果假设存储每个数组元素需要 L 个字节,那么存储整个矩阵需要 m*n*L 个字节。但是,这些存储空间的大部分存放的是 0 元素,从而造成大量的空间浪费。为了节省存储空间,可以只存储其中的非 0 元素。

F. c++三元组的存储及转置

这个应该比较完美了。不过一些字符输入规则没有强制限制。你自己改下吧。
代码如下:

/* 稀疏矩阵乘法,三元组法实现*/

#include <iostream>
#include <iomanip>
using namespace std;
const int MAX_SIZE = 100; // 矩阵中非零元素的最多个数
const int LEN = 3; // 矩阵中元素的对齐长度
// 当矩阵元素因为位数导致不能对齐的时候调整该值
struct Node
{
int nRow,nCol; // 三元组的行、列号
int nVal; // 元素的值
};
struct SparMatrix
{
int nRows,nCols; // 矩阵的行、列数
int nTerms; // 矩阵的非零元个数
struct Node arrayData[MAX_SIZE]; // 存放矩阵非零元素的三元组数组
void PrintMatrix(); // 输出矩阵
int GetElement(int m ,int n); // 获得矩阵对应的元素
void PrintInit(); // 矩阵的输入初始化
void AddElement(int m,int n, int nVal); // 增加非零元素
};

// 矩阵乘法函数(*new)记得释放内存。
SparMatrix* MatrixMulti(SparMatrix* pM1,SparMatrix* pM2);

void main()
{
SparMatrix matrix1;
cout << "The 1st matrix:" << endl;
matrix1.PrintInit();
SparMatrix matrix2;
cout << "The 2nd matrix:" << endl;
matrix2.PrintInit();
cout << "Multiplication:" << endl;
matrix1.PrintMatrix();
cout << "*" << endl;
matrix2.PrintMatrix();
cout << "=" << endl;
SparMatrix* pMatrixPro;
pMatrixPro = MatrixMulti(&matrix1,&matrix2);
if (pMatrixPro == NULL)
{
cout << "Error!" << endl;
}
else
{
pMatrixPro->PrintMatrix();
}
if (pMatrixPro != NULL)
{
delete pMatrixPro;
pMatrixPro = NULL;
}

}

void SparMatrix::PrintMatrix()
{
// cout << "Print Matrix:" << endl;
for (int m = 1 ; m <= nRows; m++)
{
cout << "|" << setw(LEN);
for (int n = 1 ; n <= nCols; n++)
{
cout << GetElement(m,n) ;
if (n == nCols)
{
break;
}
cout << "," << setw(LEN);
}
cout << "|" << endl ;
}
}

int SparMatrix::GetElement(int m ,int n)
{
for (int i = 0 ; i < nTerms; i++)
{
if (arrayData[i].nRow == m && arrayData[i].nCol == n)
{
return arrayData[i].nVal;
}
}
return 0;
}

void SparMatrix::AddElement(int m,int n, int nVal)
{
Node element = {m,n,nVal};
arrayData[nTerms] = element;
nTerms++;
}

void SparMatrix::PrintInit()
{
nTerms = 0;
int m , n;
while(1)
{
cout << "Plz input the row and column num, using space to separate them:" << endl;
cin >> m >> n;
if (m > 0 && n > 0)
{
break;
}
cout << "The num is wrong. Plz input again." << endl;
cin.clear();
cin.sync();
}

nRows = m;
nCols = n;

cout << "Matrix: ( " << m << " , " << n << " )" << endl;
int num = 0;
int nVal = 0;
char chTmp[10] = {0};
while (1)
{
cout << "Plz input the " << num+1 << " element. * to end:" << endl;
cin >> chTmp;
if (*chTmp == '*')
{
cout << "Over" << endl;
break;
}
else
{
nVal = atoi(chTmp);
}
while(1)
{
cout << "Then input the row and colum of this element, using space to separate them:" << endl;
cin >> m >> n;
if (m > 0 && n > 0 && m <= nRows && n <= nCols)
{
break;
}
cout << "The num is wrong. Plz input again." << endl;
cin.clear();
cin.sync();
}
AddElement(m,n,nVal);
}
}

SparMatrix* MatrixMulti(SparMatrix* pM1,SparMatrix* pM2)
{
if (pM1->nCols != pM2->nRows)
{
return NULL;
}
SparMatrix* pro = new SparMatrix;
pro->nTerms = 0;
pro->nRows = pM1->nRows;
pro->nCols = pM2->nCols;
for (int m = 1 ; m <= pM1->nRows; m++)
{
for (int n = 1 ; n <= pM2->nCols; n++)
{
int nVol = 0;
for (int p = 1; p <= pM1->nCols; p++)
{
int nPro = pM1->GetElement(m,p)*pM2->GetElement(p,n);
nVol += nPro;
}
if (nVol != 0)
{
pro->AddElement(m,n,nVol);
}
}
}

return pro;
}

G. 三元组表头占不占存储空间

你好,三元组表头也是占存储空间的,一般会占到1~2个字节。
以后您如果再遇到类似的问题,可以按照下面的思路去解决:
1、发现问题:往往生活在世界中,时时刻刻都处在这各种各样的矛盾中,当某些矛盾放映到意识中时,个体才发现他是个问题,并要求设法去解决它。这就是发现问题的阶段。从问题的解决的阶段性看,这是第一阶段,是解决问题的前提。
2、分析问题:要解决所发现的问题,必须明确问题的性质,也就是弄清楚有哪些矛盾、哪些矛盾方面,他们之间有什么关系,以明确所要解决的问题要达到什么结果,所必须具备的条件、其间的关系和已具有哪些条件,从而找出重要的矛盾、关键矛盾之所在。
3、提出假设:在分析问题的基础上,提出解决问题的假设,即可采用的解决方案,其中包括采取什么原则和具体的途径和方法,但所有这些往往不是简单现成的,而且有多种多样的可能。但提出假设是问题解决的关键阶段,正确的假设引导问题顺利得到解决,不正确不恰当的假设则使问题的解决走弯路或导向歧途。
4、校验假设:假设只是提出n种可能解决方案,还不能保证问题必定能获得解决,所以问题解决的最后一步是对假设进行检验。不论哪种检验如果未能获得预期结果,必须重新另提出假设再进行检验,直至获得正确结果,问题才算解决。

H. 数据结构问题, 有一个100*90的稀疏矩阵,非零元素有10个,设元素为整型,每个整型数

每个元素要用行号,列号,元素值来表示,在用三元组表示稀疏矩阵,还要三个成员来记住,矩阵的行数列数,总的元素数,所以所需的字节数是10*(1+1+1)*2+3*2=66。

模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明;这一条概括了模块化的实现方法和实质:将一个功能模块的代码单独编写成一个.c文件,把该模块的接口函数放在.h文件中。

(8)三元组存储两个字节扩展阅读:

数据元素的机内表示: 用二进制位(bit)的位串表示数据元素。通常称这种位串为节点(node)。当数据元素有若干个数据项组成时,位串中与各个数据项对应的子位串称为数据域(data field)。因此,节点是数据元素的机内表示(或机内映像)。

关系的机内表示(映像方法):数据元素之间的关系的机内表示可以分为顺序映像和非顺序映像,常用两种存储结构:顺序存储结构和链式存储结构。顺序映像借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。非顺序映像借助指示元素存储位置的指针来表示数据元素之间的逻辑关系。

I. 数据结构的问题!一个100x90的整型稀疏矩阵有10个非0元素,每个整型数占2个字节,则用三元组表

一个非零元用(i,j, num)表示。 则 一个非零元用6个字节, 10个就是60个字节。