今天是第二天,依旧是元气满满的一天。从今天开始我就将数据结构和算法放在一起结合学习,毕竟他俩不分家嘛。那数据结构中的数据是由数据元素组成,数据元素是数据的基本单位。一般来说,数据元素有若干基本项(或称字段、域、属性)组成。
数据类型则是对数据原色取值范围运算的限定,限定的操作为:[+,-,*,/,%]。用户在编程时也可以自定义数据类型。
说到数据元素,那么它并不是孤立存在的,而是存在着某种关系(或者联系、结构)。比如线性关系(linear结构),层次关系(Tree结构)和网状关系(Graph结构)。
综上所述,数据结构就是一门研究非数值型程序设计中计算机操作的对象(数据)及其相互间关系和运算的学科。
一、数据的逻辑结构和存储结构
数据结构中的逻辑结构有集合、线性结构、树形结构和图状结构四种。而数据的存储结构则分为顺序存储(将数据结构中的各元素按照其逻辑顺序存放于存储器一片连续的存储空间中),但是这种情况很少见,因为很难找到刚好合适的内存大小可以存放刚好合适的数据;链式存储(将数据结构中各元素分不到存储器的不同点,用地址或指针方式建立他们之间的联系),这种情况是十分多见的,通过指针寻找数据元素;索引存储(在存储数据的同时建立一个附加的索引表),即索引存储结构=数据文件+索引表,我们可以通过索引表来进行数据的查询,速度也是十分的优良;散列存储(又称Hash,他是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术),散列法存储的基本思想是:由节点的关键码决定节点的存储地址,散列技术除了可以用于查找之外,还可以用于存储,理想的散列访问是非常迅速的。
二、算法的分析
昨天学到了关于什么是算法,今天就对算法进行分析,之前说算法就是解决问题的方法,那么解决一个问题可以有多种不同的算法,在算法正确的前提下,评价算法好坏的方法大致有五点:1.消耗时间的多少 2.消耗存储空间的多少 3.容易理解、容易编程和调试、容易维护 4.问题的规模 5.算法的时间复杂度:算法消耗的时间,用问题规模的函数T(n)来表示。
其中时间复杂度是衡量算法好坏的一个重要标准之一,想要计算算法的时间复杂度,就要知道以下的定义。
1.语句的频度:语句频度定义为可执行语句在算法中重复执行的次数。若某语句执行时间为t,执行次数为f,则该语句所耗时间为t*f。
例如:
void MATRIXM(A,B,C){
float A[n][n],B[n][n],C[n][n];{
int i,j k;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
c[i][j]=0;
for(k=0;k<n;k++)
c[i][j]=c[i][j]+A[i][k]*b[k][j];
}
}
}
上面的代码中第一个for循环的语句频度为n+1,第二个for循环的语句频度为n(n+1),c[i][j]的语句频度为n*n,第三个for循环中和语句频度为n*n*(n+1),最后一句的语句频度为n*n*n。
算法的时间复杂度定义为算法中可执行的语句频度之和,记为T(n),所以例子之中的时间复杂度为
T(n)=(n+1)+n(n+1)+n*n+n*n(n+1)+n*n*n=2n*n*n+3n*n+2n+1
当n趋近于正无穷时lim(T(n)/n*n*n)=2,所以T(n)与n*n*n为同阶无穷大,记为T(n)=O(n*n*n)。
三、线性表的概述
设线性表L=(a0,a1...........an-1),对L线性表的基本运算有:
1.建立一个空表:CreatList(L);
2.置空表:ClearList(L);
3.判断表是否为空:EmptyList(L):若表为空,返回值为true,否则返回false;
4.求表长:LengthList(L);
5.取表中某个元素:GetList(L,i):即ai;
6.定位运算:LocateList(L,x):确定元素x在表L中的位置(或序号)当表中有该元素且第一个与其相等时返回i,如果没有相等元素则返回-1;
7.插入:InsertList(L,x,i):将元素X插入到表L中第i个元素之前,且表长+1;
8.删除:DeleteList(L,i):删除表L中第i个元素,且表长-1;
这是基本运算,对L的运算还有合并、拆分、复制、排序、遍历等。