【数据结构】五分钟自测主干知识(一)

前言:已经学过的读者可以对照本文中的粗体字进行自测,如果有所忘记,可以参考我的其他文字的简略介绍来加强记忆,学好数据结构,共勉!

        获得图灵奖的Pascal之父、著名的瑞士计算机科学家沃思(N.Wirth)教授曾提出:

算法+数据结构=程序设计

        这个公式对计算机科学的影响程度足以类于物理学中爱因斯坦的E=mc^2

                                                                                        ——一个公式展示出程序的本质


1.1数据结构的基本概念

1.数据(Data)是对客观事物的符号表示,在计算机科学中是指能输入到计算机并能由计算机程序进行处理的符号的总称。

2.数据元素(Data Element)是数据的基本单位。

一个数据元素通常有若干个数据项(Data Item)组成,而数据项是数据不可分割的最小单位。

eg.图书检索程序中,一本书的信息就是一个数据元素,它由书名、作者名、出版社和分类号等数据项组成,这些数据项是不可分割的最小单元。

3.数据对象(Data Object)是性质相同的数据元素的集合。

eg.图书检索程序处理的常常是某图书馆内的所有书,而不是某一本图书。

4.数据结构(Data Structure)是相互之间存在的一种或多种特定关系的数据元素的集合。从程序设计角度来说,数据结构就是计算机求解问题时,问题所涉及对象的逻辑结构及其编程表示方法。


1.2数据结构类型

1.结构

即数据元素之间的关系,下列是基本结构形式

(1)集合

(2)线性结构

通常用<a,b>来表示ab之间的有序关系

(3)树形结构

(4)图状结构

通常使用\left ( a,b \right )来表示ab之间的无序关系

2.数据结构的组成部分

数据结构本质是一个二元组:数据结构=<数据对象,数据对象之间的关系>(非标准定义)

数据结构涉及四部分内容:数据对象,数据的逻辑结构(关系),数据的存储结构(物理结构),数据的操作运算

3.数据的存储结构

两种不同形式:

顺序储存结构(数组表示):利用结点在存储器中的相对位置来表示逻辑关系

链式储存结构(指针表示):借助于指向结点存储位置的指针(Pointer)表示数据结构之间的逻辑关系

例如对于复数的存储,编程定义可以采用如下方式:

struct {//顺序存储
	float realpart;
	float virtualpart;
}complex;

struct {//链式存储
	float realpart;
	float *virtualpartpoint;
}complex;

复数-3.5+2.4i的两种表示方法在内存中的映像。


1.3抽象数据类型

按值的不同特性,可以把数据类型分为两大类:原子类型和结构类型。

原子类型的值是不可分解的。如C语言中的整形,实型,字符型,指针型。

结构类型是由若干成分(原子类型和结构类型)按某种结构组成的。如一本书可以由书名,作者,出版社,出版时间等等成分值组成。

抽象数据类型(Abstract Data Type,ADT)是指基于一个数据结构以及这个数据结构上的一组操作所构成的数据类型。

一个ADT的定义并不涉及它的实现细节,这些细节对于ADT用户来说是隐藏的(隐藏实现细节的过程称为封装)抽象数据类型可以用以下的三元组表示:

ADT=<D,S,P>

D是数据对象,S是D上的关系集,P是对D的基本操作集


1.4算法与算法分析

算法是指解决问题的一种方法或者一个过程,是计算机操作步骤的集合。

一个算法应该有以下几个性质:

(1)正确性:√(没错,对就完了)

(2)具体性:具体步骤机器可读,可执行

(3)确定性:明确下一步

(4)有限性:有限步完成

(5)可终止性:不能死循环

评价算法优劣的五条标准:

(1)正确性

(2)可读性

(3)健壮性:算法对意外情况的反应能力要强(例如输入数据非法,除数为0等等)

(4)高效性:算法执行效率要高(效率:时间效率,空间效率)

(5)简洁性


1.5算法的时间复杂度

规模一般指输入量的数目。比如在排序问题中,问题规模可以用被排序元素的个数来衡量。

算法需要执行的基本操作数是问题规模n的函数,记为T\left ( n \right )T\left ( n \right )必定是一个随着规模n增大而增大的函数,它体现的算法随规模n的增长速度。

废话少说,直接上例子

{
	sum = 0;
	for (int i = 1; i <= n; i++) {//1次n循环
		for (int j = 1; j <= n; j++)//2次n循环
			sum = sum + a[i] * a[j];
	}
}

可以认为相加操作每次所需要的时间是一定的,记为c_1(在此可以忽略初始化sum和循环变量i,j累加的时间),因此,运行时间函数为

T\left ( n \right )=c_1\times n^2

一般情况下,算法的运行时间T是问题规模n的函数f\left ( n \right ),记为:

T\left ( n \right )=O\left ( f\left ( n \right ) \right )

我们很难精确得到算法中的基本操作次数的,实际上我们只需要得到时间对于问题规模的增长率,就基本能判断出时间复杂度。(O在数学上表示n\rightarrow \infty时的等级概念)

再来一个矩阵相乘的算法

{
	for (i = 1; i <= n; i++)							//n次加法
		for (j = 1; j <= n; j++) {						//n^2次加法
			c[i][j] = 0;								//n^2次赋值
			for (k = 1; k <= n; k++) {					//n^3次加法
				c[i][j] = c[i][j] + a[i][k] * b[k][j];	//n^3次乘法
			}
		}
}

T\left ( n \right )=2n^3+2n^2+n

同样:                                ​​​​​​​        ​​​​​​​        ​​​​​​​      T\left ( n \right )=O\left ( n^3 \right )

ps.时间复杂度一般情况下均指算法在最坏情况下的执行时间

1.6算法的空间复杂度

指的是算法所需的存储空间的量度,这种存储空间包括内存和外存,一般用字节(Byte)作为空间的基本度量单位。设问题的规模为n,算法所需的空间单位数S一般是问题规模n的函数d\left ( n \right )

S\left ( n \right )=O\left ( d\left ( n \right ) \right )


下一讲,我们来master有关顺序表的关键知识

附链接:【数据结构】五分钟自测主干知识(二)

http://t.csdnimg.cn/pzZ8micon-default.png?t=N7T8http://t.csdnimg.cn/pzZ8m

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值