首页 > 编程语言 >算法导论-第1章-算法在计算中的作用

算法导论-第1章-算法在计算中的作用

时间:2023-04-01 13:45:17浏览次数:40  
标签:10 归并 计算机 插入排序 导论 算法 计算 排序

第1章 算法在计算中的作用

1.1 算法(Algorithms)

非形式地说,算法(algorithm)是任何明确定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或某个值的集合作为输出。因此算法就是将输入转换为输出的一系列计算步骤。

Informally, an algorithm is any well-defined computational procedure that takes some value, or set of values, as input and produces some value, or set of values, as output in a finite amount of time. An algorithm is thus a sequence of computational steps that transform the input into the output.

我们也可以把算法看成是用于求解明确说明的计算问题的工具。问题的声明一般指定了问题实例所期望的输入/输出关系。算法则描述了一个特定的计算过程来实现输入/输出关系。

You can also view an algorithm as a tool for solving a well-specified computational problem. The statement of the problem specifies in general terms the desired input/output relationship for problem instances, typically of arbitrarily large size. The algorithm describes a specific computational procedure for achieving that input/output relationship for all problem instances.

例如,假设您需要将一个数字序列排序为单调递增的顺序。

输入:\(n\)个数的序列\(<a_1,a_2,\cdots,a_n>\)

输出:输入序列的一个排列\(<a_1^{'},a_2^{'},\cdots,a_n^{'}>\),满足\(a_1^{'} \le a_2^{'} \le \cdots \le a_n^{'}\)

给定输入序列\(<31、41、59、26、41、58>\),一个正确的排序算法返回作为输出的序列\(<26、31、41、41、58、59>\)。这样的输入序列称为排序问题的一个实例(instance)

算法能解决哪些问题?(What kinds of problems are solved by algorithms?)

  • 人类基因组计划:存储人类DNA信息在数据库中。采用算法对DNA序列进行分析,比如采用第14章的动态规划算法。
  • 互联网:计算机网络的路由算法,采用第22章单源最短路径算法。搜索引擎采用第11章的哈希表和第31章字符串匹配等技术。
  • 电子商务:保证信息的安全性,采用第31章加密与数字签名等技术。
  • 制造业和其它商务企业:需要分配资源,采用第29章线性规划技术。
  • 地图寻路:找出起点到终点的最短路径,采用第22章单源最短路径算法。
  • 机械设计零部件的拓扑排序:需要应用第20章图的基础算法。

数据结构(Data structures)

数据结构是一种存储和组织数据的方式,旨在访问和修改。

A data structure is a way to store and organize data in order to facilitate access and modifications

技术(Technique)

本书可以当做工具书来使用,本书也会教你如何设计和分析算法。

难题(Hard problems)

旅行商问题(英语:Travelling salesman problem, TSP),问题内容为“给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。”

1.2 算法作为一种技术(Algorithms as a technology)

计算时间和存储空间都是有限资源,所以应该选择能够有效利用时间和空间的算法。

效率(Efficiency)

举例来说,第2章将要介绍的两个排序算法。第一个称为插入排序(insertion sort),对\(n\)个项进行排序,大约需要\(c_1n^2\),其中\(c_1\)是不依赖于\(n\)的常数。第二个称为归并排序(merge sort),对\(n\)个项进行排序,大约需要\(c_2n\log n\),\(c_2\)是另一个不依赖于\(n\)的常数。与归并排序相比,插入排序通常具有一个较小的常数因子,即\(c_1 \lt c_2\)。虽然对于小的数据规模来说,插入排序通常比归并排序要快,但是一旦输入规模\(n\)足够大,归并排序\(\log n\)相对于\(n\)的优点足以弥补常数因子的差别。不管\(c_1\)比\(c_2\)小多少,总会存在一个交叉点,超出这个点,归并排序更快。

举一个具体的例子,让我们将运行插入排序的速度更快的计算机(计算机A)与运行合并排序的速度较慢的计算机(计算机B)进行比较。他们每个人都必须对1000万个数字进行排序。假设计算机A每秒执行100亿条指令,计算机B每秒执行1000万条指令,所以计算机A就纯计算能力来说是计算机B的1000倍。为了使差异更加显著,假设世界上最“聪明”的程序员用计算机A的机器语言进行插入排序,并且得到的代码需要\(2n^2\)条指令来对\(n\)个数字进行排序。进一步假设,只有一个普通的程序员实现了合并排序,使用一种具有低效编译器的高级语言,得到的代码需要\(50n\log n\)条指令。为了分类1000万个数字,计算机A需要

\[\frac{2\cdot(10^7)^2 \ instructions}{10^{10}\ instructions/second}=20000\ seconds(more\ than\ 5.5\ hours) \]

而计算机B需要

\[\frac{50\cdot(10^7)\log 10^7 \ instructions}{10^{10}\ instructions/second} \approx 1163\ seconds(less\ than\ 20\ minutes) \]

通过使用一种运行时间增长较慢的算法,即使编译器较差,计算机B的运行速度也比计算机A快17倍以上!当排序1亿个数字时,归并排序的优势更加明显:插入排序需要超过23天,而归并排序需要不到4个小时。一般来说,随着问题规模的增加,归并排序的相对优势也会增加。

标签:10,归并,计算机,插入排序,导论,算法,计算,排序
From: https://www.cnblogs.com/gengduc/p/17278499.html

相关文章

  • 算法导论-第2章-算法基础
    第2章算法基础2.1插入排序(Insertionsort)输入:\(n\)个数的序列\(<a_1,a_2,\cdots,a_n>\)输出:输入序列的一个排列\(<a_1^{'},a_2^{'},\cdots,a_n^{'}>\),满足\(a_1^{'}\lea_2^{'}\le\cdots\lea_n^{'}\)被排序的数称为关键字。在本书中,使用伪代码(pseudoc......
  • VBA 对象数组排序算法分享
     FunctionSrotObjectByProperty(objsToSortAsVariant,PropertyNameAsString,Optional降序AsBoolean=True)IfIsEmpty(objsToSort)ThenExitFunctionIfInStr(TypeName(objsToSort),"()")<1ThenExitFunction'IsArray()issom......
  • CIVE50003 计算方法
    CIVE50003ComputationalMethodsIICoursework–InfluencelinesandbridgestructuresThisprojectistobecarriedoutindividuallyusingtheMatlabprogrammingenvironment.PleasemakeanelectronicsubmissiononBlackboardofareport(nomorethan12pa......
  • 算法笔记之并查集
    一、并查集的定义并查集是一种树型的数据结构,用于处理一些不相交集合(disjointsets)的合并及查询问题。常常在使用中以森林来表示。并查集,顾名思义,支持以下两种操作操作:并(Union):把两个不相交的集合合并为一个集合。查(Find):查询两个元素是否在同一个集合中。二、并查......
  • 8086汇编计算次方,模块化设计
    就是把dw那一行的每个字的数据,求三次方,然后存到dd那一行assumecs:code,ds:datadatasegment dw1,2,3,4,5,6,7,8 dd0,0,0,0,0,0,0,0;;双字,32位dataendscodesegmentmain: movax,data movds,ax callcul;;放到子程序里计算 movax,4c00h int21hcul:......
  • 计算机流水线在正常程序中的体现(效果可视)
    众所周知,流水线技术对于软件开发人员不是可见的(visiable),毕竟已经在在机器语言之下,是组成机器语言的基本逻辑 但今天我就带领大家看看我新发现的结果,那就是流水线的可视效果,包括流水线预测技术的侧面体现,当然也是可见的 首先我先声明一下需要的基础,需要懂16位以及32......
  • 基于凸集上投影(POCS)的聚类算法
    POCS:ProjectionsontoConvexSets。在数学中,凸集是指其中任意两点间的线段均在该集合内的集合。而投影则是将某个点映射到另一个空间中的某个子空间上的操作。给定一个凸集合和一个点,可以通过找到该点在该凸集合上的投影来进行操作。该投影是离该点最近的凸集内的点,可以通过最小......
  • odoo 开发入门教程系列-计算的字段和变更(Computed Fields And Onchanges)
    计算的字段和变更(ComputedFieldsAndOnchanges)模型之间的关系是任何Odoo模块的关键组成部分。它们对于任何业务案例的建模都是必要的。然而,我们可能需要给定模型中字段之间的链接。有时,一个字段的值是根据其他字段的值确定的,有时我们希望帮助用户输入数据。“ComputedField......
  • 【LBLD】小而美的算法技巧:前缀和数组
    【LBLD】小而美的算法技巧:前缀和数组一维数组中的前缀和classNumArray{private:vector<int>preSum;public:NumArray(vector<int>&nums){preSum.push_back(0);for(inti=1;i<nums.size()+1;i++){preSum.push_back(......
  • mp雪花算法生成的id到前端丢失精度问题
    mp生成的id是Long型18位,但是js处理到16位就四舍五入了,解决办法就是在服务器转成字符串传给前端  WebMvcConfig要继承WebMvcConfigurationSupport,重写里面的extendMessageConverters方法@OverrideprotectedvoidextendMessageConverters(List<HttpMessageConv......