算法
从定义来看,算法(algorithm),在数学和计算机科学之中,是指一个被定义好的、计算机可施行其指示的有限步骤或次序,常用于计算、数据处理和自动推理。算法可以使用条件语句通过各种途径转移代码执行(称为自动决策),并推导出有效的推论(称为自动推理),最终实现自动化。算法是有效方法,包含一系列定义清晰的指令,并可用有限的时间,在有限的空间内清楚地表述出来。
从功利的角度上讲,算法是指使用计算机技术和编程语言,解决可以通过计算机自动化解决重复问题的方法。它的表现形式依托于具体的计算机语言或者指令,如何编排这些计算机指令就是算研究的主要问题。能够通过计算机算法解决的问题可以被称为算法问题。
算法问题
基于有限的、具有一定规模的参数或者输入,使用有限的时间和空间资源,对这些参数进行处理,然后输出符合指定需求的结果。在这其中,关键的要素包括:输入、输出、时间资源、空间资源。算法旨在使用更少的资源,实现更多的输入输出。
使用计算机编程语言提供的特性,可以将处理算法问题的计算机指令使用编程语言中的函数来表示。那么,函数的参数对应的是算法的输入,函数的返回值就是算法的输出,函数执行消耗的时间和内存就是算法的使用资源。对于一个算法问题,可以将其拆分为若干子问题,对应了不同的函数和函数嵌套。
算法的两个基本的操作——运算和遍历
运算是指对数据进行算术运算或者逻辑映射,类似于数学公式和数学函数的映射等,遍历是指对规模化的数据进行获取,基于一定的顺序,对批量数据进行挨个处理或者找到满足目标条件的数据。算法通过编排合理的运算和遍历顺序,减少使用的时间和空间资源,从而实现高效。
从计算机的基本使用的角度(增删改+查或者说读写数据)上来看,算法问题就是如何使用更少的读写次数,更少的计算次数,更少的存储空间,从而实现更高效的输出。其中“查”或者“读”的需求是算法问题中最为常见的,它可以占据所有数据操作的九成。因此,如何高效地查找数据,是算法问题中的大头。而查找就是在遍历,并且查找是要让目标被先遍历到,非目标被后遍历或不遍历。
算法问题和数学问题的联系和区别
算法问题本质是数学问题,但是存在侧重点的不同。数学问题重视运算和推理,而算法问题的推理要求往往较低,且需要额外处理遍历操作,数学问题不要处理遍历操作。遍历操作依赖于数据结构和遍历顺序或方式。
数学问题通常需要使用数学公式和数学方法来解决,利用推理的手段:分析法(从结论出发倒推条件)和综合法(从条件出发归纳结论),不断地进行等价推理或者单向推理,最终将题目中所给的条件转化为所求结论或答案。其中,数学题目中的条件对应于算法问题的输入,数学题目中的结论对应于算法问题的输出。数学问题重在推理,注重的是解题思路和推理过程,解答题目往往需要使用多种公式理论和方法,从而构建逻辑完备的推理链条。
算法问题是人类使用计算机来解决人类解决不了的问题或者不想亲自解决的问题。准确的说是,使用冯诺依曼机器,解决大规模或者重复性计算的问题。在使用计算机的时候不可避免地需要解决两个问题,一个是数据在内存中的存放问题,一个是在大规模数据中快速找到目标的问题。人们在纸上使用数学符号挥斥方遒的时候无需考虑内存和寄存器的大小,而为了让计算机理解它要干的活则必须使用计算机听得懂的方式。