什么是算法?

一、什么是算法?

 定义:算法(Algorithm)

     ? 一个有限指令集

     ? 接受一些输入(有些情况下不需要输入)

     ? 产生输出

     ? 一定在有限步骤之后终止

     ? 每一条指令必须

      ? 有充分明确的目标,不可以有歧义

      ? 计算机能处理的范围之内

      ? 描述应不依赖于任何一种计算机语言以及具体的实现手段

二、什么是好的算法?

两个关键点:

  ? 空间复杂度 S ( n ) —— 根据算法写成的程序在执行时 占用存储单元的长度。这个长度往往与输入数据的 规模有关。空间复杂度过高的算法可能导致使用的 内存超限,造成程序非正常中断。

  ? 时间复杂度 T( n ) —— 根据算法写成的程序在执行时 耗费时间的长度。这个长度往往也与输入数据的规 模有关。时间复杂度过高的低效算法可能导致我们 在有生之年都等不到运行结果。

+在分析一般算法的效率时,我们经常关注下面两种复杂度

? 最坏情况复杂度 Tworst( n )

? 平均复杂度 Tavg( n )

      Tavg(n) <= Tworst(n)

-复杂度的渐进表示法:

  ? T(n) = O( f(n) ) 表示存在常数C >0, n0>0 使得当 n >= n0

  有T(n)<=C·f(n)

  ? T(n) = ?( g(n) ) 表示存在常数 C >0, n 0>0 使得当 n ? n 0

  有 T(n)>= C·g ( n )

  ? T( ) = Θ( h(n) ) 表示同时有 T(n) = O( h(n) ) 和 T( n) = ?( h(n) )

如图所示:

+复杂度计算方法:

1.若两段算法分别有复杂度 T1 (n) = O( f1(n) ) 和 T2 (n) = O( f2 ( n) ),

则  ? T1(n) + T2(n) = max( O( f1(n) ), O( f2(n) ) )

     ? T1 (n) ? T2 ( n) = O( f1(n) ? f2 ( n) )

2.若 T( n )是关于 n 的 k阶多项式,那么 T(n)= Θ ( n k ) 。

3.一个for循环的时间复杂度等于循环次数乘以循环体代码的复杂度。

4.if-else 结构的复杂度取决于 if 的条件判断复杂度和两个分枝部分的复杂度,总体复杂度取三者中最大。

                                                                                                       计算机小白的蜕变之路,艰辛亦单调,果断亦决绝。

                                               敬请批评指正!

                                                                   ---yuhaow

时间: 2024-07-30 19:42:29

什么是算法?的相关文章

算法导论之贪心算法

参考:http://www.cnblogs.com/Creator/archive/2011/06/07/2074227.html 贪心算法在几个基本算法里面算是相对简单的算法了,思路也是非常简单的,每一步总是做出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.基本思路就是从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解.当达到某算法中的某一步不能再继续前进时,算法停止. 贪心算法存在的问题是: 1. 不能保证求得的最

算法导论——最短路径Dijkstra算法

package org.loda.graph; import org.loda.structure.IndexMinQ; import org.loda.structure.Stack; import org.loda.util.In; /** * * @ClassName: Dijkstra * @Description: Dijkstra最短路径算法--贪心算法 * @author minjun * @date 2015年5月27日 下午4:49:27 * */ public class D

【算法导论】贪心算法之活动选择问题

动态规划总是在追求全局最优的解,但是有时候,这样有点费时.贪心算法,在求解过程中,并不追求全局最优解,而是追求每一步的最优,所以贪心算法也不保证一定能够获得全局最优解,但是贪心算法在很多问题却额可以求得最优解. 一.问题概述 活动选择问题: 假定一个有n个活动(activity)的集合S={a1,a2,....,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用.每个活动ai都有一个开始时间si和一个结束时间fi,其中0<=si<fi<正无穷.如

算法导论学习-prim算法

一. 关于最小生成树 对于无向连通图G=(V,E),其中V表示图的顶点,E表示图的边,对于每条边都有一个权值,可以理解为边a->b的权值C为从a走到b要走的路程为C.现在我们希望找到一个无回路的子集T,且有T是E的子集,T连接了所有的顶点,且其权值和最小.那么这样一个子图G‘=(V,T)称之为图G的最小生成树. 二. 最小生成树的基本性质 最小生成树的边数|T|必然服从|T|=|V|-1. 最小生成树不可以有循环 最小生成树不必是唯一的. 三. Prim算法 对于最小生成树有两种算法:prim算

【算法导论】贪心算法之赫夫曼编码

概述 讨论赫夫曼编码问题,赫夫曼编码的思想就是变长编码.变长编码就是让字符表中出现概率高的字符的编码长度尽可能小,而出现概率高的字符的编码长度相对较长.然后还要遵循前缀码的要求,就是任意一个编码都不是其他编码的前缀码,这样方便解码. 思路及实现 对于下表中的字符和相应的出现概率,有对应图中的编码树: 可以比较容易的看出来,每个叶节点就代表一个字符,从根节点到叶节点走过的路径拼接起来,就代表这个字符的编码,比如f是1100,e是1101,而f和e是深度最深的节点也是概率最小的两个节点.这也就是我们

算法导论------------桶排序算法之研究

举个来说明桶排序的过程,假设现在有A={0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68},桶排序如下所示: 研究过计数排序我们知道了----计数排序是假设输入是由一个小范围内的整数构成,而桶排序则假设输入由一个随机过程产生的,该过程将元素均匀而独立地分布在区间[0,1)上.当桶排序的输入符合均匀分布时,即可以线性期望时间运行.桶排序的思想是:把区间[0,1)划分成n个相同大小的子区间,成为桶(bucket),然后将n个输入数分布到各个桶中去,对

算法导论-第一章-算法在计算中的作用(速记)

算法就是把输入转换成输出的计算步骤的一个序列. 问题实例由计算该问题解所必需的(满足问题陈述中强加的各种约束的)输入组成. 若对每个输入实例,算法都以正确的输出停机,则称该算法是正确的. 许多有趣的算法问题所共有的两个特征: 1.存在许多候选解,但绝大多数候选解都没有解决手头的问题.寻找一个真正的解或一个做好的解可能是一个很大的挑战. 2.存在实际应用. 数据结构是一种存储和组织数据的方式,旨在便于访问和修改. 原文地址:https://www.cnblogs.com/lixiaov/p/104

算法导论5.3-3

转自风清云淡的博客,他给出的解法非常的妙. 问题: 描述RANDOM(a,b)的过程的一种实现,它只调用RANDOM(0,1).作为a和b的函数,你的程序的期望运行时间是多少?注:RANDOM(0,1)以等概率输出0或者1,      要求RANDOM(a,b)以等概率输出[a,b]之间的数(整数) 解决方案: 1,取 n=b-a+1,取最小的正整数m,使得 2^m >= n         2,调用RANDOM(0,1),输出m-bit位整数N   (  N >= 0 and N <=

【算法导论】用动态规划解活动选择问题

上一篇讲了贪心算法来解活动选择问题([算法导论]贪心算法之活动选择问题),发现后面有一道练习16.1-1是要用动态规划来解活动选择问题.其实跟之前的矩阵链乘法有些相似,也是考虑分割的活动是哪一个,并用二维数据来记录Sij---最大兼容集合个数,和用另一个二维数据来记录Sij取得最大时的活动分割点k.然后就是考虑边界问题,和使用递归来求动态规划的最优解. 代码注解比较详尽: #include <iostream> #include <algorithm> using namespac

《算法导论》读书笔记之排序算法—Merge Sort 归并排序算法

自从打ACM以来也算是用归并排序了好久,现在就写一篇博客来介绍一下这个算法吧 :) 图片来自维基百科,显示了完整的归并排序过程.例如数组{38, 27, 43, 3, 9, 82, 10}. 在算法导论讲分治算法一章的时候提到了归并排序.首先,归并排序是一个分治算法. 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表, 即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列. merg() 函数是用来合并两个已有序的数组.  是整个算法的关键. 那么归并