算法只是对问题求解方法的一种描述,它不依赖于任何一种语言

算法是独立存在的一种解决问题的方法和思想。

对于算法而言,实现的语言并不重要,重要的是思想。

算法可以有不同的语言描述实现版本(如C描述、C++描述、Python描述等)。

算法的五大特性

输入: 算法具有0个或多个输入

输出: 算法至少有1个或多个输出

有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成

确定性:算法中的每一步都有确定的含义,不会出现二义性

可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成

---------------------

作者:king1043

来源:CSDN

原文:https://blog.csdn.net/weixin_42008209/article/details/80159564

版权声明:本文为博主原创文章,转载请附上博文链接!

算法是指对特定问题求解步骤的一种描述。

算法只是对问题求解方法的一种描述,它不依赖于任何一种语言,既可以用自然语言、程序设计语言(C、C++、Java、Python等)描述,也可以用流程图、框图来表示。一般为了更清楚地说明算法的本质,我们去除了计算机语言的语法规则和细节,采用“伪代码”来描述算法。“伪代码”介于自然语言和程序设计语言之间,它更符合人们的表达方式,容易理解,但不是严格的程序设计语言,如果要上机调试,需要转换成标准的计算机程序设计语言才能运行。

算法具有以下特性。

(1)有穷性:算法是由若干条指令组成的有穷序列,总是在执行若干次后结束,不可能永不停止。

(2)确定性:每条语句有确定的含义,无歧义。

(3)可行性:算法在当前环境条件下可以通过有限次运算实现。

(4)输入输出:有零个或多个输入,一个或多个输出。

算法1-2的确算得挺快的,但如何知道我写的算法好不好呢?

“好”算法的标准如下。

(1)正确性:正确性是指算法能够满足具体问题的需求,程序运行正常,无语法错误,能够通过典型的软件测试,达到预期的需求。

(2)易读性:算法遵循标识符命名规则,简洁易懂,注释语句恰当适量,方便自己和他人阅读,便于后期调试和修改。

(3)健壮性:算法对非法数据及操作有较好的反应和处理。例如,在学生信息管理系统中登记学生年龄时,若将21岁误输入为210岁,系统应该提示出错。

(4)高效性:高效性是指算法运行效率高,即算法运行所消耗的时间短。算法时间复杂度就是算法运行需要的时间。现代计算机一秒钟能计算数亿次,因此不能用秒来具体计算算法消耗的时间,由于相同配置的计算机进行一次基本运算的时间是一定的,我们可以用算法基本运算的执行次数来衡量算法的效率。因此,将算法基本运算的执行次数作为时间复杂度的衡量标准。

(5)低存储性:低存储性是指算法所需要的存储空间低。对于像手机、平板电脑这样的嵌入式设备,算法如果占用空间过大,则无法运行。算法占用的空间大小称为空间复杂度。

除了(1)~(3)中的基本标准外,我们对好的算法的评判标准就是高效率、低存储。

---------------------

作者:趣学算法

来源:CSDN

原文:https://blog.csdn.net/rainchxy/article/details/77323848

版权声明:本文为博主原创文章,转载请附上博文链接!

时间复杂度:算法运行需要的时间,一般将算法的执行次数作为时间复杂度的度量标准。

看算法1-3,并分析算法的时间复杂度。

//算法1-3

sum=0;                     //运行1次

total=0;                   //运行1次

for(i=1; i<=n; i++)        //运行n次

{

sum=sum+i;               //运行n次

for(j=1; j<=n; j++)      //运行n*n次

total=total+i*j;       //运行n*n次

}

把算法的所有语句的运行次数加起来:1+1+n+n+n×n+n×n,可以用一个函数T(n)表达:

T(n)=2n2+2n+2

当n足够大时,例如n=105时,T(n)=2×1010+2×105+2,我们可以看到算法运行时间主要取决于第一项,后面的甚至可以忽略不计。

用极限表示为:

,C为不等于0的常数

如果用时间复杂度的渐近上界表示,如图1-1所示。

从图1-1中可以看出,当nn0时,T(n)Cf (n),当n足够大时,T(n)和f (n)近似相等。因此,我们用О(f (n))来表示时间复杂度渐近上界,通常用这种表示法衡量算法时间复杂度。算法1-3的时间复杂度渐近上界为О(f (n))=О(n2),用极限表示为:

图1-1 渐近时间复杂度上界

还有渐近下界符号Ω(T(n)Cf (n)),如图1-2所示。

图1-2 渐近时间复杂度下界

从图1-2可以看出,当nn0时,T(n)Cf (n),当n足够大时,T(n)和f (n)近似相等,因此,我们用Ω(f (n))来表示时间复杂度渐近下界。

渐近精确界符号Θ(C1f (n)T(n)C2f (n)),如图1-3所示。

从图1-3中可以看出,当nn0时,C1f (n)T(n)C2f (n),当n足够大时,T(n)和f (n)近似相等。这种两边逼近的方式,更加精确近似,因此,用Θ (f (n))来表示时间复杂度渐近精确界。

图1-3 渐进时间复杂度精确界

我们通常使用时间复杂度渐近上界О(f (n))来表示时间复杂度。

---------------------

作者:趣学算法

来源:CSDN

原文:https://blog.csdn.net/rainchxy/article/details/77323848

版权声明:本文为博主原创文章,转载请附上博文链接!

空间复杂度:算法占用的空间大小。一般将算法的辅助空间作为衡量空间复杂度的标准。

空间复杂度的本意是指算法在运行过程中占用了多少存储空间。算法占用的存储空间包括:

(1)输入/输出数据;

(2)算法本身;

(3)额外需要的辅助空间。

输入/输出数据占用的空间是必需的,算法本身占用的空间可以通过精简算法来缩减,但这个压缩的量是很小的,可以忽略不计。而在运行时使用的辅助变量所占用的空间,即辅助空间是衡量空间复杂度的关键因素。

---------------------

作者:趣学算法

来源:CSDN

原文:https://blog.csdn.net/rainchxy/article/details/77323848

版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/feng9exe/p/10371509.html

时间: 2024-09-29 19:53:08

算法只是对问题求解方法的一种描述,它不依赖于任何一种语言的相关文章

【算法】打靶问题求解

问题描述:打一枪可能的环数为0~10,求打10枪总环数为90的概率. 这是一道排列组合问题,可以用循环加递归的方法解决.比如,第一次可以打出0~10环,那么先固定第一次打的环数,然后加上剩下的九次打的环数,就得到总环数.而剩下九次的环数通过递归很容易求得.代码如下: #include <iostream> using namespace std; int cnt = 0; int target = 90; void Permutation(int *numbers, int index, in

钢条切割问题求解方法及相关思考

钢条切割问题求解方法及相关思考 题目来源于<算法导论>第15章第一节.问题如下: 给定一个长度为n英寸的钢条和一个价格表pi(i=1,2,3,...n),求能够使销售收益rn最大的切割方案. 问题1:一共有多少种切割方式? 思路一:对于一个长度为n英寸的钢条,其中一共有n-1个节点可供切割,在每一个节点处都可以选择切割或者不切割,将对一根钢条的切割过程视为从第一个节点直到第n-1个节点逐一选择切割或者不切割的一个过程,利用乘法原理,可以算出来总共有2n-1种切割方案.以四个节点的钢条为例: 思

图基本算法 图的表示方法 邻接矩阵 邻接表

要表示一个图G=(V,E),有两种标准的表示方法,即邻接表和邻接矩阵.这两种表示法既可用于有向图,也可用于无向图.通常采用邻接表表示法,因为用这种方法表示稀疏图(图中边数远小于点个数)比较紧凑.但当遇到稠密图(|E|接近于|V|^2)或必须很快判别两个给定顶点手否存在连接边时,通常采用邻接矩阵表示法,例如求最短路径算法中,就采用邻接矩阵表示. 图G=<V,E>的邻接表表示是由一个包含|V|个列表的数组Adj所组成,其中每个列表对应于V中的一个顶点.对于每一个u∈V,邻接表Adj[u]包含所有满

算法的设计基本方法的理解

算法设计基本方法有什么好处? 了解常见的算法设计方法以及它们之间的区别,有利于构建算法思维的广度,有充分的理论知识.当然,如果算法思维的深度再好的话,将来你见识的算法越多,天下之间所有的算法,都会融入到你的理论和实践当中. 常见算法分类 穷举法(暴力法,蛮力法)它的基本思想是分别列出所有各种可能解,测试其是否满足条件,若是则输出. 回溯法:有通用的解题法之称,是一种将问题的所有解组织的仅仅有条,能避免不必要的穷举搜索,采用的思维是,深度遍历,中间再加两个约束条件和限界函数,不行就回溯,转其他结点

算法数据结构面试分享(一)- 解决算法问题的一般方法

先看一道题目: 给你一个整型数组,我想找出来最大的两个数,能帮我写一个算法吗?     拿到这个题目,大家会怎么想到用什么方法解决吗?我见过很多同学的回答是,先排序,取最大的两个数就好了.那么接下来我们的问题就变成了如何给这个整型数组排序了.我们有很多种方法,冒泡排序,快速排序等等.很有可能面试官就让你开始写具体的排序算法了.当然,有些有经验的同学可能会说了,排序我直接调用sort方法就好了哈.  其实,这两种情况都没有对错之分,只是没有敲开面试官的心扉,也没有给人眼前一亮,让自己脱颖而出. 再

实现与提高算法设计能力的一般方法

1,确定函数名字与原型 1,确定函数名字与原型 一旦拿到有关算法的问题,那么就应该分析问题,找到对应的输入输出,从而确定出算法的函数原型.我们写算法,其实就是写一个或者若干个普通的函数(而不是main函数).因此,需要分析出,应该传什么参数给函数(作为输入参数),函数处理完后,应该把什么数据作为结果返回(作为输出参数).最后还要给函数取一个符合算法意义的名字,名字最好用英语表示,如果用拼音,会显得特别山寨的感觉.函数的命名方式与变量的命名方式都有相关的约定,比如匈牙利命名法,Linux命名法或者

UCenter密码算法规则和生成方法

如果想平滑的使用UCenter,那么这篇文章务必 康盛的系列产品,包括Discuz.UCHome.Supesite都集成了同一个用户系统--UCenter,用户登录的密码也保存在 UCenter中,对于其他系统集成或导出数据到UCenter系统,通常会遇到密码生成的问题,这里就讨论一下UCenter的用户密码算法规则和生成 方法. 密码通常使用MD5对用户密码HASH 后保存在数据库中的方法,如果黑客拿到了这个HASH数值,那么可以采用字典的方式暴力破解,如果这个字典数据库足够大,并且字典比较符

(转)详解LVS负载均衡之三种工作模型原理和10种调度算法

前言:最近在为我们的产品在做高可用,一边搭环境,一边了解相关知识,搜到这篇博客,质量不错,表述清晰,于是转载过来学习. 标签:详解LVS负载均衡之三种工作模型原理和10种调度算法 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://linuxnx.blog.51cto.com/6676498/1195379 LVS负载均衡原理和算法详解    Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大

万物互联不仅仅是一种工具,更是一种新的思维

万物互联不仅仅是一种工具,更是一种新的思维 5G,它是一种网络的速度?它更是一种改变我们生活方方面面的工具,因为5G,不仅仅是速度,它给我带来的万物互联时代的带来,说到万物互联,其实09年就已经提出,那个时候叫做传感网,而今天随着云计算的快速发展,加上5G网络的支撑,万物互联将离我们越来越近,那么万物互联它是什么呢?今天的话题,从万物互联谈起. 将万物连接起来互动产生数据,大数据的计算运用,开发应用场景,对数据产生价值. 万物互联里面有一个核心叫数据,谈到数据其实就是我们今天要讲的核心,因为我们