Java-算法
来源:互联网 发布:淘宝充值红包吗 编辑:程序博客网 时间:2024/05/07 03:44
在日常的开发中我们经常会遇到一些问题需要通过一定的计算量才能完成,一般这类问题不同的开发人员可能由于经验、知识量等因素会采取不同的处理方式,而这些处理的方式就是我们所谓的算法。
有的在移动端发开或者其他的开发中通常会有对性能的要求,这个时候采用不同的算法会有不同的处理时间、可能这些新手在平常根本就没太重视这些问题(包括我自己 - . -),很多时候都是因为面试时会考到一些常用的算法时才引起我们的注意,所以有一天终于醒悟了,算法是多么重要,之后再闲暇时间也学习一下常用的算法,以备日后所需。
做开发的可能都知道“程序 = 数据结构 + 算法”这个著名的公式,单却并不真正明白算法的定义或者概念。
接下来我们就先来看看到底什么是算法,它到底有什么用呢?
什么是算法
究竟什么是算法(algorithm)呢?从字面意义上理解,算法即用于计算的方法,通过这种方法可以达到预期的计算结果。
算法的定义也有很多种,我们先来看看通常在教科书中给出的算法定义:
算法是解决实际问题的一种精确描述方法、算法是对特定问题的求解步骤的一种精确描述方法等。
还有一种目前被广发认可的算法专业定义:
算法是模型分析的一组可行的、确定的和又穷的规则。
其实不管教科书还是广泛认可的关于算法的定义其实中心思想都是差不多的。通俗地讲,算法可以理解为一个完整的解体步骤,有一些基本运算和规定的运算顺序构成。通过这样的的解题步骤可以解决特定的问题。
从计算机程序设计的角度看,算法由一系列求解问题的指令构成,能够根据规范的输入,在有限的时间内获得有效的输出结果。算法代表了用系统的方法来描述解决问题的一种策略机制。
说了这么多可能还是很抽象,我们举一个例子来分析一下算法是如何在显示生活中发挥作用的。假设有3件事(事件A、事件B、事件C)要做:
- 做事件A需要耗费5分钟;
- 做事件B需要消耗5分钟但是需要15分钟的时间才可以得到结果,如烧水等待水开的过程;
- 做事件C需要耗费10分钟。
就这个例子来说,我们有多重解决的方法,我们来看看具体的区别:
第一种方法就是依次做,先做事件A,然后做事件B、在做事件C,这个过程我们需要的时间则是 5 + (5 + 15) + 10 = 35分钟。这显然是浪费时间的一种做法。
第二种方式就是先做事件B,在等待事件B完成的过程中做事件A和事件C,这样,等待事件B完成的15分钟正好可以完成事件A和事件C。这种方法需要的事件则是 5 + 15 = 20分钟。显然这种相对上面的方式更节省时间。
通过上面的例子我们可以将两种方法看做两种算法。第一种算法效率低,第二种算法效率高,但都达到了做完事情的目的。从这个例子可以看出,算法也是有好坏的区别,好的算法可以提高工作的效率。算法的基本任务是针对一个具体的问题,找到一个高效的处理方法,从而获得最佳的效果。
算法的特征
一个典型的算法一般都可以从中抽象出5个特征:有穷性、确切性、输入、输出和可行性。我们结合上面的例子来分析这5个特征。
有穷性:算法的指令或者步骤的执行次数是有限的,执行时间也是有限的。例如例子中,通过短短的几步就可以完成任务,而且执行的时间都是有限的。
确切性:算法的每一个指令或者步骤都必须有明确的定义和描述。例如,在上面的例子中,为了完成三件事情任务,每一步做什么事情都有明确的规定。
输入:一个算法应该有相应的输入条件,用来刻画运算对象的初始清空。例如,在上面的例子中,有三个待完成的事件,这三个时间便是输入。
输出:一个算法应该有明确的结果输出。这是很容易理解的,因为没有得到结果的算法毫无意义。例如,上面的例子中,输出结果便是三件事情全部做完了。
可行性:算法的执行步骤必须是可行的,且可以在有限时间内完成。例如上面的例子中,每一个步骤都切实可行。其实,无法执行的步骤也是毫无意义的,解决不了任何实际问题。
算法的分类
算法是一门古老且庞大的科学,随着历史的发展,演化出多种多样的算法。按照不同的应用和特性,算法可以分为不同的类别。
1.按照应用来分类
按照算法的应用领域,即解决的问题,算法可以分为基本算法、数据结构相关的算法、几何算法、图论算法、规划算法、数值分析算法、加密/解密算法、排序算法、查找算法、并行算法和数论算法等。
2.按照确定性来分类
按照算法结果的确定性来分类,算法可以分为确定性算法和非确定性算法。
确定性算法:这类算法在有限的时间内完成计算,得到的结果是唯一的,且经常取决于输入值。
非确定性算法:这类算法在有限的时间内完成计算,但是得到的结果往往不是唯一的,即存在多值性。
3.按照算法的思路来分类
按照算法的思路来分类,算法可以分为递归算法、递推算法、穷举算法、贪婪算法、分治算法、动态规划算法和迭代算法等多种算法。
算法相关概念的区别
- 算法不等于公式,可以认为公式是一种高度精简的计算方法。
- 算法依托于在计算机中依托于程序。
- 数据结果是算法实现的基础。
更行县的公式则是:
数据结构 + 算法 + 程序设计语言 = 程序
算法的性能评价
算法的一个重要任务便是找到合适的、效率高的解决问题的方法,即最好的算法。从理论上,这就需要对算法的性能有一个合理的评价。一个算法的优劣往往通过算法复杂度来衡量,算法复杂度包括时间复杂度和空间复杂度两个方面。
1. 时间复杂度
时间复杂度即通常所说的算法执行所需要耗费的时间,时间越短,算法越好。一个算法执行的时间往往无法精确估计,通常需要在实际的计算机中运行才能够知道。但是,也可以对算法代码进行估计,而得到算法的时间复杂度。
首先,算法代码执行的时间往往和算法代码中语句执行的数量有关。由于每条语句执行都需要时间,语句执行的次数越多,整个程序所耗费的时间就越长。因此,简短、精悍的算法程序往往执行速度快。
2.空间复杂度
空间复杂度指的是算法程序在计算机中执行所需要消耗的存储空间。空间复杂度其实可以分为如下两个方面:
1.程序保存所需要的存储空间,即程序的大小。
2.程序在执行过程中所需要消耗的存储空间资源,如程序在执行过程中的中间变量等。
一般来说,程序的大小越小,执行过程中消耗的资源越少,这个程序越好。
目前算法的应用非常广发,常用的算法包括递推算法、递归算法、穷举算法、贪婪算法、分治算法、动态规划算法和迭代算法等多种。我们会在之后慢慢的来学习这些算法。
- java算法:算法基础
- java算法:算法分析
- java算法:递归算法
- java 算法--洗牌算法
- Java算法--LRU算法
- Java 算法
- Java算法
- java算法
- 算法(Java)
- 算法(Java)
- Java 算法
- 算法-java
- JAVA算法
- java算法
- java算法
- java算法
- Java算法
- JAVA 算法
- python进行Base64编码和解码
- Leetcode: 112. Path Sum(JAVA)
- Android设计模式系列--工厂方法模式
- (笔记) MATLAB 关系运算 逻辑运算
- 菜单分类多维数组中.每个数组添加一个id字段.可使用引用
- Java-算法
- git分支管理
- 网络游戏编程基本架构 之 C/S结构
- Filter、Servlet、Listener的学习
- Git使用问题及解决方法大全
- Vim命令合集
- 数据库SQL优化大总结之 百万级数据库优化方案
- javascript中闭包的工作原理
- StringBuilder StringBuffer String的区别(源码分析)-java