数据结构序章算法时间复杂度与空间复杂度

序章

定义

数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。

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

 
传统上,我们把数据结构分为逻辑结构和物理结构。
数据结构的定义是对操作对象的一种数学描述,即从操作对象抽象出来的数学模型。结构定义中的“关系”描述的 是数据元素之间的逻辑关系。因此又称为数据的逻辑结构。

逻辑结构

  1. 集合结构:集合结构中的数据元素同属于一个集合,他们之间是并列的关系,除此之外没有其他关系

  2. 线性结构:线性结构中的元素存在一对一的相互关系。

  3. 树形结构:树形结构中的元素存在一对多的相互关系。

  4. 图形结构:图形结构中的元素存在多对多的相互关系

 
物理结构
物理结构又叫存储结构,指数据的逻辑结构在计算机存储空间的存放形式。通俗的讲,物理结构研究的是数据在存储器中存放的形式。 存储器主要针对于内存而言,像硬盘、软盘、光盘等外部存储器的数据组织通常用文件结构来描述。在计算机中表示信息的最小单位是二进制数的一位叫做位(bit)。在计算机中,我们可以用一个由若干位组合起来形成的一个位串表示一个数据元素。通常这个位串称为元素(element)或结点(node)。当数据元素由若干数据项组成时,位串中应用于各个数据项的子位串称为数据域(data field)。

数据在内存中的存储结构,也就是物理结构,分为两种:顺序存储结构和链式存储结构。

  1. 顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。数组就是顺序存储结构的典型代表。

  2. 链式存储结构:是把数据元素存放在内存中的任意存储单元里,也就是可以把数据存放在内存的各个位置。这些数据在内存中的地址可以是连续的,也可以是不连续的。

    和顺序存储结构不同的是,链式存储结构的数据元素之间是通过指针来连接的,我们可以通使用指针来找到某个数据元素的位置,然后对这个数据元素进行一些操作。

算法

定义

算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

特征

算法具有五个基本特征:输入、输出、有穷性、确定性和可行性。

  1. 输入:(Input)

    一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;

  2. 输出:(Output)

    一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

  3. 有穷性:(Finiteness)

    算法的有穷性是指算法必须能在执行有限个步骤之后终止;

  4. 确定性:(Definiteness)

    算法的每个步骤都有确定的含义,不会出现二义性。

  5. 可行性:(Effectiveness)

    算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。

算法的设计要求

正确性   
可读性  
健壮性(鲁棒性)
时间效率高,存储量低

时间复杂度与空间复杂度

时间复杂度

  • 时间频度:一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。

  • 时间复杂度:在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

空间复杂度

一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地\"进行的,是节省存储的算法,如这一节介绍过的几个算法都是如此;有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元。
 
常用算法复杂度:
 
常用的时间复杂度所耗费的时间从小到大依次是:O(1) < O(logn) < (n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
 
 
原文地址:https://www.cnblogs.com/carleunderwood/p/7149693.html