数据结构与算法简要论述

目录

算法

什么是算法?

算法的五个特征

算法的分类

根据应用分

根据确定性分

根据思路分

数据结构

数据结构和算法的联系

何为有技术的算法

时间复杂度

常见的时间复杂度量级有:

空间复杂度 

空间复杂度 O(1)

空间复杂度 O(n)

算法

什么是算法?

        非正式地说,算法就是任何良定义的计算过程,该过程取某个值的集合作为输入并产生某个值或值的集合作为输出。这样算法就是把输入转换成输出的计算步骤的一个序列。

        我们也可以把算法看成用于求解良说明的计算问题的工具。有一个很著名的公式 :“程序=数据结构+算法”。

算法的五个特征

有穷性:算法的指令或者步骤的执行次数和时间都是有限的。

确切性:算法的指令或步骤都有明确的定义。

输入:有相应的输入条件来刻画运算对象的初始情况。

输出:一个算应有明确的结果输出。

可行性:算法的执行步骤必须是可行的。

算法的分类

根据应用分

        可以分为基本算法,数据结构相关算法,几何算法,图论算法,规划算法,数值分析算法,加密解密算法,排序算法,查找算法,并行算法,数值算法……

根据确定性分

        确定性算法:有限时间内完成,得到结果唯一。

        非确定性算法:有限时间内完成,得到结果不唯一,存在多值性。

根据思路分

        递推算法,递归算法,穷举算法,贪婪算法,分治算法,动态规划算法,迭代算法等。

数据结构

        数据结构是一种存储和组织数据的方式,旨在便于访问和修改。没有一种单一的数据结构对所有用途均有效,所以重要的是知道几种数据结构的优势和局限;

        数据结构三要素:逻辑结构、存储结构、数据的运算;它会教会我们一件事:如何有效地存储数据。

数据结构和算法的联系

        数据结构是数据的组织形式,可以用来表现特定的对象数据。因为不同的数据结构所采用的处理方法不同,计算的复杂程度也不同,因此算法往往依赖于某种某种数据结构。数据结构是算法实现的基础。

何为有技术的算法

        假如计算机时无限快并且存储器是免费的,就不会来研究算法。

        算法的效率作为判断算法优劣的标准。

效率:

        为求解相同问题而设计的不同算法在效率方面常常具有显著的差别。这些差别可能比由于硬件和软件造成的差别要重要的多

        一个算法的优劣往往通过算法复杂度来衡量,算法复杂度包括时间复杂度和空间复杂度两个方面。

时间复杂度

        算法所消耗的时间,我们通常用「时间复杂度」来描述,即通常所说的算法执行所需要耗费的时间,时间越短,算法越好。

        一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

看个例子:

for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

        分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。

常见的时间复杂度量级有:

常数阶                O(1)

对数阶                O(logN)

线性阶                O(n)

线性对数阶         O(nlogN)

平方阶                O(n²)

立方阶                O(n³)

K次方阶              O(n^k)

指数阶                O(2^n)

上面从上至下依次的时间复杂度越来越大,执行的效率越来越低。

空间复杂度 

        既然时间复杂度不是用来计算程序具体耗时的,那么我也应该明白,空间复杂度也不是用来计算程序实际占用的空间的。

        空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。

空间复杂度比较常用的有:O(1)、O(n)、O(n²),我们下面来看看:

空间复杂度 O(1)

        如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)
举例:

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

        代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)

空间复杂度 O(n)

        我们先看一个代码:

int[] m = new int[n]
for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

        这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值