算法和数据结构解析:1-算法简介

Posted 鮀城小帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法和数据结构解析:1-算法简介相关的知识,希望对你有一定的参考价值。

1.算法的基本概念

算法(Algorithm),就是“计算方法”,指解决一个问题具体的步骤和方法。

算法是计算机程序的核心。在一个计算机程序中,有两个非常重要的部分:数据结构和算法。数据结构决定了程序中数据组织和存储的形式,而算法决定了程序的功能和效率。算法在具体应用时,与数据结构密不可分,是一个程序的灵魂。

2.算法的特征

一个算法应具有一下五个重要特征:

  • 有穷性(Finiteness)

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

  • 确切性(Definiteness)

算法的每一步骤必须有确切的定义。

  • 输入项(Input)

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

  • 输出项(Output)

一个算法有一个或多个输出,以反映对输入数据加工后的结果。

  • 可行性(Effectiveness)

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

3.算法复杂度

3.1 算法复杂度

基于算法的有穷性,我们可以知道算法运行消耗的时间不能是无限的。而对于一个问题的处理,可能有多个不同的算法,它们消耗的时间一般是不同的;运行过程中占用的空间资源也是不同的。

这就涉及到对算法的性能考察。主要有两方面:时间和空间。在计算机算法理论中,用时间复杂度和空间复杂度来分别从这两方面衡量算法的性能。

3.2 时间复杂度(Time Complexity)

算法的时间复杂度,是指执行算法所需要的计算工作量。

一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做:T(n)=Ο(f(n))

问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

3.3 空间复杂度

算法的空间复杂度,是指算法需要消耗的内存空间。有时候做递归调用,还需要考虑调用栈所占用的空间。

其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

所以,我们一般对程序复杂度的分析,重点都会放在时间复杂度上。

3.4 时间复杂度的计算

代码的执行时间,可以用“基本指令”的数量来表示。计算机系统里,基本指令包括:算术指令(加减乘除、取余、向上向下取整)、数据移动指令(装载、存储、赋值)、控制指令(条件或无条件跳转,子程序调用和返回)

查看一些具体的代码,分析一下它们的时间复杂度:

int a = 1;

简单赋值操作,运行时间 1(1个单位)

if (a > 1)

简单判断操作、条件跳转,运行时间 1

for (int i = 0; i < N; i++) System.out.println(i);

有循环,运行时间 1(i赋初值)+ N+1(判断)+N(打印)+N(i自增)= 3N + 2

3.5 复杂度的大O表示法

不同的算法,运行时间随着输入规模 n 的增长速度是不同的。我们可以把执行时间,表示成输入规模 n 的函数 T(n) 。

 

在算法分析中,一般用大O符号来表示函数的渐进上界。对于给定的函数g(n),我们用O(g(n))来表示以下函数的集合:

O(g(n)) =  f(n): 存在正常量 c 和 n0,使对所有 n≥n0 ,有 0≤f(n) ≤ cg(n) 

这表示,当数据量达到一定程度时,g(n) 的增长速度不会超过 O(g(n))限定的范围。也就是说,大O表示了函数的“阶数”,阶数越高,增长趋势越大,后期增长越快。

下图画出了常见的算法复杂度:

     

 

4. 算法的分类

算法的分类有以下两种原则:

  • 按照应用的目的来划分

    搜索算法、排序算法、字符串算法、图算法、最优化算法、数学(数论)算法

  • 按照具体实现的策略划分

    暴力法、增量法、分治法、贪心、动态规划、回溯、分支限界法

     

 

5. 经典算法

在实际应用中,有一些经典算法和策略,都可以作为解决问题的思路:

  • 二分查找

  • 快速排序、归并排序

  • KMP算法

  • 快慢指针(双指针法)

  • 普利姆(Prim)和 克鲁斯卡尔(Kruskal)算法

  • 迪克斯特拉(Dijkstra)算法

  • 其它优化算法:模拟退火、蚁群、遗传算法

以上是关于算法和数据结构解析:1-算法简介的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法解析——数据结构与算法简介

《算法设计与分析》期末不挂科

算法时间复杂度和NP问题简介

NDT 算法和一些常见配准算法

大O和数据的规模

数据结构与算法之深入解析“贪心算法“的原理解析和算法实现