如何用通俗易懂的方式解释什么是算法?

 2024-03-19 01:07:13  阅读 0

1. 初懂算法,从1+1开始

当孩子学习加法时,他们通常从数手指开始。 一根手指加一根手指就是两根手指,所以1+1=2。

当我还是个孩子的时候,我通过数火柴棒来学习加法。 3+4=? ,从一盒火柴盒中取出三根火柴,放在左边,再取出三根火柴,放在右边,然后数一数,一共有7根火柴,所以3+4=7。

你可以用手指或火柴做算术题,但如果没有这些辅助工具,你会感到困惑。 与其说我在做三加四,不如说我在做三场加四场的时候,我知道总数。 有多少场比赛? 这个过程称为实践和具体思考。 在强化学习领域,这称为试错法。

随着年龄的增长,心智的成熟,我们做100以内的算术题不再需要数手指、划火柴,而是可以看到两个数字,即使我们以前没有做过同样的题,只要在心里计算一下,就可以立即得到答案。 这一过程称为学习、举一反三、抽象思维。 在强化学习领域,这称为泛化。 ()。

但如何让程序计算出1+1=2呢?

观察这个公式,左边有一个数字,右边也有一个数字。 如果将两个数字相加,则可以得到2。推而广之,程序如何不仅可以计算1+1和100以内的相加,还可以计算更大范围的数字的相加呢?

中文描述

函数 加法(左边,右边):
  结果=左边+右边
  返回 结果

用文字描述一下:

def add(l,r): 
  result=l+r 
  return result

def定义了一个名为add(英文的缩写)的函数,意思是加法。

add(),放两个参数,l代表左边的数字相加,r代表右边的数字,(英文left和right的缩写),用逗号隔开,这两个参数只定义了两个变量,什么这里指定的是形式,而不是具体值,所以我们把括号里的参数也称为形式参数。

,这是一个变量,用来保存l和r相加的结果。 您也可以将其称为“数据”。

返回两个数字相加的结果。

在函数体中调用该函数即可获取计算结果并运行。

print(add(1,1)) 
//输出结果为 2

左边的参数为1,右边的参数为1,它们都是实际值,所以函数中的参数也称为实际参数。

回头看这三行代码,它实现了什么功能呢? 如果传入两个参数,就会返回两个参数相加的结果,有输入,有输出。 你可以称之为“函数”,可以称之为“方法”,可以称之为“处理数据的逻辑”,当然,你也可以称之为“算法”。

def add(l,r): 
  result=l+r 
  return result

2. 算法初级

这个怎么样? 算法很简单吧? 简单吧?

嗯嗯,有新的需求,请继续看下去。

现在我的老板要求我改进这个算法。 上面的算法只返回两个数的结果,并没有像数学作业书那样返回一个公式。 如果你想返回一个公式,比如 1+1=2 怎么办?

嗯,这并不难。 我们再看一下这个公式。 它由什么组成? 第一个是最左边的参数,是1,后面是加号运算符,下一个参数是1,然后是等号,最右边的计算结果是2。你只需要把这些部分放在一起就可以了。 ,只是这次它返回的不是数字,而是字符串。

更改你的名字并执行它。

语言说明:

def add2(l,r):
  result=l+r
  str=(print(f"{l}+{r}={result}"))
  return str

这个怎么样? 很受欢迎吧? 简单吧?

哼,提到了一个新的要求。 请继续阅读。

现在老板要我改进算法。 他现在想要计算三个数字相加的结果。

好吧,改个名字,模仿猫吧。

def add3(l,m,r):
  result=l+m+r
  str=(print(f"{l}+{m}+{r}={result}"))
  return str

这个可以吗? 问题解决了?

解决了,两个数相加,用add2,输出三个数的计算,用add3,没问题。

但是四个数字呢? 五个数字呢? 那么一百这个数字呢? 还需要一一写算法吗? 当然不是。 在编写算法时,我们需要考虑算法的复用。

是否可以编写一种算法,无论传入多少个数字都可以计算出来,仅使用一种算法? 如果不求别的,只要求前100个正整数之和就可以了。

3.如何保存100个整数?

当然,作为一个程序员,无非就是操作和爽操作。

首先,肯定是可以一一写出来的。 这个算法并不复杂,但是会很累。 我们在写算法的时候,一定要考虑算法的可扩展性和可维护性。

这样如何保存这100个数字呢? 这时候我们就需要用到数据结构了。 到了这个阶段,我们可以简单粗暴地将数据结构理解为一个容器,它是用来保存数据的。 就像拿起瓶子一样。 以前,你把它们一一捡起来。 现在你可以把它们放进袋子里了。 将这些瓶子连成一片,方便携带,又不耽误工作。 最后,你可以卖个好价钱。 这个麻袋是一个数据结构。

这里需要用到循环,不管是for循环还是while循环。 编写循环时,必须掌握循环三的基本要素,即循环变量的初值、循环体和循环的终止条件。

其中,方括号用于表示数组[]。 我们使用一个数组来保存这 100 个数字,并使用 for 循环来赋值。 因为range表示的区间左开右闭,即[1,101),大于等于1小于101。因为我们要求前100个整数,所以1+2+3 +..+99+100,所以这里写的是101,而不是100。

//两种写法

//for循环赋值 ,普通写法
arr=[]
for i in range(1101):
  arr.append(i)
  i+=1


//列表推导,简洁写法
arr=[i for i in range(1,101)]

4. 如何求100个整数的和?

一般来说,解法有三种,分别是小学生解法、中学生解法和数学家解法。

对于小学生来说,最好的解决办法就是将1到100之间的100个数字一一相加。

语言说明:

def sum(arr):
  result=0; //初始值为0
  for i in range(0,len(arr)): //从数组中第0个元素,到数组中的最后一个元素
      result=result+arr[i]
      i=i+1
  return result

for循环不仅可以赋值,还可以取值。 这里,我们将参数,即包含前100个正整数的数组传入函数中,使用for循环去掉下标,每次检索时都将其添加进去。

至于为什么数组的下标是从0开始而不是从1开始,也很容易理解,因为下标就是索引,代表偏移量。 就像数轴都是从0开始一样,1表示距离原点1的数字,向右偏移1个单位。

中学生解决方案:

中学生想,每次只求前两个数的和,1+2=3, 3+3=6, 6+4=10, (1+...99)+100,加上100 个数字,将它们分成 2 个数字相加 100 次。 递归解。 给自己打电话。 每加一,之前的数字就会减一。 当数组为空时,将返回0。 这不行吗?

def sum(arr):
  if arr==[]: //递归结束条件
    return 0
  else:
    result=arr[0]+sum(arr[1:]) //递归调用
  return result

递归调用自身将一个大规模问题分解为多个小规模子问题。 乍一看可能有点混乱,但是写多了,感觉非常简洁、优雅。

作为一个中学生,写完之后,突然灵机一动,产生了逆向思维。 由于我想找到前 100 个正整数,所以我不会从 1 到 100 加,而是相反,从 100 到 1。 100+99, 199+ 98,...(100+99+92+ ...2)+1,所以不需要传递数组,只需要传递一个数字。

def sum(num):
  if num==1: //递归结束条件
    return 1
  else:
    result=num+sum(num-1)//递归调用
  return result

数学家的解:

关于这个解决方案有一个故事,相当有趣。

有一个小男孩,7岁时第一次上学。 头两年和其他学生没有什么不同。 第三年,他进入数学班。 在此之前,孩子们从未听说过算术。 数学老师是巴特纳()。 有一次,他给全班同学出一道题,要求学生把1到100的所有整数相加。老师一解释完问题,就计算出了答案。 ,5050。 这个小男孩的名字叫高斯,他用的方法是(1+100)*50,这也是后来著名的求和公式。

它非常简单且有效。 就是(第一项+最后一项)*项数/2。体现在算法中,也很简单。

语言说明:

def sum(num):
  result=(1+num)*num/2
  return result

5、谁的算法更好?

一个小学生、一个中学生和一个数学家使用了不同的算法,但都得到了正确的结果。 能说他们的算法水平同样精湛吗? 有没有一个统一的标准来评价他们三人的算法水平? 谁的文章更短? 谁能写得更快?

一般来说,我们在评价一个算法的好坏时,都会用大O表示法(Big O)来评价算法的好坏,而这个O的含义就是“Order of...”的缩写(.. .order),表示随着数据量越来越大,程序执行时间或者占用空间的增长趋势,也就是看这个算法的程序执行次数和占用的内存空间,也叫时间复杂度和空间复杂度。

具体来说,时间复杂度是指随着数据规模的增大,代码执行时间的变化趋势,因此也称为渐近时间复杂度(time),也就是常说的时间复杂度。 同样,空间复杂度是指算法的数据大小与存储空间增长之间的关系。 整个过程的渐近空间复杂度(空间)通常称为空间复杂度。

编程算法是什么意思_编程算法意思是指_编程算法的概念

常用排序的复杂度分析

计算时间复杂度时,不考虑空间复杂度; 计算空间复杂度时,不考虑时间复杂度。 有时用空间换时间,有时用时间换空间。 当然,选择的时候其实还有更多的考虑,要看具体的需求和实际的业务场景。

在上面的场景中,毫无疑问数学家的算法是最高效的。 中学生的递归写法会占用较多的内存。 当循环次数达到一定数量时,就会导致堆栈溢出(stack)。 例如,函数调用是通过栈(stack)的数据结构来实现的。 每次进入一个函数时,调用该函数时,都会向栈中添加一层栈帧。 当函数返回时,栈中会减去一层栈帧。 由于栈的大小不是无限的,过多的递归调用会导致栈溢出。 循环1000次左右就会报错:deep in。也就是说,如果我们求前1000个正整数的和,中学生就不会用同样的方法写了。

小学生的写法符合大多数人的直觉。 虽然看起来很冗长,但实际上并没有占用多少内存空间。

我用这个小学生的写法,写了一个输出函数,实现加法的输出。

def sum(arr):
    result=0
    for i in range(0,len(arr)):
        result+=arr[i]
    for j in arr:
        if(j<len(arr)):
            print(f"{arr[j-1]}+",end="")
            if(j%10==0):
                print("")
        else:
            print(f"100={result}")
    return result

输出如下:

编程算法是什么意思_编程算法意思是指_编程算法的概念

6. 算法到底是什么?

给你一堆数字,找出一个数字; 给你一个无序数组并将其排列成有序数组。 这些都是算法。

上面写了这么多,读了这么久,就是为了找到算法的感觉,减少对算法学习的恐惧。 人工智能涉及的数学、考研数学还不够,但软件开发涉及的数学,有初中数学基础就可以掌握。 。

这些流程是实际开发中的常态。 对于很多逻辑代码来说,一开始就很难写出最优解。 算法根据业务不断添加和修改,版本不断发布和修改。 有时程序员会开玩笑说他们90%的时间都花在调试上,这也是错误的。

你也听说过程序=数据结构+算法。 当然,除此之外,设计模式和编程范式在软件开发中也非常重要,就不赘述了。

在写上面的过程中,我并没有给出算法的定义,那么算法到底是什么? 我引用了维基百科和很多权威教科书的定义。 他们对算法的描述并不完全一致,即使是顶级专家也是如此。 民间也有不同意见,没有达成共识。

算法(英语:),在数学(算术)和计算机科学中,是指计算机可以执行其指令的一组定义的、有限的步骤或序列。 它常用于计算、数据处理和自动推理。 算法是有效的方法,包含一系列明确定义的指令,可以在有限的时间和空间内清楚地表达。 ——维基百科

算法()是指定用于解决某一类型问题的有限长度操作序列。

算法必须满足以下五个重要属性。 (1) 有限。 算法必须始终在执行有限数量的步骤后结束,并且每个步骤必须在有限的时间内完成。 (2)确定性。 算法中明确规定了每种情况下应该执行的操作,没有歧义,以便算法的执行者或读者可以清楚地理解其含义以及如何执行。 (3)可行性。 算法中的所有操作都可以通过执行已经实现的基本操作有限次数来实现。 (4)输入。 算法有零个或多个输入。 当将算法描述为函数时,输入通常由形式参数表示,其值在调用时从调用函数中获取。 (5)输出。 算法有一个或多个输出,即算法进行信息处理后得到的结果。 没有输出的算法没有任何意义。 当使用函数描述算法时,输出通常用返回值或引用类型的形式参数来表示。 ——《数据结构C语言版》严伟民

算法是解决适合计算机实现的问题的方法。 ——《算法》第四版,凯文·韦恩

通俗地说,算法()是任何明确定义的计算过程,它将某个值或一组值作为输入并产生一些值或一组值作为输出。 因此,算法是将输入转换为输出的一系列计算步骤。

我们还可以将算法视为解决明确的计算问题的工具。 一般来说,问题陈述陈述了所需的输入/输出关系。 算法描述了实现这种输入/输出关系的特定计算过程。 ——《算法导论,第三版》

7. 生活中的算法

我们为什么要学习算法? 学习算法的目的是什么?

数据结构和算法是计算机专业大二学生的必修课。 学习了语言基础知识后,你可以立即学习算法。 学习算法的目的非常重要,就是训练学生像计算机一样思考问题,进而改进自己的代码。 质量。

当然,我个人认为算法的定义不仅仅局限于数学和计算机领域。 生活中,算法无处不在。

菜谱,是算法吗? 我个人认为,是的。 输入一堆蔬菜,经过一系列流程,输出一盘美食。 为什么不算呢?

学习,是算法吗? 我个人认为,是的。 通过阅读和学习,从无知的状态到少无知的状态,这两种状态之间转换的过程不就是一种算法吗?

健身,是算法吗? 我个人认为,是的。 通过系统的训练和训练动作的安排与组合,可以使身体从一种状态转变为另一种状态。 这种通过可能的设计来改变身体的状态,不就是一种算法吗?

8.算法入门学习路线

考研课程408的难度属于中等偏上。 算法是408的重点和难点,学起来慢也无所谓。

如果没有任何基础,先学一门编程语言,比如C#、Java、C、CPP。 学完就直接上算法了。

可以从《算法图解》和《大话数据结构》的描述开始,对算法和数据结构有一个感性的认识。 首先有一个大概的了解。 如果遇到卡住的地方,立即跳过。 不要被困住,稍后再回来。 看。

之后,你可以阅读大学教科书。 教材的优点是非常系统,有助于构建知识体系。 国内教材中,我个人比较喜欢严伟民老师的《数据结构》。

国外的教材就是《算法4》和《算法导论》那两本圣书。

编程算法是什么意思_编程算法的概念_编程算法意思是指

我个人会推荐的“算法4”Java描述。 没读之前,感觉大家都在吹牛。 读着读着,我觉得吹牛还不够。

一旦你学会了Java中的泛型,你就可以掌握它。 普林斯顿不仅托福成绩好,算法课程也一流。 对于我这个算法初学者来说非常友好。 我有一个同学,算法课用的是大黑书《算法导论》,还是英文的。 学习起来是非常痛苦的。 我也尝试过读《算法导论》,但是个人能力不够,读起来不太舒服。 而且,从那以后,我就远离了任何书名带有“致XX”的书。

之后有针对性地慢慢回答问题,边学边学。 如果遇到不懂的或者卡住的,先看答案。 读完后不要感到自卑。 为什么别人写得那么好? 如果你忘记了,也不要感到自卑。 我们就这样走到了这里,继续前进,不回头。

标签: 算法 数组 描述

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码