数据结构1-数据结构的基本概念

1.数据结构基本概念

数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符 号的总称。

数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
数据对象是性质相同的数据元素的集合,是数据的一个子集。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。通常有四类基本数据结构:
⑴集合结构。该结构的数据元素间的关系是“属于同一个集合”。

⑵线性结构。该结构的数据元素之间存在着一对一的关系。

⑶树型结构。该结构的数据元素之间存在着一对多的关系。

⑷图形结构。该结构的数据元素之间存在着多对多的关系,也称网状结构。

 

存储结构是数据结构在计算机中的表示。
数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。是对一般数据类型的扩展。
抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由
具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。抽象数据类型 通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数 据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实 现,这样抽象层次更高,更能为其他用户提供良好的使用接口。

2.算法

数据结构1-数据结构的基本概念_第1张图片
算法设计的要求
确定性:算法的正确性是指算法至少应该具有输入、输出和加入处理无歧义性、能正确反映问题的需求。能够得到问题的正确答案。
但是算法的“正确”通常在用法上有很大的差别,大体分为以下四个层次
算法程序没有语法错误。
算法程序对于合法的输入数据能够产生满足要求的输出结果。
算法程序对于非法的输入数据能够得到满足规格说明的结果。
算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。

可读性:算法设计的另一目的是为了便于阅读,理解和交流。

健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。
 时间效率高和存储量低: 
 时间效率:指的是算法的执行时间,对于同一个问题,如果有多个算法能够解决,执行时间短的算法效率高,执行时间长的效率低。
 存储量需求:指的是算法在执行过程中需要的最大存储空间。主要指算法程序运行时所占用的内存或外部硬盘存储空间

时间复杂度:

1:算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好地反映出算法的优劣与否;

2:算法执行时间需要依据该算法编制的程序在计算机上执行运行时所消耗的时间来度量,度量方法有两种,事后统计方法和事前分析估算方法,因为事后统计方法更多的依赖计算机的硬件,软件等环境因素,有时容易掩盖算法本身的优劣。因此常常采用事前分析估算的方法;

3:一个算法是由控制结构(顺序,分支,循环三种)和原操作(固有数据类型的操作)构成的,而算法时间取决于两者的综合效率;

4:一个算法花费的时间与算法中语句的执行次数成正比,执行次数越多,花费的时间就越多。一个算法中的执行次数称为语句频度或时间频度。记为T(n);

5:在时间频度中,n称为问题的规模,当n不断变化时,它所呈现出来的规律,我们称之为时间复杂度(其实在这中间引入了一个辅助函数f(n),但它与t(n)是同数量级函数,我们且先这样理解。)

6:在各种算法中,若算法中的语句执行次数为一个常数,则时间复杂度为o(1);同时,若不同算法的时间频度不一样,但他们的时间复杂度却可能是一样的,eg:T(n)=n^2+2n+4 与 T(n)=4n^2+n+8,他们的时间频度显然不一样,但他们的时间复杂度却是一样的,均为O(n^2),时间复杂度只关注最高数量级,且与之系数也没有关系。

7: 求解算法的时间复杂度的具体步骤是:
  ⑴ 找出算法中的基本语句;
  算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
  ⑵ 计算基本语句的执行次数的数量级;
  只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。
  ⑶ 用大Ο记号表示算法的时间性能。
  将基本语句执行次数的数量级放入大Ο记号中。
  如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加
下面我来举一个简单例子:

for(i=1;i<=n;i++)
{a++};
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
a++;
}
}
第一个for循环的时间复杂度为o(n),第二个for循环时间复杂度为o(n^2),则整个算法的时间复杂度为o(n^2+n)。
o(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,时间复杂度就为o(1)。

空间复杂度(Space Complexity):

1:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度;

2:一个算法在计算机上占用的内存包括:程序代码所占用的空间,输入输出数据所占用的空间,辅助变量所占用的空间这三个方面,程序代码所占用的空间取决于算法本身的长短,输入输出数据所占用的空间取决于要解决的问题,是通过参数表调用函数传递而来,只有辅助变量是算法运行过程中临时占用的存储空间,与空间复杂度相关;

3:通常来说,只要算法不涉及到动态分配的空间,以及递归、栈所需的空间,空间复杂度通常为0(1);

4: 对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。

你可能感兴趣的:(数据结构)