0.数据结构与算法概述

数据结构概述

按照分类角度的不同,数据结构包括逻辑结构物理结构

逻辑结构

指的是数据对象中数据元素之间的关系,有以下四种:

集合   结构中的数据元素除了同属于一种类型外,别无其它关系。 

线性结构    结构中的数据元素之间是一对一的关系。 

树型结构       结构中的数据元素之间存在一对多的多层关系。 

图状结构或网状结构   结构中的数据元素之间是多对多的关系。

物理结构

也叫存储结构,指的是数据的逻辑结构在计算机中的存储方式。有以下两种:

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

链式存储结构:把数据元素存放在任意存储单元里,这组存储单元可以是连续的也可以是不连续的。但是需要在每一个数据元素                           中增加一个存放地址的指针,用此指针来表示数据元素之间的逻辑关系


算法概述

算法定义  :算法是解决特定问题求解步骤的描述,在计算机中为指令的有限序列,并且每条指令表示一个或多个操作

算法的特性:

  • 输入:有0个或多个输入
  • 输出:至少有1个或多个输出
  • 有穷性:算法在有限的步骤后应该自动结束而不会无限循环。
  • 确定性:算法中的每个步骤都有确定的含义,不会出现二义性
  • 可行性:算法的每一步都是可行的

算法的设计要求:

  • 正确性:算法对于合法数据能够得到满足要求的结果,能够处理非法输入,并得到合理的结果。
  • 可读性:算法要便于阅读、理解和交流
  • 健壮性:算法不应该得到莫名其妙的结果
  • 性价比:利用最少的资源得到满足要求的结果

算法时间复杂度

定义

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))  [大O表示法]。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

推导大O阶方法

  • 1.用常数1取代运行时间中的所有加法常数
  • 2.在修改后的运行次数函数中,只保留最高阶项。
  • 3.如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶

有时候,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同,如在冒泡排序中,输入数据有序而无序,其结果是不一样的。此时,我们计算平均值。

以下面几个例子为例:

实例1

int sum = 0;  //(1)
sum = (1+i)*i/2;  //(2)
System.out.println(sum);  //(3)  

语句(1)执行1次, 语句(2)执行1次,  语句(3)执行1次    T(n) = 1+1+1= 3=O(1)  也称为常数阶

实例2

int sum=0;  //(1)
for (int i = 0; i <=n ; i++) {  //(2)
    sum = sum + i;  //(3)
}

语句(1)执行1次, 语句(2)执行n次   语句(3)执行n次   T(n) = 1+2n =O(n)  也称为线性阶

实例3

int sum=0;  //(1)
for (int i = 0; i <=n ; i++) {  //(2)
    for(int j = 0; j<=n ; j++){  //(3)
        sum = sum + i;  //(4)
    }    
}

 语句(1)执行1次, 语句(2)执行n次   语句(3)执行n2次  语句(4)执行n2次  T(n)=1+n+2n2=O(n2)

实例4

int i = 1;  //(1)
    while (i <= n){
        i = i*2;  //(2)
    }

语句(1)的频度是1,   设语句2的频度是f(n),则:2f(n)<=n;f(n)<=log2n    取最大值f(n)= log2n,   T(n)=O(log2n )  也称为对数阶

常见时间复杂度

O(1)<O(logn)<O(n)<O(nlog n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

O(1)、O(logn)、O(n)、O(n2)上文都已经介绍过比较经典的例子,O(nlog n)在之后会介绍到。O(n3)、O(2n)、O(n!)、O(nn)等除非是很小的n,否则哪怕n=100,运行时间也会非常大。所以对于这种复杂度的算法一般没有讨论的意义。

算法空间复杂度

空间复杂度:算法所需存储空间的度量,记作: 

      S(n)=O( f(n) )           

其中 n 为问题的规模。

一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。如果额外空间相对于输入数据量来说是个常数,则称此算法是原地工作。

算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。

猜你喜欢

转载自blog.csdn.net/weixin_39722922/article/details/84564568