算法,离你并不遥远

news2024/11/23 8:06:36

算法,离你并不遥远

  • 引子
  • 什么是算法?
  • 为什么算法很重要?
  • 什么时候开始学算法?
  • 狭隘的算法定义
  • 算法从现在学起,从现在用起
  • 算法永不过时

引子

今天又是搬砖摸鱼胡混的一天,在问答闲逛,看到了一个问答,题主对算法学习有了一点点的小疑问,问答地址:https://ask.csdn.net/questions/7921824。不知道题主是怎么看待算法这件事的,老顾认为,算法,就在我们身边,就在我们所写的任何代码里。

什么是算法?

在学校学习的小学生们,会说,加减法乘除法是算法,没错。中学生们会说,数学公式,物理公式,化学反应公式是算法,很对。大学生们会说,统计学,各种猜想是算法,都对。

那么,在计算机领域里,什么是算法?

计算机算法是以一步接一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程,或者说,算法是对计算机上执行的计算过程的具体描述。

上边这个关于算法的描述,摘自百度百科。

那么,先不看百科后边的内容,以老顾的浅见,只要你使用计算机进行了编程,将数据正确的录入,正确的处理,在有限的时间内返回了正确的结果,那就是你实现了你的需求,这就是最基本的算法,那怕他再土,那怕他比较耗费时间,耗费计算机内的资源,他也还是算法。

再看百度百科对算法的定义。

一个算法必须具备以下性质:
(1)算法首先必须是正确的,即对于任意的一组输入,包括合理的输入与不合理的输入,总能得到预期的输出。如果一个算法只是对合理的输入才能得到预期的输出,而在异常情况下却无法预料输出的结果,那么它就不是正确的。
(2)算法必须是由一系列具体步骤组成的,并且每一步都能够被计算机所理解和执行,而不是抽象和模糊的概念。
(3)每个步骤都有确定的执行顺序,即上一步在哪里;下一步是什么,都必须明确,无二义性。
(4)无论算法有多么复杂,都必须在有限步之后结束并终止运行;即算法的步骤必须是有限的。在任何情况下,算法都不能陷入无限循环中。
一个问题的解决方案可以有多种表达方式;但只有满足以上4个条件的解才能称之为算法。

很好,这就是算法,当你写了一个简单的代码,那怕是两个数相加,得出结果,他也是算法。

比如老顾学编程的第一个代码,微机课老师在讲台上巴拉巴拉了半天,没听懂,就知道最后是让5个数字从小到大排个序。

很多小伙伴们直接就会告诉现在的老顾,冒泡排序啦,快速排序啦,归并排序啦等等等等8、9、十来种。老顾当时不懂啊,生生用 60 个 if 指令,121行代码完成了5个数字的排序。

那么,老顾在不使用各种排序算法的情况下,这121行代码算不算排序算法呢?老顾认为是算的,虽然他很土,虽然他不优美,虽然他效率低下,虽然他适用范围很小,虽然有各种各样的缺陷,但他能完成任意5个数字的排序,他是能得到正确结果的。所以,老顾认为这就是一个不那么能说的出口的算法实现。

为什么算法很重要?

其实,自从有了计算机以来,所有的操作都是受限于硬件条件的,为了在有限的条件内完成复杂的运算,所以算法被单独拿了出来。

所有的算法,都是有一个基本的隐藏条件在里面的,即在不使用超出当前计算机性能的情况下,尽可能快的完成一些复杂的计算。这是算法的唯一目标。

他是以节省计算机性能为目的而存在的,当我们有很多运算,每一个算法能节约一点性能,那么能完成的事情就越多。尤其是一些大量数据运算的时候,一个好的算法是可以用令人惊叹的速度完成一些计算的。

所以,在当前,计算机没有发展到无限性能时,节约内存,节约算力,才是算法的根本目的。

什么时候开始学算法?

其实,在学习编程的时候,你就已经踏入了算法的大门,就像老顾第一个代码一样,只要你能完成运算的流程控制,那么你就算是完成了基本的算法。就像是武学里一样,当你拿起了剑,一通乱挥,那也可以称之为吓激霸挥剑法。相声里还有王八拳呢,怕啥,能完成代码,得到正确的结果,过程可控可复现,那就是算法。

两个循环的控制,就可以完成排序中最入门的冒泡排序了,这难道不是算法吗?编写一个函数,计算阶乘,这难道不是算法了吗?再说到人工智能,大数据模型,他就是由无数小算法用大的方向控制并融合的一个更复杂的算法。

那么,算法就是从你学会流程控制,完成了第一个运算的时候,就已经陪伴在你身边了。

说回到问答的这个小伙伴,他的疑问则是另外的说法了。

狭隘的算法定义

按照这个小伙伴的描述,应该是在 leetcode 或者牛客之类的网站在刷题,目前自我解答能力不太够,可能无法得到比较好的成绩,所以迷茫了。他所认为的算法,就是这些题解中提到的什么动态规划,什么栈堆,什么指针之类的。

老顾在这里不得不吐槽一句,老顾靠写代码吃饭这么多年,真tmd的就不知道这些算法具体的名字叫个啥。反正是天下文章一大抄,这边抄来那边抄,抄来抄去就抄会了,但谁关心他叫啥,我关心的是能不能解决我的问题,能不能节约我的服务器的性能。

当然,老顾这么说不是觉得算法不重要,而是你不能狭隘的去看待算法,算法的存在目的刚才也说了,就是为了节约性能,很多题中都有具体要求,必能超过多少内存,不能超过多少时间,这就是为了给刷题的人提个醒,计算机的性能是有限的。所以,对于像 leetcode 这样的题库来说,他里面的题目大部分都是基础题,甚至有的只需要一两行代码就能完成的,他这些题是为了让没有见过类似题型、问题的人有一个见多识广的途径。刚才老顾也说来抄来抄去就抄会了,那怕你不在这些地方刷题,在工作中解决的问题多了,这些算法不说会大半,小半还是会有的。

而且,真正的需求,是开发人员进行问题拆分,拆成多个小问题,当一个小问题有对应的算法时,这就是相对优的解答了。大部分的码农,就是这样用现成的相对优的算法拼搭出来问题的解决方案和实现过程的。

算法从现在学起,从现在用起

老顾一直认为,计算机开发,其实就是一个搭积木的过程。他不需要你有特别高深的研究能力,只需要你见多识广,能用自己知识体系内的算法,或者百度、谷歌来的算法,完成你的任务,搭建好工程内容,那就是一个好的代码工人。

算法不仅仅是开发程序在用,计算机的一切,都是通过算法实现的,操作系统本身就是一个集各种算法于一身的整体,每个软件都有其自称体系的算法集合。

在刷 leetcode 的题目之前,老顾在工作中从没有碰到过01背包这样的问题,但是刷题之后,学会了这个,那么工作中,总会有用得到的时候。不怕学的多用不上,而是怕到用的时候,根本就没有概念,不知道怎么解决。

所以,老顾对所有刚刚入行,以及所有没有深入学习的小伙伴们送上一句祝愿:算法,从现在学起,从现在用起。

计算机算法并不高深,他不用我们去弄懂那些犹如天数一般的数学公式,只需要我们会用,那就是好的。从来没有听说过厨师还会自己打一口锅,造一把刀的,会用,就是开发人员的基本要求。

算法永不过时

老顾流浪在培训班的时候,有个姓冀的老师,嗯也是高校高学历人才,对老顾说,你用程序画个哆啦A梦需要多少行代码?老顾想了想,琢磨了琢磨,不打确定的说,大概需要80行(basic)?那位老师就说,想办法优化代码,能写到50行以内算合格,大拿们30行左右就能搞定。

然后听这个老师说,有个世界 demo 大赛,那里面全都是天才,几十kb的代码,能完成普通人所想象不到的绚烂效果(时过境迁,现在也不知道当初的惊艳能不能撼动现在网民们的神经了),这些才是当前的算法极致。可以说,老顾最终走上靠代码吃饭的路,这位老师的影响真的很大。

在那个时期,老顾在这位老师的带领下,算是学到了很多基础的编程算法,为老顾现在打下了坚实基础。现在回过头来看,虽然老顾并不知道这些算法的专门名称,但并不妨碍老顾去运用他们。而且,越是基础的算法,运用就越广泛,在完成了基本流程控制的学习后,越早接触算法,越容易解决一些问题。就像数学一样,基础的永远是用的最多的。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux多线程-2

“我是我境遇里的起步者。” -- 里尔克《布里格手记》 在上一节Linux多线程当中,我们讲述了Linux中线程的概念以及线程的控制内容。这一篇博客承接上次内容,我们来对线程安全进行阐述。 目录 1.线程安全 1.1互斥的实现 1.1.1互斥锁实现互斥 1.1.2互…

启动 Ethereum(上海) 主网全节点

问题描述 采用最新的geth版本之后,按照之前的方法启动geth主网节点会出现如下问题: Post-merge network, but no beacon client seen. Please launch one to follow the chain!问题原因 The above message is emitted when Geth is run without a conse…

PyTorch深度学习实战 | 神经网络的优化难题

即使我们可以利用反向传播来进行优化,但是训练过程中仍然会出现一系列的问题,比如鞍点、病态条件、梯度消失和梯度爆炸,对此我们首先提出了小批量随机梯度下降,并且基于批量随机梯度下降的不稳定的特点,继续对其做出方…

SpringBoot集成Dubbo启用gRPC协议

文章目录前言项目结构代码示例父工程api moduleservice module注意事项区别本文记录下SpringBoot集成Dubbo启用gRPC协议,以及与原生 gRPC 在代码编写过程中的区别。 下面还有投票,帮忙投个票👍 前言 Dubbo 在 2.7.5 版本开始支持原生 gRPC 协…

【软件测试】浅了解什么是软件测试及开发测试模型

目录 1.什么是软件测试? 2.什么是需求? 3.什么是测试用例 4.什么是软件错误(bug)? 5.开发模型和测试模型 5.1软件的生命周期 5.2瀑布模型 5.3螺旋模型 5.4软件测试V模型 5.5软件测试w模型 6.软件测试的生命周…

Redis第二十九讲 Redis集群发布订阅模式以及Redis集群事务

Redis集群状态下的发布订阅 在Redis的几个基本数据结构介绍中,有讲过List数据结构,可以使用List的阻塞特性实现订阅消费,关于Redis的底层数据结构可以参考我的这篇博客:Redis第六讲 Redis之List底层数据结构实现 底层数据结构基本操作可以看我的这篇博客,Redis第十五讲 R…

【从零到Offer】- 泛型

泛型是个啥 ​ Java 泛型是 JDK 5 中引入的一个新特性,其提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 ​ 通过将数据类型参数化&#xf…

用opencv+playwright过滑动验证码

目录 梳理思路 编写代码 总结与提高 在本节,我们将使用opencv和playwright这两个库通过QQ空间的滑动验证码。 梳理思路 1. 使用playwright打开浏览器,访问qq空间登录页面。 2. 点击密码登录。 3. 输入账号密码并点击登录。 4. 出现滑动验证码图片后…

大型语言模型综述,非常详细,格局打开!A Survey of Large Language Models

大型语言模型综述,非常详细,格局打开!A Survey of Large Language Models 返回论文和资料目录 论文地址 项目地址 1.导读 讲得通俗易懂,且格局拉满!基本覆盖了自ChatGPT以来的AI比较火的事件,还多次提到…

AI 模型首次有了国家标准!头部大厂参与编制,辐射 AMD

3月17日,国内首个面向人工智能生成式模型的国家标准正式公开,并向社会征求意见。 该标准全称为《信息技术神经网络表示与模型压缩第一部分:卷积神经网络》 (GB/T 42382.1-2023&a…

【Linux系统下安装JDK】

一,linux下载JDK最方便快捷的方式:yum 1,执行下方命令,查看可安装java版本。 yum -y list java*2,选择一个进行安装,带-devel的安装的是jdk,而不带-devel的安装的是jre 3,安装命令…

【springBoot篇1】概念、创建和运行

目录 一、什么是springBoot?为什么要学springBoot springBoot的优点:(5点) 优点1:快速集成框架 优点2:内置了Tomcat容器 优点3:快速部署项目 优点4:少配置,多注解 优点5:支持更…

机器学习中的公平性

文章目录机器学习公平性评估指标群体公平性指标个人公平性指标引起机器学习模型不公平的潜在因素提升机器学习模型公平性的措施机器学习公平性 定义: 机器学习公平性主要研究如何通过解决或缓解“不公平”来增加模型的公平性,以及如何确保模型的输出结果…

生信刷题之ROSALIND——Part 1

目录写在前面1、Counting DNA NucleotidesProblemSample DatasetSample OutputCodeOutput2、Transcribing DNA into RNAProblemSample DatasetSample OutputCodeOutput3、Complementing a Strand of DNAProblemSample DatasetSample OutputCodeOutput4、Rabbits and Recurrence…

Android操作系统介绍

目录 Android 名词 Android LOGO 体系架构 Android系统架构 Linux 内核 硬件抽象层(HAL) Android Runtime 原生C/C库 Java API框架 系统应用 应用组件 活动 (Activity) 服务 (Service ) 广播接收器 &…

BLOOM模型结构详解

《BLOOM: A 176B-Parameter Open-Access Multilingual Language Model》 论文地址: https://arxiv.org/pdf/2211.05100.pdf 代码地址: transformers库-modeling_bloom.py BigScience 官方提供的代码链接并没有找到完整的模型实现代码,只有提示说模型结构代码是在 Megatron 的…

JS 中深拷贝的几种爱恨情仇

页面开发中,经常会碰到需要对数据进行某些处理操作,又不想影响原先的数据,所会经常将数据进行拷贝,当然这里指的是深拷贝。 深拷贝和浅拷贝的区别? 深拷贝通通俗点来讲呢,其实就是不管当前要操作的数据层级…

目标检测算法——YOLOv5/v7/v8改进结合涨点Trick之Wise-IoU(超越CIOU/SIOU)

超越CIOU/SIOU | Wise-IoU助力YOLO强势涨点!!! 论文题目:Wise-IoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism 论文链接:https://arxiv.org/abs/2301.10051 ​ 近年来的研究大多假设训练数据中的…

Java实现发送邮件(定时自动发送邮件)

系列文章目录 Redis缓存穿透、击穿、雪崩问题及解决方法Spring Cache的使用–快速上手篇分页查询–Java项目实战篇全局异常处理–Java实战项目篇 该系列文章持续更新,更多的文章请点击我的主页查看哦! 文章目录 目录 系列文章目录 文章目录 前言 一…

算法训练第五十七天 | 647. 回文子串、516.最长回文子序列、动态规划总结篇

动态规划part17 647. 回文子串题目描述思路暴力解法动态规划双指针法 516.最长回文子序列题目描述思路 动态规划总结篇动划基础背包问题系列打家劫舍系列股票系列子序列系列总结 647. 回文子串 题目链接:647. 回文子串 参考:https://programmercarl.com…