C语言每日一练 —— 第21天:算法的应用

文章目录

  • 前言
  • 一、算法简介
    • 1、推荐算法
    • 2、最短路算法
    • 3、最值算法
    • 4、排序算法
    • 5、压缩算法
    • 6、加密算法
  • 二、为什么要学算法
    • 1、面试时
    • 2、工作中
  • 三、算法能给我们带来什么能力的提升
    • 1、抽象问题的能力
    • 2、解决问题的能力
    • 3、编写代码的能力
    • 4、调试能力
      • 1)画图
      • 2)调试
      • 3)print 大法
    • 5、测试能力
  • 四、解决问题的方法
    • 1、读懂题意
    • 2、数据范围
    • 3、抽象出数据结构
    • 4、增删改查
  • 五、经典算法易错问题
    • 1、内存泄漏
    • 2、栈溢出
    • 3、死循环
    • 4、数组越界
    • 5、整型溢出
    • 6、初始化问题
    • 7、边界问题
    • 8、递归出口
    • 9、变量表义不明晰
    • 10、运算符优先级问题
    • 11、等幂性
  • 六、后记

前言

为什么要学算法 ?
算法能给你带来什么能力提升?
算法在实际生中的应用有哪些?

  带着这些问题,我们开始我们今天的内容。直接来吧!

一、算法简介

在这里插入图片描述

  我曾经在某一个网站上看到一段非常触动我的话。我给大家念一念:

相信大家都听过
“面试造火箭,工作拧螺丝”
没错,
拧螺丝的人
只能一直留在岗位上拧螺丝。
而努力拧螺丝的人
说不定就有机会去造火箭。
而那些有造火箭能力的人
他们终究会造上火箭!

  是的,学习看似枯燥,然而,从中寻找出乐趣,并且偶尔给自己一些正反馈,带着激情,热情奔赴,迟早会有属于你的诗和远方。始终相信,星星之火,可以燎原。
  很多人学算法的初衷很简单,就是面试找工作进大厂,没错,不忘初心,方得始终。当然也有真正热爱算法之人,比如说我,以及正在看视频的你。然而真正踏入社会,进入工作,才是揭开你施展算法才华的序幕。

  生活当中处处是算法,那么就由我来简单介绍一下生活中的一些简单算法应用,然后再来讲讲大厂为什么这么注重算法,以及学好算法能够给你带来哪些方面的提升。
在这里插入图片描述

1、推荐算法

  你能看到我这个 视频,是因为你看了大量的算法、知识、计算机等等相关视频,所以算法将我推荐给了你,他认为你应该会喜欢看我的视频,当然,实际你喜不喜欢,还是要看你的反馈,比如说:是否投币、是否点赞、是否收藏、是否发布评论或者弹幕和我进行互动,根据你的反馈,我的视频可能会被推荐给更多和你一样志同道合之人。如果你觉得我说的有道理,也欢迎在弹幕里告诉我,让我增加一点点信心,以后出更加优质的视频。
在这里插入图片描述

2、最短路算法

  你在乘地铁的时候,如果有很多的换乘站,你就要对各种方案进行抉择选出一条最快的路或者选择一条换乘最少的路,这就是最短路问题。

3、最值算法

  比如说你乘完地铁,去吃自助餐,有牛排、大闸蟹、饮料 等等,你以哪种方式决定先吃什么?是不是你最喜欢吃的先吃?
在这里插入图片描述
那不就对应了在一个数组中找一个最大值吗?只不过把最大变成了最喜欢。
在这里插入图片描述

4、排序算法

  排序算法在现实生活中应该是非常常见的,比如幼儿园的小朋友排成一排,一般都是把最高的排在最后,也就是按照身高单调不降排序,这样才能保证每个同学都能看到老师在讲什么?
在这里插入图片描述

5、压缩算法

  你要上传一些东西到你的百度云网盘,但是内容量太大, 是不是要先压缩一下,压缩就是一种算法,他可以将原本空间占用很大的东西压缩的相对较小。
在这里插入图片描述

6、加密算法

  你有一些奇怪的内容,不想让别人看到,你就把它加密,并且保证只有你能够解密,这里的加密也是一种算法。

在这里插入图片描述

二、为什么要学算法

  为什么现在这么多大厂要求算法能力。
在这里插入图片描述

1、面试时

  其实在我毕业的那一年,也就是2010年的时候,感觉也没有太强调算法的能力。只要学校还行、学习成绩不错、笔试题不要被鄙视、稍微有点项目经历,基本就能轻松进入大厂。
在这里插入图片描述

  原因是因为那个时候,用户体量没有现在这么大,所以数据量也不会太大,自然对算法的要求就没有那么高了。你能把基础功能写出来,会一点简单的设计模式基本也就够用了。
  但是现在不行了,经济飞速发展,越来越多的人开始进入到了互联网行业中来,IT精英比比皆是,长江后浪推前浪。人才如泉涌般袭来,竞争也就越来越激烈。
在这里插入图片描述

  举个例子,如果你实现的功能和人数是呈平方关系的、或者立方关系的、甚至指数关系的,那么随着人数的增多,就会使这个功能消耗大量的CPU,而另一个人能够实现同样的功能,并且它的方法和人数呈线性关系。那么在同样数据量的情况下,他的方法肯定更优,我们也会优先录用他,这里的核心就是算法的时间复杂度。

  同样的,如果你实现的功能需要用到的空间和人数是呈平方甚至立方关系的,那么随着人数的增多,就会消耗大量的内存或者硬盘,而另一个人能够实现同样的功能,并且它的方法和人数呈线性关系,他的方法显然更优,我们就会优先录用他。这里的核心就是算法的空间复杂度。
在这里插入图片描述

  相信你一定听过 “空间换时间” 或者 “时间换空间” 这两个概念,只有学了算法,你才能掌握时间和空间的权衡,时间对应了计算机的CPU,空间对应了计算机的内存和硬盘。有关算法的时间复杂度和空间复杂度,后面我会详细进行介绍。
在这里插入图片描述

  由于算法是一个长期锻炼刷题才能养成的能力,不像八股文,你背下来,面试的时候遇到都能应对自如。算法不是,如果没有深入理解,很可能和面试官不在一个轨道上,所以会算法,至少能说明你是一个刻苦的人,能够为了自己的目标去努力,也肯定不会太笨。试想一下,你工作的时候,要交给你下属一个活,但是怎么说都听不懂,最后累的是你自己,这就是为什么很多大厂招聘的时候会把算法作为一个门槛。

2、工作中

  至于当你到了工作中,如果你没有学过算法,你觉得算法没用,你有工作经验,面试不管算法,哎,就是不学!就是不学!这时候,你发现遇到某个问题的时候,怎么想都没办法做到性能最优,这时候,一个同事缓缓走了过来,告诉你,这不是就是 平衡二叉树 嘛,然后他帮你把代码写了,性能比你快十倍!你觉得,作为你的上级,提拔你还是提拔他呢?
在这里插入图片描述

  很多人进入工作以后,觉得算法用不到,确实是用不到,但是会算法的那批人,工资就是比你高,如果你觉得无所谓,哎,我也无所谓了。
  所以,找到了工作并不意味着算法生涯的结束,恰恰是开始!那么,接下来我们看看算法能给我们带来什么。
  业务都会做,只有掌握了别人没法实现的东西,才是职场的核心竞争力。
在这里插入图片描述

三、算法能给我们带来什么能力的提升

在这里插入图片描述

  如果有人告诉你算法没用,那么只是他为了掩盖自己的平庸而找的借口而已。你可能会听到有写了几年业务的程序员学长说过 “除了面试,我就没用到过算法” 之类的话。
  能说出这样的话,首先肯定没有经过深思熟虑,脱口而出;其次,要么缺乏自信心,觉得自己一辈子都没办法学好算法了,所以就得过且过;要么就是故意误人子弟,不想让你超过他,青出于蓝胜于蓝。所以如果你已经看到这里,我希望你不要传播这样的思想,起码对这个学科保持基本的尊重。相信我,学好算法,一定会给你带来丰厚的回报。

  算法至少可以提升你的以下几个能力:
  1、抽象问题的能力
  2、解决问题的能力
  3、编码能力
  4、调试能力
  5、测试能力

1、抽象问题的能力

  大部分算法的问题不会直接告诉你用到的是什么样的算法,你需要通过你的思维进行抽象才能把它和自己学过的算法联系起来。抽象的过程就是锻炼思维的过程,而实际项目中问题会更加的宽泛,如何抽丝剥茧分解问题,并且和你做过的题联系起来也是一个逐渐实践,循序渐进的过程,切不可操之过急。

2、解决问题的能力

  任何问题都有解决办法,对于算法的题目,一般只有输入和输出,没有任何图形化界面。你不需要关心UI如何展示,只要你的输入按照预期进行输出,这样你就可以专注于解决问题本身,不需要考虑如何将它以什么形式展现出来,可以更加专注。

3、编写代码的能力

  编写代码的能力,我们一般也叫 coding 能力,在练习刷题的过程中,你可以不断提升你程序的时间效率和空间效率,不断优化你代码的质量,也可以看到别人提交的代码。为什么别人的代码跑的比你快,或许自己一个人怎么想都想不出来,但是一旦看到代码或者人家的思路,马上就茅塞顿开,豁然开朗。
  这是一个和世界顶尖程序员一起共事机会,可能在你的学校或者工作中用永远都没有这样的机会。这就是三人行必有吾师的道理,这是一个不断练习、总结、提升的过程。

4、调试能力

  相信很多人在做算法题的时候,都遇到过怎么改都改不出和测试用例一样的输出,特别是遇到指针的问题。二叉树或者链表的指针指来指去,根本不知道现在程序是怎么运作的。我这里有三个方法:
  1)画图
  2)调试
  3)实在不行,就用 print 大法

1)画图

  画图是让你在没有把问题想清楚的情况下,把问题具象化,这是一种艺术能力。熟能生巧,好好培养,有朝一日,必有收获,它能够帮助你更好的理解问题的本质。

2)调试

  调试是程序员的基本素养,能够精确到每一个语句、每一行代码、每一个变量在当前状态下的值,这样你就可以判断出问题出现在哪一行代码,更好的定位问题。

3)print 大法

  如果不会调试,那么就用 print 大法吧。每个变量的值改变以后,都把它打印出来看看,从而确定问题出错在哪一行代码,这是一种最傻瓜式然而也是相对比较常用的方式。初学者推荐用这种方法。

5、测试能力

  相信很多人在做算法题的时候,都遇到过测试用例都过了,但是最后题还是过不了的情况,那是因为测试用例一般会是大量的、并且考虑到大部分的情况,只要有一组数据失败就算不通过。这是一个非常严谨的过程,就好比工作中,测试工程师会用各种测试用例来测试你的代码,如果测试不通过,程序必然会产生BUG,这是需要严格杜绝的。
  所以,通过实现一个个算法,能够让你养成一个更加严谨的测试习惯,多考虑边界条件,多想想哪些地方会出问题,对日后工作有百利而无一害。

四、解决问题的方法

在这里插入图片描述

  面对一个算法问题,有没有一些常用套路,有是有,只不过问题越普适,就会越抽象,就算我说了,可能也不是很容易迅速理解。大方向就是分为以下几步:
  1)读懂题意
  2)查看问题的数据范围
  3)抽象出数据结构
  4)对数据结构执行增删改查

1、读懂题意

  试想一下,如果题目都没有读懂,光看测试数据,怎么可能把算法写出来,所以至少需要把题目先读懂,明白它是在解决什么问题,问题的输入是什么,输出是什么。

2、数据范围

  看数据范围的目的,就是为了让你能够第一时间了解,这是一个暴力算法能够解决的问题,还是需要用到高级数据结构,例如 平衡树、线段树、树状数组 才能解决的问题。
  对于初学者而言,无论数据范围大或者小,都建议先按照暴力思想,也就是普通枚举的方法先把问题思考一下,有了第一步,再去想利用什么数据结构能够优化算法。

3、抽象出数据结构

  一个算法,大概率下都会伴随着数据结构,例如 枚举可以建立在数组、链表、树 或者 图 上,二分枚举是建立在有序数组上的,二叉树遍历是建立在二叉树上的,最短路是建立在图上的 等等。所以,需要思考的是,这个问题需要用哪种数据结构,才能够满足增删改查都能够在题目要求的时间范围内。

4、增删改查

  所有数据结构,无非就是增删改查四种操作,没有其它的了。如何利用给定数据结构的特性,去优化你的算法,就是解题的核心。

五、经典算法易错问题

在这里插入图片描述

  这里列出了一些学习算法的过程中经常会遇到的问题。
在这里插入图片描述

1、内存泄漏

  手动申请的内存,即堆内存,注意在适当的时候进行释放,否则程序在多次运行以后,就可能导致内存泄漏,产生泄漏以后,程序只要不关闭,耗尽操作系统的内存,程序会产生崩溃。所以,内存泄漏一定是要尽量避免的。

2、栈溢出

  一般出现在递归问题中,函数的递归调用,会把一些临时变量存储在栈内存中,栈内存都是实现分配好的,所以递归深度达到一定限度,势必会引起内存溢出,所以我们在递归的时候一定要避免深度过大,或者函数内部的变量占用内存过多。

3、死循环

  递归问题中,如果递归出口没有写好,就有可能出现死递归或者死循环。while 或者 for 语句的循环结束条件如果没有写好,也有可能产生死循环,从而令程序永远执行不下去。

4、数组越界

  申请的数组是有长度大小的,用过访问的下标超过了数组本来有的长度,就会产生数组越界,数组越界是一种未定义的行为,有可能产生问题,也有可能不会产生问题,甚至可能在产生问题后一天以后才暴露出来,所以是一种非常危险的行为,一定要谨慎使用。

5、整型溢出

  整型溢出就是每个整数都是有范围的,如果经过某种运算,超过了给范围,就会和数学上的计算相违背,从而产生非预期的结果,比如等差数列的求和 n ∗ ( n + 1 ) / 2 n*(n+1)/2 n(n+1)/2,如果 n ∗ ( n + 1 ) / 2 n*(n+1)/2 n(n+1)/2 本身是没有溢出的,但是 n ∗ ( n + 1 ) n*(n+1) n(n+1) 溢出了,那么再除2的结果就和最后你期望的结果大相径庭了。
  以及在二分查找的过程中,不要直接用 l e f t left left r i g h t right right 相加除 2,而采用 l e f t + ( r i g h t − l e f t ) / 2 left + (right - left)/2 left+(rightleft)/2 的形式,都是为了避免溢出考虑的。

6、初始化问题

  初始化问题主要是定义一个变量没有给它赋值,后期在进行累加时,就会产生错误,比如你期望它的初始值是0,但是如果没有赋值,可能是一个随机值。这样就会和结果不符。

7、边界问题

  对于一个区间 [ l , r ] [l, r] [l,r],它的长度到底是 r − l r-l rl 还是 r − l + 1 r-l+1 rl+1,这也是一个老生常谈的问题,当然还有二分查找的边界,左区间 是加一还是不加,右区间是减一还是不减。

8、递归出口

  递归出口一般是递归的结束条件,也就是 深度优先搜索树 的最后一层,如果没有考虑周到,递归的作用可能被辜负。

9、变量表义不明晰

  某个变量本来想表示成这个物品是否合法,例如取名为 bCheck,然后后面实现的时候可能会产生疑惑,它到底是表示合法还是不合法?这就是变量名取名不清晰导致的,这个例子中比较好的办法就是改成 bValid。

10、运算符优先级问题

  比较经典的就是 异或 和 等于 的优先级,你觉得哪个高?如果对优先级没有信心,那就老老实实加括号吧,起码加了括号,你能确保优先级一定是对的,不用去管运算符的优先级和结合性。

11、等幂性

  一个函数如果能被多次重入,则说明它是等幂的,如果每次执行结果都不一样,或者说会改变一些函数内部的值,就要考虑它的算法实现了。

  诸如这类的内容量太大了,一句话简单也说不清楚,我打算后面专门开一个视频来讲解,并且把我自己遇到的各种错误进行一个总结。如果想听的小伙伴可以打个1,尽量快速安排上。

六、后记

  如果想听更多算法相关内容,欢迎大家在评论区留言,那么后面的内容我会逐步和大家聊聊:

  如何学好算法?
  如何学好数据结构?
  如何理解时间复杂度和空间复杂度?
  如何系统的刷题?
  如何通过题目信息判断这是一个什么样的算法题?
  如何将学过的算法运用到实际的做题当中?
  如何避免看过解题报告以后会了,下次遇到同样题目还是不会的窘境?
  如何通过报错信息判断到底是什么类型的错误?
  如何对测试用例进行调试?
  如何快速高效的把一个题过掉?
  如何爱上数学,爱上算法,爱上计算机,爱上编程?

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

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

相关文章

C语言基础学习

**1.2 C语言程序设计入门三步骤 程序设计入门三步骤: (1)安装软件并开发HelloWorld程序。 (2)掌握基本的输入输出方法。 (3)理解该语言中程序的基本结构。 1.2.1 安装软件并开发第一个HelloWo…

BP算法Java实现

我们上次已经把公式给推导了出来。还举了例子,不懂的理论的点击这里,老师的代码   这回我们将要用Java进行初步实现,这个代码是我参考老师的,里面附带了详细的注解。要成功运行需要一些包,需要的可以联系我。 public…

关系代数和SQL语法

数据分析的语言接口 OLAP计算引擎是一架机器,而操作这架机器的是编程语言。使用者通过特定语言告诉计算引擎,需要读取哪些数据、以及需要进行什么样的计算。编程语言有很多种,任何人都可以设计出一门编程语言,然后设计对应的编译…

优雅的对象

最近一口气读完了二百多页的《Elegant Objects》。可能因为整理自博客所以排版一般,而且才二百多页定价却40多刀。但读过之后发现超值,甚至还想去买第二卷。作者观点大多比较激进,对自己的理念异常坚定,所以经常使用诸如“绝对不要使用XXX”、“记住XXX,就这样,句号”。但…

深入理解Java 8 Lambda

关于 深入理解 Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)深入理解 Java 8 Lambda(类库篇——Streams API,Collector 和并行)深入理解 Java 8 Lambda(原理篇——…

自然语言处理中注意力机制综述

https://www.toutiao.com/a6655120292144218637/ 目录 1.写在前面 2.Seq2Seq 模型 3.NLP中注意力机制起源 4.NLP中的注意力机制 5.Hierarchical Attention 6.Self-Attention 7.Memory-based Attention 8.Soft/Hard Attention 9.Global/Local Attention 10.评价指标 11.写在后面…

【深度学习基础】从零开始的炼丹生活00——机器学习数学基础以及数值计算数值优化方法

正值假期,决定恶补机器学习、深度学习及相关领域(顺便开个博客)。首先学习一下数学基础以及数值计算的方法(主要参考《深度学习》) 一、数学基础 这里简单复习一下机器学习相关的数学1.线性代数 范数 衡量一个向量的…

“泰迪杯”挑战赛 -利用非侵入式负荷检测进行高效率数据挖掘(完整数学模型)

目录 1 研究背景与意义 2 变量说明 3 问题分析 4 问题一 4.1 数据预处理 4.1.1 降噪处理 4.1.2 数据变换 4.2 负荷特征分析 4.2.1 暂态特征 4.2.2 稳态特征 5 问题二 5.1 相似度与权系数 5.2 模型建立 5.3 模型求解 6 问题三 6.1 事件检测算法 6.2 模型建立 6.3 模型求解…

37%原则如何优化我们做决定的时间

当需要百(千,万…)里挑一时,需要权衡最优解和效率,有一个37%原则比较有趣。 整个择优过程分为两个阶段: 观望:在前面 k k k个候选者中冒泡记录最优者 p p p,其分数为 V p V_p Vp​,但并不选择…

清风数学建模学习笔记——层次分析法

目录 一、模型简介 二、建模步骤 三、模型总结 一、层次分析法——模型简介 层次分析法,简称AHP,是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。该方法是美国运筹学家匹茨堡大学教授萨…

Attention is all you need ---Transformer

大语言模型已经在很多领域大显身手,其应用包括只能写作、音乐创作、知识问答、聊天、客服、广告文案、论文、新闻、小说创作、润色、会议/文章摘要等等领域。在商业上模型即产品、服务即产品、插件即产品,任何形态的用户可触及的都可以是产品&#xff0c…

you-get下载速度慢解决方法

Python版本:3.10 运行环境:Windows10 问题描述:在使用you-get下载X站视频时网速很慢,并一直限制在某个值,通过以下办法即可恢复正常网速 解决办法: 进入windows 安全中心-病毒和威胁防护-管理设置点击添加或删除排…

Microsoft store下载速度过慢

最开始是进入Microsoft store点击安装后一直无响应,后来知道这是因为Microsoft store下载速度过慢。下边几个步骤都尝试了,个人认为最重要的是Windows Update设置步骤,刚开始可能一直没有正确打开 修改DNS 右键任务栏网络图标->打开“网…

Linux网络编程 socket编程篇(一) socket编程基础

目录 一、预备知识 1.IP地址 2.端口号 3.网络通信 4.TCP协议简介 5.UDP协议简介 6.网络字节序 二、socket 1.什么是socket(套接字)? 2.为什么要有套接字? 3.套接字的主要类型 拓】网络套接字 三、socket API 1.socket API是什么? 2.为什么…

如何预防ssl中间人攻击?

当我们连上公共WiFi打开网页或邮箱时,殊不知此时可能有人正在监视着我们的各种网络活动。打开账户网页那一瞬间,不法分子可能已经盗取了我们的银行凭证、家庭住址、电子邮件和联系人信息,而这一切我们却毫不知情。这是一种网络上常见的“中间…

[保研/考研机试] KY3 约数的个数 清华大学复试上机题 C++实现

题目链接&#xff1a; KY3 约数的个数 https://www.nowcoder.com/share/jump/437195121691716950188 描述 输入n个整数,依次输出每个数的约数的个数 输入描述&#xff1a; 输入的第一行为N&#xff0c;即数组的个数(N<1000) 接下来的1行包括N个整数&#xff0c;其中每个…

wsl2安装mysql环境

安装完mysql后通过如下命令启动mysql service mysql start 会显示如下错误&#xff1a; mysql: unrecognized service 实际上上面显示的错误是由于mysql没有启动成功造成的 我们要想办法成功启动mysql才可以 1.通过如下操作就可以跳过密码直接进入mysql环境 2.如果想找到my…

nodejs+vue+elementui美食网站的设计与实现演示录像2023_0fh04

本次的毕业设计主要就是设计并开发一个美食网站软件。运用当前Google提供的nodejs 框架来实现对美食信息查询功能。当然使用的数据库是mysql。系统主要包括个人信息修改&#xff0c;对餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、…

【百度翻译api】中文自动翻译为英文

欸&#xff0c;最近想做一些nlp的项目&#xff0c;做完了中文的想做做英文的&#xff0c;但是呢&#xff0c;国内爬虫爬取的肯定都是中文 &#xff0c;爬取外网的技术我没有尝试过&#xff0c;没有把握。所以我决定启用翻译&#xff0c;在这期间chatGPT给了我非常多的方法&…

关于电脑连接好WiFi却无法使用浏览器上网的一种解决方法

如果你的电脑的网络设置里选项是自动获取ip地址的话&#xff0c;那么大概率适用此方法。&#xff08;我这个已经是填好的&#xff0c;之前是自动获取&#xff09; 方法步骤&#xff1a;这里分两步 &#xff08;1&#xff09;首先确定无法使用浏览器上网的原因。&#xff08;比…