首页 >
算法
✍ dations ◷ 2025-09-13 16:09:28 #算法
算法(algorithm),在数学(算学)和计算机科学之中,为任何一系列良定义的具体计算步骤,常用于计算、数据处理(英语:Data processing)和自动推理。作为一个有效方法(英语:Effective method),算法被用于计算函数,它包含了一系列定义清晰的指令,并可于有限的时间及空间内清楚的表述出来。算法中的指令描述的是一个计算,当其运行(英语:Execution (computing))时能从一个初始状态和初始输入(可能为空)开始,经过一系列有限而清晰定义的状态最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。包括随机化算法在内的一些算法,都包含了一些随机输入。早在尝试解决希尔伯特提出的判定问题时,关于算法的一个不完全的概念已经初步定型,并在其后的正式化阶段中尝试定义“有效可计算性(英语:Effective calculability)”或者“有效方法(英语:Effective method)”。这些尝试包括库尔特·哥德尔、雅克·埃尔布朗和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的递归函数,阿隆佐·邱奇于1936年提出的λ演算,1936年埃米尔·莱昂·珀斯特(英语:Emil Leon Post)的Formulation 1和艾伦·图灵1937年提出的图灵机。即使在当下,依然常有符合直觉的想法难以定义为形式化算法的情况。算法在中国古代文献中称为“术”,最早出现在《周髀算经》、《九章算术》。特别是《九章算术》,给出四则运算、最大公约数、最小公倍数、开平方根、开立方根、求素数的埃拉托斯特尼筛法,线性方程组求解的算法。三国时代的刘徽给出求圆周率的算法:刘徽割圆术。自唐代以来,历代更有许多专门论述“算法”的专著:而英文名称“algorithm”来自于9世纪波斯数学家花拉子米(比阿勒·霍瓦里松,波斯语:خوارزمی ,拉丁转写:al-Khwarizmi),因为比阿勒·霍瓦里松在数学上提出了算法这个概念。“算法”原为“algorism”,即“al-Khwarizmi”的音转,意思是“花拉子米”的运算法则,在18世纪演变为“algorithm”。欧几里得算法被人们认为是史上第一个算法。第一次编写程序是爱达·勒芙蕾丝(Ada Byron)于1842年为巴贝奇分析机编写求解解伯努利微分方程的程序,因此爱达·勒芙蕾丝被大多数人认为是世界上第一位程序员。因为查尔斯·巴贝奇(Charles Babbage)未能完成他的巴贝奇分析机,这个算法未能在巴贝奇分析机上执行。因为“well-defined procedure”缺少数学上精确的定义,19世纪和20世纪早期的数学家、逻辑学家在定义算法上出现了困难。20世纪的英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。图灵机的出现解决了算法定义的难题,图灵的思想对算法的发展起到了重要的作用。以下是高德纳在他的著作《计算机程序设计艺术》里对算法的特征归纳:算法的核心是创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。完全遍历法和不完全遍历法:在问题的解是有限离散解空间,且可以验证正确性和最优性时,最简单的算法就是把解空间的所有元素完全遍历一遍,逐个检测元素是否是我们要的解。这是最直接的算法,实现往往最简单。但是当解空间特别庞大时,这种算法很可能导致工程上无法承受的计算量。这时候可以利用不完全遍历方法——例如各种搜索法和规划法——来减少计算量。分治法:把一个问题分割成互相独立的多个部分分别求解的思路。这种求解思路带来的好处之一是便于进行并行计算。动态规划法:当问题的整体最优解就是由局部最优解组成的时候,经常采用的一种方法。贪心算法:常见的近似求解思路。当问题的整体最优解不是(或无法证明是)由局部最优解组成,且对解的最优性没有要求的时候,可以采用的一种方法。线性规划法:见条目。简并法:把一个问题通过逻辑或数学推理,简化成与之等价或者近似的、相对简单的模型,进而求解的方法。递归方法与迭代方法顺序计算、并行计算和分布式计算:顺序计算就是把形式化算法用编程语言进行单线程序列化后执行。确定性算法和非确定性算法精确求解和近似求解算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。算法的时间复杂度是指算法需要消耗的时间资源。一般来说,计算机算法是问题规模
n
{displaystyle n}
的函数
f
(
n
)
{displaystyle f(n)}
,算法的时间复杂度也因此记做算法执行时间的增长率与
f
(
n
)
{displaystyle f(n)}
的增长率正相关,称作渐近时间复杂度(英语:Asymptotic computational complexity),简称时间复杂度。常见的时间复杂度有:常数阶
O
(
1
)
{displaystyle O(1)}
,对数阶
O
(
log
n
)
{displaystyle O(log n)}
,线性阶
O
(
n
)
{displaystyle O(n)}
,线性对数阶
O
(
n
log
n
)
{displaystyle O(nlog n)}
,平方阶
O
(
n
2
)
{displaystyle O(n^{2})}
,立方阶
O
(
n
3
)
{displaystyle O(n^{3})}
,...,
k
{displaystyle k}
次方阶
O
(
n
k
)
{displaystyle O(n^{k})}
,指数阶
O
(
2
n
)
{displaystyle O(2^{n})}
。随着问题规模
n
{displaystyle n}
的不断增大,上述时间复杂度不断增大,算法的执行效率越低。算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。算法不单单可以用计算机程序来实现,也可以在人工神经网络、电路或者机械设备上实现。这是算法的一个简单的例子。我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成是一颗豆子的大小,可以将下面的算法形象地称为“捡豆子”:以上算法在中国大陆的教科书中通常被叫做“打擂法”或者“循环打擂”:在一个for循环中,每轮循环都有新的挑战者。若挑战者胜的话,挑战者做新擂主,否则擂主卫冕。for循环结束后输出最后的擂主。下面是一个形式算法,用ANSI C代码表示求两个自然数的最大公约数
设两个变量
M
{displaystyle M}
和
N
{displaystyle N}用ANSI C代码表示利用if函数以及递归则能做出更为精简的代码,更可省去交换的麻烦。(但是也因为递归调用,其空间复杂度提高)
相关
- 固氮作用固氮作用(英语:Nitrogen fixation),简称固氮,指将空气中游离态的氮(氮气)转化为含氮化合物(如硝酸盐、氨、二氧化氮)的过程。可分为自然固氮以及人工固氮两种。自然固氮(Natural nitro
- 泮托拉唑泮托拉唑(英语:Pantoprazole,常用商品名有:Somac、Tecta、Pantoloc、Controloc、Panprax、Pansiv、Protium、Prazolin、Protonix、Pantecta、Pantoheal、Pantpas、Ppi-40以及Neo
- 排污交易排污交易是一种以“奖励”形式的经济诱因,鼓励私人企业致力减排的,控制污染经济工具和政府行政门径;以达致减少排放污染物目标。 仍发展中的减低排放温室气体的碳排放计划(英
- 红蟳锯缘青蟹(学名:Scylla serrata),也叫蝤蛑、蝤蝥、青蟹、黄甲蟹,是梭子蟹科青蟹属的动物。在福州和台湾,雄性、未受精的雌性、受精后的雌性锯缘青蟹又分别称为“菜蟳”、“处女蟳”
- Sr5s22,8,18,8,2蒸气压第一:549.5 kJ·mol−1 第二:1064.2 kJ·mol−1 第三:4138 kJ·mol主条目:锶的同位素锶(Strontium,旧译作鎴)是一种化学元素,它的化学符号是Sr,它的原子序数是38,
- 运动鞋运动鞋,又称球鞋,原意是用于进行体育运动穿着的鞋,由于运动鞋穿着舒适,且有不同款式,也是流行文化、时尚服饰之一。运动鞋分为钉鞋、羽毛球鞋、跑步鞋、篮球鞋等,部分鞋款还可细分
- 动眼神经动眼神经(oculomotor nerve),是12对脑神经之中的第三对,编号III。负责控制眼球的转动、眼球内水晶体厚度的调整、瞳孔的缩放。动眼神经的神经核位于中脑的上丘部位的Edinger-Wes
- 驰龙科驰龙科(学名:Dromaeosauridae)又名奔龙科,是群类似鸟类的兽脚亚目恐龙。它们是群体型中至小型的肉食性恐龙,繁盛于白垩纪。在非正式的用法里,它们通常被称为“盗龙”(Raptor),这个名
- 细胞迁移细胞迁移,与细胞移动同义,与细胞运动义近,指的是细胞在接收到迁移信号或感受到某些物质的浓度梯度后而产生的移动。移动过程中,细胞不断重复着向前方伸出突触/伪足,然后牵拉后方
- 沙利安杰伊·维克托·沙利(波兰语:Andrzej Wiktor Schally,1926年11月30日-),以安德鲁·V·沙利(Andrew V. Schally)知名,出生于波兰维尔纽斯,具有波兰、匈牙利、法国和瑞典血统。他是一位