首页 > 技术文章 > 【数据结构总结1】-数据结构的自述

mhq-martin 2018-03-04 17:16 原文

一、数据结构的自我介绍

大家好,饿叫数据结构,是用来提高程序员的程序设计水平的。

官方定义我为:数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。记为:Data_Structure=(D,R)    其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合。------摘自《百度百科》

二、基本概念和术语

2.1 数据(Data)

数值数据:整数、实数、复数

非数值数据:如字符、文字、图形、图像、声音等

2.2数据元素(Data Element)和数据项(Data Item)

数据元素:数据元素是数据的基本单位,在计算机程序中通常被作为一个整体进行考虑 和处理。数据元素有时也被称为元素、结点、顶点、记录等。一个数据元素可由 若干个数据项(Data Item)组成。

数据项:数据项是不可分割的、含有独立意义的最小数据 单位,数据项有时也称为字段(Field)或域(Domain)。

【举例】:

在数据库信息处理系 统中,数据表中的一条记录就是一个数据元素。这条记录中的学生学号、姓名、性别、籍贯、出生年月、成绩等字段就是数据项。

数据项分为两种:一种叫做初等项,如学生的性别、籍贯等,在处理时不能再进行分割;另一种叫做组合项, 如学生的成绩,它可以再分为数学、物理、化学等更小的项。

2.3数据对象

数据对象是性质相同的数据元素的集合,是数据的一个子集。例如,整数数 据对象是{0,±1,±2,±3,…},字符数据对象是{a,b,c,…}。

2.4数据类型

 非结构的原子类型:如 C#语言中的基本类型 (整型、实型、字符型等);

 结构类型:它的成分可以由多个结构类型 组成,并可以分解。结构类型的成分可以是非结构的,也可以是结构的。例如, C#语言中数组的成分可以是整型等基本类型,也可以是数组等结构类型。

2.5数据结构

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。在任何问题中,数据元素之间都不是孤立的,而是存在着一定的关系,这种关系称为结构 (Structure)。根据数据元素之间关系的不同特性,通常有 4 类基本数据结构:

 (1) 集合(Set):如图 1.1(a)所示,该结构中的数据元素除了存在“同属于一个集 合”的关系外,不存在任何其它关系。

 (2) 线性结构(Linear Structure):如图 1.1(b)所示,该结构中的数据元素存在着一 对一的关系。

 (3) 树形结构(Tree Structure):如图 1.1(c)所示,该结构中的数据元素存在着一对 多的关系。

 (4) 图状结构(Graphic Structure):如图 1.1(d)所示,该结构中的数据元素存在着 多对多的关系。

数据结构的形式化定义为:数据结构(Data Structure)简记为DS,是一个二元组, DS = (D,R)其中:D 是数据元素的有限集合,R 是数据元素之间关系的有限集合。

三 介绍我的军师-算法

3.1算法的特性

有穷性;确定性;输入;输出;能行性。

3.2算法的评价标准

正确性;可读性;健壮性;运行时间;占用空间。

3.3算法的时间复杂度

一个算法的时间复杂度(Time Complexity)是指该算法的运行时间与问题规 模的对应关系。一个算法是由控制结构和原操作构成的,其执行的时间取决于二 者的综合效果。为了便于比较同一问题的不同算法,通常把算法中基本操作重复 执行的次数(频度)作为算法的时间复杂度。算法中的基本操作一般是指算法中 最深层循环内的语句,因此,算法中基本操作语句的频度是问题规模n的某个函 数f(n),记作:T(n)=O(f(n))。

其中“O”表示随问题规模n的增大,算法执行时 间的增长率和f(n)的增长率相同,或者说,用“O”符号表示数量级的概念。

如果一个算法没有循环语句,则算法中基本操作的执行频度与问题规模n无 关,记作O(1),也称为常数阶。如果算法只有一个一重循环,则算法的基本操作 的执行频度与问题规模n呈线性增大关系,记作O(n),也叫线性阶。常用的还有 平方阶O(n2)、立方阶O(n3)、对数阶O(log2n)等。

【例1】 分析以下程序的时间复杂度。

x=n; /*n>1*/
y=0;
while(x >= (y+1)*(y+1))
{
y=y+1; ①
}

解:这是一重循环的程序,while 循环的循环次数为  根号n,所以,该程序段中的语句①的频度是 根号n,则程序段的时间复杂度是 T(n)=O(根号 n)。

四 简单的说一下我的盟友--相关的数学知识

4.1集合

4.2对数

4.3递归

如果一个算法直接调用自己或间接地调用自己,就称这个算法是递归 的(Recursive)。

(1)直接递归(Direct Recursion):比如,在收看电视节目时,如果演播室中也有一台电视机播放的是与当前相 同的节目,观众就会发现屏幕里的电视套有一层层的电视画面。这种现象类似于 直接递归。             (2)间接递归(Indirect Recursion) :  如果把两面镜子面对面摆放,便可从任意一面镜子里看到两面镜子无数个影 像,这类似于间接递归。

  函数的递归调用可以理解为:通过一系列的自身调用,达到某一终止条件后, 再按照调用路线逐步返回。递归是程序设计中强有力的工具,有很多数学函数是 以递归来定义的。
         如大家熟悉的阶乘函数,我们可以对n!作如下定义:

根据定义,如要计算 n!(factorial(n)),需要先调用 factorial(n-1)计算 (n-1)!,而要计算(n-1)!需要先调用 factorial(n-2)计算(n-2)!,以此类推,最 终需要调用 factorial(0)计算 0!,然后程序逐步返回,即可计算出 n!。阶乘函数的C#语言实现如下。

public static long fact(int n)
{
if(n <= 1)
{
    return 1;
}
else
{
    return n * fact(n-1);
}
} 

把递归作为一种主要用于设计和描述简单算法的工具,对于不熟悉它的编程人员而言是很难接受的。递归算法通常不是解决问题最有效的计算机程序,因为 递归包含函数调用,函数调用需要时空开销。所以,递归比其他替代选择诸如while循环等,所花费的代价更大。

 

最后,用一句话结束此篇用来勉励园子里的程序猿们。

只有多思索、 多练习,才能提高自己的程序设计水平;否则,书看得再多,提高也不大。-----摘自《数据结构(C#)》

注:本文部分引用《数据结构(C#)》

友情提示

作者: mhq_martin

博客园地址: http://www.cnblogs.com/mhq-martin/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

推荐阅读