C++算法

文章探讨了算法在编程中的重要性,比较了全排列和选择排序算法在对50个数字排序上的时间消耗,强调了选择简单高效算法的重要性。全排列算法耗时巨大,而选择排序则显著更快。
摘要由CSDN通过智能技术生成

目录

算法与程序的区别

算法的设计

如何选择算法

对50个数字排序所花的时间竟然比宇宙的历史还要长吗

使用全排列算法进行排序

使用选择排序算法进行排序


算法与程序的区别

    

算法是一种有序的操作序列,解决问题或完成任务的步骤。它可以应用于各种领域,如计算机科学、数学、工程等。在计算机科学中,算法是编程中非常重要的一部分,它可以帮助我们有效地解决各种问题。

算法的特点是确定性、有限性、输入、输出和可行性。确定性指的是算法中每一步的行为都是明确而确定的,执行结果是可预测的。有限性指的是算法必须在有限的时间内完成,不能无限循环。输入和输出是算法的入口和出口,算法根据输入产生输出。可行性指的是算法是可行的,能够被计算机实现。

算法可以按照不同的方式分类,如分治算法、贪婪算法、动态规划算法等。其中,分治算法是一种将问题分解成小问题来解决的方法。贪婪算法是一种每一步都选择当前最优解的方法。动态规划算法是一种通过将问题划分成多个子问题,并保存已计算的结果来解决问题的方法。

算法可以用伪代码或编程语言表示。伪代码是一种近似于编程语言的描述方式,不需要严格遵循语法规则,但能够清晰地描述算法的步骤和逻辑。编程语言是一种具体的计算机语言,可以被计算机执行。

算法的设计

计算机擅长高速执行一些基本命令,但无法执行复杂的命令。此处的“基本命令”指的是“做加法”或者“在“指定的内存地址上保存数据”等

计算机是以这些基本命令的组合为基础运行的,而面对复杂的操作,也是通过搭配组合这些基本命令来应对的。“对n个数字进行排序”对计算机来说就是复杂的操作。如何设计算法来解决这个排序问题,也就等同于构思如何搭配组合计算机可以执行的那些基本命令来实现这个操作。

如何选择算法


能解决排序问题的算法不止选择排序这一个。那么,当有多个算法都可以解决同一个问题时,我们该如何选择呢?在算法的评判上,考量的标准也各有不同。
比如,简单的算法对人来说易于理解,也容易被写成程序,而在运行过程中不需要耗费太多空间资源的算法,就十分适用于内存小的计算机。
不过,一般来说我们最为重视的是算法的运行时间,即从输入数据到输出结果这个过程所花费的时间。


对50个数字排序所花的时间竟然比宇宙的历史还要长吗


使用全排列算法进行排序


为了让大家体会一下低效率算法的效果,这里来看看下面这个排序算法。

1生成一个由n个数字构成的数列(不和前面生成的数列重复) 
2如果1中生成的数列按从小到大的顺序排列就将其输出,否则回到步骤1 

我们就把这个算法称为“全排列算法”吧。全排列算法列出了所有的排列方法,所以不管输入如何,都可以得到正确的结果。
那么,需要等多久才能出结果呢?若运气好,很快就能出现正确排列的话,结果也就立马出来了。然而,实际情况往往并不如我们所愿。最差的情况,也就是直到最后才出现正确排列的情况下,计算机就不得不确认所有可能的排列了。
n个数字有n!种不同的排列方法(n!=n(n-1)(n-2)...3·2·1)。现在,我们来看看n=50 时是怎样一种情况吧。

1.50!=50*49*48...3*2*1

2.       50*49*48...3*2*1>50*49*48...13*12*11

3.                                    50*49*48...13*12*11>10^40

公式1中,50!即为数字1到数字50的乘积。为了便于计算,我们通过公式2,3将结果近似转换为10的n次方的形式。公式2右边部分去掉了10以下的数字,因此小于50!。公式左右都是40个数字的乘积,但左边数字都大于10,因此大于右边的10^40。接下来我们就用10^40近似代表50个数字的所有排列情况来进行计算。
假设1台高性能计算机1秒能检查1万亿(=10^12)个数列,那么检查10^40个数列将花费的
时间为10^40/10^12=10^28秒。1年为31536000秒,不到10^8秒。因此,10^28秒>10^20年。
从大爆炸开始宇宙已经经历了约137亿年,即便如此也少于10^11年。也就是说,仅仅是对50个数字进行排序,若使用全排列算法,就算花费宇宙年龄的10^9倍时间也得不出答案。

使用选择排序算法进行排序

那么,使用选择排序算法,情况又将如何呢?
首先,为了在第1轮找到最小的数字,需要从左往右确认数列中的数字,只要查询n个数
字即可。在接下来的第2轮中,需要从n-1个数字中寻找最小值,所以需要查询n-1个数字。
将这个步骤进行到第n轮的时候,需要查询的次数如下。
n+(n-1)+(n-2)+...3+2+1= n(n+1) /2<=n^2 
n=50的时候n^2=2500。假设1秒能确认1万亿(=10^12)个数字,那么2500÷10^12=0.0000000025 
秒便能得出结果,比全排列算法的效率高得多。

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值