数据结构--数据抽象
2017-10-10 19:42
281 查看
C语言除了内置类型还提供了两种聚合数据类型:数组,结构题;
首先解释一下数据类型:数据类型是数据对象和施加在数据对象上面操作的聚合体;
1.首先包含两个部分:数据对象和数据对象的操作,这个类似于
C++的类,类里面就是用来定义数据对象和数据对象的操作,可以说类是数聚类型的一个实现;
抽象数据类型中的数据对象和数据操作的规范声明与数据对象的表示和操作的实现相互分离;
对于抽象数据类型中的功能实现,也就是函数通常需要包括一下类别:
1.创建函数/构造函数:用来创建新的实例,例如
C++语言中的:默认构造函数,拷贝构造函数等;
2.变换函数:可以用于为特定创建特定实例;
3.报告函数/观察函数,这些函数提供实例信息但是不会进行修改;
对于程序的分析:
1.程序是否符合任务的规范说明;
2.程序是否有正确的输出;
3.程序是否能够根据逻辑分解成为有效执行的函数;
4.程序是否能够处理异常等情况;
5.程序是使用内存和外存是否合理;
6.程序的运行时间是否合理;
程序的空间复杂度:程序运行时,所需要的空间;
1.定长空间需求,包括:指令空间,简单变量的存储空间,定长结构变量的存储空间,常量存储空间;
2.变长空间需求:结构化变量所需要的空间,例如递归程序运行时,额外开辟的空间;
时间复杂度:程序运行的时间;
1.程序的时间复杂度;
2.程序步:程序步是与实例特征无关的,根据语法或者语义划分的程序片段;
对于每一个分号就是一个程序步,但是循环里面的是需要按照循环进行计算的;
通过程序步的概念来计算和统计程序的时间复杂度在绝大多数情况下都是不可行的,通常情况下是使用渐进记号来统计时间复杂度的;
对于程序的运行时间建议使用时间计数来进行统计;
方法1 | 方法2 | |
---|---|---|
启动定时时钟 | start=clock() | start=time(NULL) |
停止计时时钟 | stop=clock() | stop=time(NULL) |
返回值类型 | clock_t | time_t |
返回时间 | duration=((double)(stop-start)) | difftime(stop,start) |
魔方其实是
n*n阶的矩阵,范围从
1-n^2,要求是每行每列,以及主对角线的和必须相等;
首先来看看
Coxeter提出的问题的解决方法:
* 1.因为是偶数阶魔方,所以找到第一行的中间放
1,然后向坐上移动一格,把当前数加
1放置在这个位置;
* 2.如果一行超出范围,可以从上边界直接到下边界,从左边界到右边界;
* 3.如果这个位置左上方已经有数字,那么就往这个位置的正下方添加数字;
* 4.一直到所有的数字都填满为止;
例如这张图:
在填充数据的过程中,一共有这几种情况需要考虑:
1.首先将
1填充在第一行的中间位置,在填充
2时,由于已经跨越上边界,所以需要自动转到下边界,所以
2的位置就在第三行的最后一列;
2.在填充
3的过程中,遭遇到了左边界,所以自动跨越,到右边界,
4的位置就可以确定;
3.
5的位置在
4的左上方是符合要求的,
5的左上方已经有
1存在所以直接在
5的正下方填写
6,这个过程都是符合要求的;
接下来尝试使用程序来实现这个过程:
#include<iostream> using namespace std; void fill_mufang(int array[][5],size_t n){ //异常处理 if(n<1||!(n%2)) exit; int row=0; int col=0; int i=0; int j=n/2; size_t fill_number=1; //首先赋值第一个元素,第一行的中间元素; array[0][n/2]=fill_number++; for(;fill_number<=n*n;fill_number++){ //改变row,col,用来判断下一个移动的元素是否需要改变; row = (i-1<0)? n-1:i-1; col = (j-1<0)? n-1:j-1; //如果元素已经有值,那么就改变i的值; if(array[row][col]) i=++i%n; else{i=row;j=(j-1<0)?(n-1):--j;} //移动i,j进行元素赋值操作; array[i][j]=fill_number; } for(size_t i=0;i<n;++i){ for(size_t j=0;j<n;++j){ printf("%d\t",array[i][j]); } printf("\n"); } } int main(){ int array[5][5]={{0}}; fill_mufang(array,5); }
程序的执行结果是
解释一下这里面的关键的几个执行语句:
1.
row=(j-1)<0?(n-1):j-1,这句话其实是一个简单的判断语句表示的含义是:如果
j-1<0,那么
row的值就是
(n-1),否则就是
j-1,因为使用
row表示的是行数,行数向上移动,列数向左移动,本质都是减一操作,但是当行数变为负数时,就应该变为行数的最大行,所以只需要使用
n-1就可以;
2.对于列数的变换也是同样的道理;
3.
if(array[i][j])首先数组进行了初始化操作,元素为0,如果这条语句为真表示的含义是
array[i][j]的值不是
0,也就是在进行左上移动的操作后这里的元素已经有值;那么
j不发生改变,
i应该进行加操作,为了防止超出范围使用
%操作;
4.
i=row;j=(j-1<0)?(n-1):j-1;,因为使用的是
i和
j来移动并且改变元素的,
row和
col只是用来判断下一个元素是否需要改变的;
5.最后进行赋值操作;
偶数阶幻方按照填充的过程进行处理,这里有一点小问题,在二位数组传参应该考虑使用引用的方式传参;
相关文章推荐
- 【数据结构】数据、数据结构(分类)、抽象数据结构
- C++实战之数据抽象
- C++ Primer 学习笔记_56_类与数据抽象 -消息处理示例
- 挑战程序设计竞赛 2.4 加工并存储数据的数据结构
- 【数据结构】【面试题】找N个数据中最大的K个数据
- 如何在oracle中导入.sql数据结构文件和.dmp数据文件??
- 数据结构18: 数据结构中的字符串
- Spark项目之电商用户行为分析大数据平台之(七)数据调研--基本数据结构介绍
- 《数据库系统概念》1-数据抽象、模型及SQL
- 【Java数据结构】Java数据结构之链表反转
- [数据结构] 数据结构(C语言) 严蔚敏、吴伟民编著 - 总
- R语言学习笔记(2):数据类型和数据结构
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
- 数据结构复习(重写某些重要数据结构API) ------------二叉树
- 数据结构---抽象建模
- ffmpeg中AVCodecContext等数据结构中extradata成员的数据格式及其设置
- 数据结构01------数据结构基础01
- C语言入门(15)——结构体与数据抽象
- C/C++ 数据结构---线性顺序存储数据:查询快,增删慢
- 完成端口中的单句柄数据结构与单IO数据结构的理解与设计