第一章:【数据结构】数据结构基础概念
数据结构是软件编程的基础,是程序员的基本功。
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。
【程序设计 = 数据结构 + 算法】
是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
符号必须具备的两个前提:
是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录。
一个数据元素可以由若干个数据项组成,数据项是数据不可分割的最小单位。
是性质相同的数据元素的集合,是数据的子集。
是相互之间存在一种或多种特定关系的数据元素的集合
类型 | 说明 |
---|---|
逻辑结构 | 指数据对象中数据元素之间的相互关系 |
集合结构 | 集合结构中的数据元素除了同属于一个集合外,他们之间没有其他关系 |
线性结构 | 线性结构中的数据元素之间是一对一的关系 |
树形结构 | 树形结构中的数据元素之间存在一对多的层次关系 |
图形结构 | 图形结构的数据元素是多对多的关系 |
物理结构 | 是指数据的逻辑结构在计算机中的存储形式 |
顺序存储结构 | 是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的 |
链式存储结构 | 是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的,需要一个指针存放数据元素的地址来反映其逻辑关系 |
是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
类型用来说明变量或表达式的取值范围和所能进行的操作。
按照取值的不同,分为两类:
指取出事物具有的普遍性的本质,“抽象”的意义在于数据类型的数学抽象特性。
指一个数学模型及定义在模型上的一组操作,体现了程序设计中问题分解、抽象和信息隐藏的特性。
(我们对已有的数据类型进行抽象,就有了抽象数据类型)
是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法的五个特性:
正确性:
算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案
分为4个层次:
可读性
算法设计的另一目的是为了便于阅读、理解和交流
健壮性
输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果
时间效率高和存储量低
时间效率高是指算法的执行时间短,存储量指算法在执行过程中需要的最大存储空间,主要指内存和硬盘空间
事后统计方法
主要是通过设计好的测试仪程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,确定效率高低。
由于有以下缺点,该方法基本不予考虑
事前分析估算方法
在计算机程序编制前,依据统计方法对算法进行估算。
程序运行时间决定因素有以下几点
抛开与计算机软硬件的因素,一个程序的运行时间依赖于算法的好坏和问题的输入规模(输入量大小)。
最终,在分析程序的运行时间时,最重要的是把程序看成是独立于程序设计语言的算法或一系列步骤。
渐进增长:
给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的 n > N,f(n)总是比g(n)大,那么我们说f(n)的增长渐进快于g(n)。
判断一个算法的好坏时,例如 3n+1,2n2,2n2+3n+1, n3+1:
算法时间复杂度
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。
算法的时间复杂度,也就是算法的时间度量,记作:T(n) = O(f(n))。
他表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度,其中f(n)是问题规模n的某个函数。
推导大O阶(O(fn))
得到的结果就是大O阶,分为常数阶O(1),线性阶O(n),对数阶O(logn),平方阶O(n2)等
最坏情况与平均情况
最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。
在应用中,这是一种最重要的需求。通常,除非特别指定,我们提到的运行时间都是最坏情况的运行时间。
平均运行时间时所有情况中最有意义的,因为它是期望的运行时间,但现实情况中。很难获取平均时间。
算法空间复杂度
现实中完全可以通过空间来换取时间,例如一个本来需要每次计算n次的结果,先把所有的情况都保存下来,然后根据输入去查找对应结果,就从O(n)变为了O(1)。
S(n) = O(f(n)),通常说的算法复杂度指时间复杂度
本文简单介绍了学习数据结构的一些基础知识,下一章开始进入第一个具体的数据结构:线性表