什么是抽象数据模型?主要特点是什么?
来源:学生作业帮 编辑:神马作文网作业帮 分类:数学作业 时间:2024/11/21 01:15:02
什么是抽象数据模型?主要特点是什么?
数据抽象
概念结构是对现实世界的一种抽象
从实际的人、物、事和概念中抽取所关心的共同特性,忽略非本质的细节
把这些特性用各种概念精确地加以描述
这些概念组成了某种模型
三种常用抽象
1. 分类(Classification)
定义某一类概念作为现实世界中一组对象的类型
这些对象具有某些共同的特性和行为
它抽象了对象值和型之间的“is member of”的语义
在E-R模型中,实体型就是这种抽象
2. 聚集(Aggregation)
定义某一类型的组成成分
它抽象了对象内部类型和成分之间“is part of”的语义
在E-R模型中若干属性的聚集组成了实体型,就是这种抽象
3. 概括(Generalization)
定义类型之间的一种子集联系
它抽象了类型之间的“is subset of”的语义
概括有一个很重要的性质:继承性.子类继承超类上定义的所有抽象.
注:原E-R模型不具有概括,本书对E-R模型作了扩充,允许定义超类实体型和子类实体型.
用双竖边的矩形框表示子类,
用直线加小圆圈表示超类-子类的联系
数据抽象的用途
对需求分析阶段收集到的数据进行分类、组织(聚集),形成
实体
实体的属性,标识实体的码
确定实体之间的联系类型(1:1,1:n,m:n)
//
#include
#include
using namespace std;
/***Writed by Yecon***/
const int MaxTerms = 20; //三元组表smArray中三元组个数的最大值
template class SparseMatrix; //稀疏矩阵的类声明
template class Trituple
{
//三元组类
friend class SparseMatrix;
private:
int row,col;
Type value;
};
template class SparseMatrix
{
int Rows, //行数
Cols, //列数
Terms; //非零元个数
Trituple smArray[MaxTerms]; //三元组表
public:
SparseMatrix(int MaxRows,int MaxCols); //构造函数
bool input_data(int row,int col,Type value); //输入数据
SparseMatrix Transpose(); //转置矩阵
SparseMatrix Add(SparseMatrix b); //矩阵求和
SparseMatrix Mul(SparseMatrix b); //矩阵求积
SparseMatrix EmptyMatrix(); //返回零矩阵
};
template SparseMatrix::SparseMatrix(int MaxRows,int MaxCols)
{
Rows = MaxRows; //行数置零
Cols = MaxCols; //列数置零
Terms = 0; //非零元个数置零
}
template bool SparseMatrix::input_data(int row,int col,Type value)
{
if(Terms == MaxTerms || row > Rows || col > Cols)return false;
if(Terms == 0)//若是第一个元素
{
//插入第一个元素
smArray[Terms].row = row;
smArray[Terms].col = col;
smArray[Terms].value = value;
Terms++;
return true;
}
if((row>smArray[Terms-1].row)||((row==smArray[Terms-1].row)&&(col>smArray[Terms-1].col)))//若是最后一个元素
{
//插入最后一个元素
smArray[Terms].row = row;
smArray[Terms].col = col;
smArray[Terms].value = value;
Terms++;
return true;
}
//若非第一个活最后一个元素
//计算应该插入的位置
int k = Terms - 1;
for(int i = Terms - 1;i >= 0;i--)//确定行
if(smArray[i].row >= row)k = i;
for(int j = k;smArray[j].row == row;j++)//确定列
if(smArray[j].col = k;i--)//为待插入的元素腾出地方
smArray[i + 1] = smArray[i];
smArray[k].col = col;
smArray[k].row = row;
smArray[k].value = value;
Terms++;
return true;
}
template SparseMatrix SparseMatrix:: Transpose()
{
//求矩阵的转置
int * rowSize = new int[Cols]; //辅助数组,统计个列非零元素个数
int * rowStart = new int[Cols]; //辅助数组,预计转置后各行存放位置
SparseMatrix b(Cols,Rows);//存放转置结果
// b.Rows = Cols;b.Cols = Rows;b.Terms = Terms;
if(Terms > 0)
{
//统计矩阵b中第i行非零元素个数
for(int i = 0;i < Cols;i++)rowSize[i] = 0; //清零
for(int i = 0;i < Terms;i++)rowSize[smArray[i].col]++;//根据矩阵this中第i个非零元素的列号,将rowSize相当该列的计数加1
//计算矩阵b第i行非零元素的开始存放位置
rowStart[0] = 0;
for(int i = 1;i < Cols;i++) //rowStart[i] = 矩阵b的第i行的开始存放位置
rowStart[i] = rowStart[i - 1] + rowSize[i - 1];
for(int i = 0;i < Terms;i++)
{
//从this向b传送
int j = rowStart[smArray[i].col]; //j为第i个非零元素在b中应存放的位置
b.smArray[j].row = smArray[i].col;
b.smArray[j].col = smArray[i].row;
b.smArray[j].value = smArray[i].value;
rowStart[smArray[i].col]++; //矩阵b第i行非零元素的存放位置加1
}
}
delete []rowSize;
delete []rowStart;
return b;
}
template SparseMatrix SparseMatrix::Mul(SparseMatrix b)
{
//矩阵求积
if(Cols != b.Rows)
{
//this矩阵列数与b矩阵行数不能
cout
概念结构是对现实世界的一种抽象
从实际的人、物、事和概念中抽取所关心的共同特性,忽略非本质的细节
把这些特性用各种概念精确地加以描述
这些概念组成了某种模型
三种常用抽象
1. 分类(Classification)
定义某一类概念作为现实世界中一组对象的类型
这些对象具有某些共同的特性和行为
它抽象了对象值和型之间的“is member of”的语义
在E-R模型中,实体型就是这种抽象
2. 聚集(Aggregation)
定义某一类型的组成成分
它抽象了对象内部类型和成分之间“is part of”的语义
在E-R模型中若干属性的聚集组成了实体型,就是这种抽象
3. 概括(Generalization)
定义类型之间的一种子集联系
它抽象了类型之间的“is subset of”的语义
概括有一个很重要的性质:继承性.子类继承超类上定义的所有抽象.
注:原E-R模型不具有概括,本书对E-R模型作了扩充,允许定义超类实体型和子类实体型.
用双竖边的矩形框表示子类,
用直线加小圆圈表示超类-子类的联系
数据抽象的用途
对需求分析阶段收集到的数据进行分类、组织(聚集),形成
实体
实体的属性,标识实体的码
确定实体之间的联系类型(1:1,1:n,m:n)
//
#include
#include
using namespace std;
/***Writed by Yecon***/
const int MaxTerms = 20; //三元组表smArray中三元组个数的最大值
template class SparseMatrix; //稀疏矩阵的类声明
template class Trituple
{
//三元组类
friend class SparseMatrix;
private:
int row,col;
Type value;
};
template class SparseMatrix
{
int Rows, //行数
Cols, //列数
Terms; //非零元个数
Trituple smArray[MaxTerms]; //三元组表
public:
SparseMatrix(int MaxRows,int MaxCols); //构造函数
bool input_data(int row,int col,Type value); //输入数据
SparseMatrix Transpose(); //转置矩阵
SparseMatrix Add(SparseMatrix b); //矩阵求和
SparseMatrix Mul(SparseMatrix b); //矩阵求积
SparseMatrix EmptyMatrix(); //返回零矩阵
};
template SparseMatrix::SparseMatrix(int MaxRows,int MaxCols)
{
Rows = MaxRows; //行数置零
Cols = MaxCols; //列数置零
Terms = 0; //非零元个数置零
}
template bool SparseMatrix::input_data(int row,int col,Type value)
{
if(Terms == MaxTerms || row > Rows || col > Cols)return false;
if(Terms == 0)//若是第一个元素
{
//插入第一个元素
smArray[Terms].row = row;
smArray[Terms].col = col;
smArray[Terms].value = value;
Terms++;
return true;
}
if((row>smArray[Terms-1].row)||((row==smArray[Terms-1].row)&&(col>smArray[Terms-1].col)))//若是最后一个元素
{
//插入最后一个元素
smArray[Terms].row = row;
smArray[Terms].col = col;
smArray[Terms].value = value;
Terms++;
return true;
}
//若非第一个活最后一个元素
//计算应该插入的位置
int k = Terms - 1;
for(int i = Terms - 1;i >= 0;i--)//确定行
if(smArray[i].row >= row)k = i;
for(int j = k;smArray[j].row == row;j++)//确定列
if(smArray[j].col = k;i--)//为待插入的元素腾出地方
smArray[i + 1] = smArray[i];
smArray[k].col = col;
smArray[k].row = row;
smArray[k].value = value;
Terms++;
return true;
}
template SparseMatrix SparseMatrix:: Transpose()
{
//求矩阵的转置
int * rowSize = new int[Cols]; //辅助数组,统计个列非零元素个数
int * rowStart = new int[Cols]; //辅助数组,预计转置后各行存放位置
SparseMatrix b(Cols,Rows);//存放转置结果
// b.Rows = Cols;b.Cols = Rows;b.Terms = Terms;
if(Terms > 0)
{
//统计矩阵b中第i行非零元素个数
for(int i = 0;i < Cols;i++)rowSize[i] = 0; //清零
for(int i = 0;i < Terms;i++)rowSize[smArray[i].col]++;//根据矩阵this中第i个非零元素的列号,将rowSize相当该列的计数加1
//计算矩阵b第i行非零元素的开始存放位置
rowStart[0] = 0;
for(int i = 1;i < Cols;i++) //rowStart[i] = 矩阵b的第i行的开始存放位置
rowStart[i] = rowStart[i - 1] + rowSize[i - 1];
for(int i = 0;i < Terms;i++)
{
//从this向b传送
int j = rowStart[smArray[i].col]; //j为第i个非零元素在b中应存放的位置
b.smArray[j].row = smArray[i].col;
b.smArray[j].col = smArray[i].row;
b.smArray[j].value = smArray[i].value;
rowStart[smArray[i].col]++; //矩阵b第i行非零元素的存放位置加1
}
}
delete []rowSize;
delete []rowStart;
return b;
}
template SparseMatrix SparseMatrix::Mul(SparseMatrix b)
{
//矩阵求积
if(Cols != b.Rows)
{
//this矩阵列数与b矩阵行数不能
cout