你们好,饿叫数据结构,是用来提升程序员的程序设计水平的。程序员
官方定义我为:数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。记为:Data_Structure=(D,R) 其中D是数据元素的集合,R是该集合中全部元素之间的关系的有限集合。------摘自《百度百科》算法
2.1 数据(Data)数据库
数值数据:整数、实数、复数编程
非数值数据:如字符、文字、图形、图像、声音等数组
2.2数据元素(Data Element)和数据项(Data Item)数据结构
数据元素:数据元素是数据的基本单位,在计算机程序中一般被做为一个总体进行考虑 和处理。数据元素有时也被称为元素、结点、顶点、记录等。一个数据元素可由 若干个数据项(Data Item)组成。函数
数据项:数据项是不可分割的、含有独立意义的最小数据 单位,数据项有时也称为字段(Field)或域(Domain)。工具
【举例】:spa
在数据库信息处理系 统中,数据表中的一条记录就是一个数据元素。这条记录中的学生学号、姓名、性别、籍贯、出生年月、成绩等字段就是数据项。设计
数据项分为两种:一种叫作初等项,如学生的性别、籍贯等,在处理时不能再进行分割;另外一种叫作组合项, 如学生的成绩,它能够再分为数学、物理、化学等更小的项。
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#)》