关于后端:算法学习链路简要分析与面向-ChatGPT-编程

0次阅读

共计 11580 个字符,预计需要花费 29 分钟才能阅读完成。

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 发问。

<span style=”display:block;text-align:right;color:gray;font-weight:bold;font-size:14px;”> 申明:此图片由 MidJourney 生成 </span>
<span style=”display:block;text-align:right;color:gray;font-weight:bold;font-size:14px;”> 未经训练,不属于任何实在人物 </span>

大家好,我是小彭。

2023 开年以来,寰球媒体最火爆的热点莫过于一个生成式 AI 聊天机器人 —— ChatGPT,咱们都被大量的信息刷屏了。在这些信息中,你或者看过这样一则新闻《ChatGPT Passes Google Coding Interview for Level 3 Engineer With $183K Salary》,它说 ChatGPT 通过了谷歌工程师面试,则这个职位的年薪有 18.3 万美元。

让会不会让一些小伙伴产生焦虑的想法?

图片截图自新闻:https://www.pcmag.com/news/chatgpt-passes-google-coding-inter…

谷歌面试是会考算法的,ChatGPT 曾经具备这么强的算法能力了吗?如果答案是必定的,那么咱们借助 ChatGPT 的力量帮忙进步算法能力,是不是可行的想法。

试想一下:咱们要学习一个算法或者新常识新畛域,间接将问题抛给 AI,让 AI 间接传道授业解惑,间接向你总结出全社会积淀下来的最有价值的教训、方法论、内容或观点,你甚至都不须要去上学、找材料、看书。遇到不了解的中央能够持续向 AI 诘问,AI 还会十分有急躁的帮你解释……

将来,诚然须要设想。

事实,ChatGPT 能做到吗?

正好,最近有群友让我写一篇算法的入门文章,借此机会,就让咱们来学习如何应用 ChatGPT 辅助算法学习:

在接下来的几篇文章中,小彭将持续为你介绍 AI 技术的应用攻略以及实际感悟。

如果你对 ChatGPT 还不够相熟,心愿我可能为你提供一些指引。

让咱们开始吧!


明天文章比拟长,写个简略的纲要:

1、LeetCode 算法题学习链路简要剖析

2、ChatGPT 助手从入门到放弃

2.1 ChatGPT 的能力和限度

2.2 ChatGPT 的应用准则

3、面向 ChatGPT 编程的正确打开方式

4、总结


1. LeetCode 算法题学习链路简要剖析

首先,请你思考:残缺地学习一道算法题蕴含哪些步骤或动作:

  • 步骤一:复制代码 🌚
  • 步骤二:粘贴运行 🌚
  • 步骤三:自我满足 🌚

说笑了,这么有任何价值(求饶),应该是:

  • 阶段 1 – 白板编码
  • 阶段 2 – 浏览优质题解
  • 阶段 3 – 形象问题模型

1.1 阶段 1 – 白板编码

这里所说的“白板”并不是真的在白板上写出答案,而是说在无外力辅助的环境下独立解出题目。这个阶段不仅仅是写代码,而是:

  • 1.1 浏览: 疾速浏览题目信息,提取出题目标要害信息,包含题目指标、要害束缚、输入输出数据类型、数据量大小等;
  • 1.2 形象: 联合已把握的算法常识形象出题目标问题模型,并思考解决问题的算法,需注意算法复杂度是否满足问题的数据量上界;
  • 1.3 编码: 题目个别有多种算法实现,优先写出复杂度最优的版本。如果做不到,则先写出最相熟的算法,再优化为复杂度更优的算法(在面试和比赛中策略相似);
  • 1.4 查看: 查看题目条件并欠缺代码,包含问题束缚、数组越界、大数越界、小数精度、初始状态值、指标状态值等;
  • 1.5 调试: 反复第 1 – 4 个动作直到题目通过所有测试用例。

至此,你曾经“通过”这道题(或者没有),然而你只是对曾经学过的常识温习了一遍,对这部分算法更加相熟了,然而并没有常识增量,所以你须要进入阶段 2:

1.2 阶段 2 – 浏览优质题解

浏览优质题解始终是最快的晋升算法能力的路径,也是整个学习链路中最花工夫的局部。好在社区中有十分多酷爱算法的小伙伴,即便是刚刚公布的周赛题目,也不会呈现没有题解的状况。

举荐一些优质算法题解作者:

  • Krahets 上海交通大学,著有《Hello 算法》
  • 小羊肖恩 北京大学,Rank 寰球 Top 20,全国 Top 10
  • 灵茶山艾府 浙江大学,Rank 寰球 Top 20,全国 Top 10
  • liweiwei1419 四川师范大学,参加录制 LC 官网视频题解
  • 负雪明烛,美团,毕业时播种 BAT、亚马逊、微软等 Offer
  • 宫水三叶的刷题日记,微软

因而,浏览题解阶段次要阻碍就是看不懂,哪里看不懂呢?

  • 难点 1 – 算法: 了解算法自身,文字、正文、代码、图表这些都是算法的表现形式;
  • 难点 2 – 算法推导: 了解从题目一步步到算法的推导过程(有些题解会省略推导过程);
  • 难点 3 – 算法证实: 了解算法的严格证实过程,特地是贪婪算法(有些题解会省略证实过程)。

举个例子,题目 743. 网络延迟时间 有「Dijkstra + 最小堆」的算法,那么:

  • 算法:了解“每轮迭代从小顶堆中获取候选集里间隔终点最短路长度最小的节点,并应用该点松弛相邻边”就是了解算法自身;
  • 算法推导:了解“暴力 BFS/DFS → Floyd → 奢侈 Dijkstra → Dijkstra + 最小堆”就是了解算法推导过程;
  • 算法证实:了解“抉择候选集中间隔终点最短路长度最小的节点的计划不存在更优解”就是了解算法证实过程。

有些题目会由多个解法,等于有多个算法、多个算法推导过程以及多个算法证实过程,那么你要了解的信息量是成倍增加的。这里要依据工夫和优先级有所取舍。

了解了浏览题解阶段的次要阻碍,那么这些阻碍是由哪些起因导致的呢?

  • 起因 1:题解构造缺失: 有的题解只提供了可运行的代码,然而省略了推导过程和证实过程,甚至没有复杂度剖析(题解:没有复杂度剖析我不残缺了);
  • 起因 2 – 思维简单度过高: 有些题解后果残缺,解说也很具体,然而其中某些难点或某几行代码思维复杂度很高(大脑复杂度 $O(n^n)$);
  • 起因 3 – 前置常识缺失: 有些算法须要一些前置常识根底,例如 Dijkstra 算法就须要有图论根底(根底不牢地动山摇);
  • 起因 4 – 代码语言缺失: 有些题解只会提供一种语言的代码(说的就是我);

在你浏览题解时,你还会尝试依据题解写出代码,相当于回退到阶段 1 的编码阶段,但这个阶段会尽可能多地借助外力辅助。 因为此时编码不是目标,是通过编码的形式加深对算法的了解。

至此,你不仅了解了题解的大部分信息,还手撸了一遍代码,祝贺你曾经“学会”这道题,然而如果换一道变型题呢?这道题学会了,并不代表这一类的题目你都学会了,所以你须要进入阶段 3:

1.3 阶段 3 – 形象问题模型

形象问题模型就是你在阶段 1-2 形象步骤中做的事件。

你之所以能在短时间解决算法问题,是因为你已经做过这道问题,或者已经做过这类问题,已经形象过这类问题(天才选手除外),这就是咱们常说的多做多刷多总结。

所谓形象,就是总结出题目标模型 / 套路,怎么做呢?

  • 3.1 题目类型: 例如数学、双指针、回溯、动静布局、贪婪、数据结构就是一级题目类型。持续细分上来,双指针又分为二分查找、滑动窗口、同向 / 相向双指针,动静布局又分为线性 DP、树形 DP、转压 DP、数位 DP 等,回溯又分为排列、组合、子集等等;
  • 3.2 算法模型: 模型就是咱们说的解题模板 / 板子。例如二分查找有排除严格不成立方向的模型,背包问题有 01 背包和齐全背包和滚动数组的模型,线段树有奢侈线段树 +Lazy 的模型,质数有暴力和筛法的模板等等;
  • 3.3 编码技巧: 例如正数取模技巧、数组补 0 位技巧、链表 Dummy 节点技巧、除法转乘法技巧等等;

形象题目模型须要建设在大量浏览量和刷题量的根底上,是最重要的环节。通过后文试验验证,目前 GPT-3.5 和 GPT-4 都无奈达到顶尖算法高手的形象程度。

最初,你还须要将整个思考过程依照题目编号记录下来,不便将来的你查阅,小彭就是简略记录在 Github 上。有时候我从新做一道题后,会发现明天写的代码品质比几个月前写的的代码品质高出很多,也在见证本人的成长。

至此,学习链路剖析完结!

1.4 LeetCode 算法题学习链路小结

实现 LeetCode 算法题学习链路的简要剖析后,用一个表格总结:

阶段 动作 形容
1、白板编码 1.1 浏览 疾速浏览题目信息,提取出题目标要害信息
1.2 形象 联合已把握的算法常识形象出题目标问题模型
1.3 编码 撸代码
1.4 查看 查看题目条件并欠缺代码
1.5 调试(for Loop) 反复第 1 – 4 个动作直到题目通过所有测试用例
2、浏览优质题解 2.1 了解算法 了解算法自身,文字、正文、代码、图表这些都是算法的表现形式
2.2 了解算法推导过程 了解从题目一步步到算法的推导过程
2.3 了解算法证实过程 了解算法的严格证实过程,特地是贪婪算法
2.4 辅助编码(Async) 撸代码
3、形象问题模型 3.1 形象题目类型 例如数学、双指针、回溯、动静布局、贪婪、数据结构
3.2 形象算法模型 例如二分查找、背包问题、线段树 + Lazy、质数
3.3 形象编码技巧 例如正数取模技巧、数组补 0 位技巧、链表 Dummy 节点技巧、除法转乘法

接下来,咱们开始思考如何将 ChatGPT 有机地融入到算法题的学习链路中:


2. ChatGPT 助手从入门到放弃

ChatGPT 在对自然语言了解方面的提高是令人惊叹的,很多状况下只须要输出一个含糊的指令,ChatGPT 就能间接生成比拟残缺的答案。

然而,随着问题的深刻和复杂化,ChatGPT 的谬误和问题也逐步显露出来,这就是我从入门到“放弃”的整个过程:

2.1 向 ChatGPT 发问的一个误区

如果咱们间接把问题交给 ChatGPT,试图让它间接输入具体的题解,会产生什么?

能够看到,这份答复有算法类型、算法形容、算法推导过程、算法实现和复杂度剖析,算是一份绝对残缺的题解,但远远还谈不上优质,与 LeetCode 上优质的题解比相去甚远。

不是把 ChatGPT 吹到天上去了吗,问题出在哪里呢?

因为咱们提出的一个凋谢(open-ended)问题,而这种发问形式对 ChatGPT 是低效的:

  • 具体:怎么定义具体?100 个字还是 1000 个字叫具体?
  • 优质:怎么定义优质?须要多少种算法,须要触类旁通吗?
  • 题解:怎么定义题解?须要蕴含哪些信息?

总之,“请你写出具体优质的题解”、“你能帮我做这道题吗”和“请你通知我这道题”这三种问法,在 ChatGPT 看来并没有本质区别,而且实测后果出奇地统一(请防止 😁)。

2.2 一个万能的 ChatGPT prompt 模板

在通过一整天被人工智障折磨,以及浏览《The Art of ChatGPT Prompting》后,我总结出一个发问模板:

  • 1、角色:限定常识畛域(留神:New Bing 玩角色扮演出错概率偏高);
  • 2、指标:一句话概括须要的帮忙;
  • 3、要求:对指标补充的具体清晰的要求,尽量表达清晰,防止含糊,个别采纳 Do 和 Do not 格局;
  • 4、举例(可选):输入输出样例。

起初我发现 OpenAI 在 GPT-4 的测试论文《Sparks of Artificial General Intelligence: Early experiments with GPT-4》中,也采纳了相似“角色 - 指标 – 要求 – 举例”的模板 ☺。

GPT-4 晚期测试报告:https://arxiv.org/pdf/2303.12712.pdf

2.3 一个被逼疯的 prompt

通过和 ChatGPT 的来回拉扯后,我终于写出一版绝对称心的 prompt。我试图让 ChatGPT 写出优质的题解,相似于要求 ChatGPT 写一篇文章。

 我须要你负责算法老师和指导者,你须要给出一道 LeetCode 问题的代码和解题思路。要求:1、应用中文答复,应用 Kotlin 语言
2、代码必须带有正文
3、确保每个解法是严格不同的算法,并且每个解法蕴含算法名称、算法概括,算法详细描述、算法推导过程、代码实现、复杂度剖析
4、先总结题目的解法个数,以及每个算法的算法名称
5、先输入复杂度最差的暴力解法,再顺次输入复杂度更优的解法
6、不要输入题目形容和测试用例
题目:718. 最长重复子数组 

这道题有 4 种解法:

  • 1、使用暴力解法,枚举所有子数组,判断是否为重复子数组。
  • 2、应用动静布局解法,以二维数组 dpi 记录以 A[i] 和 B[j] 为结尾的最长重复子数组长度。
  • 3、应用滑动窗口解法,枚举 A 和 B 所有的对齐形式,计算每种对齐形式的最长重复子数组长度。
  • 4、应用二分查找解法,最长重复子数组长度存在枯燥性,应用二分查找查看是否存在长度为 len 的重复子数组。

那 ChatGPT 会给出令人满意的回答吗?

能够看到:尽管答复比用“请你写出具体优质的题解”发问失去的答复优化了很多,然而连最简略的代码正文要求都没有满足,更不用说和 LeetCode 上的优质题解相比。

何苦看 ChatGPT❓

至于被爆吹的 New Bing 和 GPT-4 模型呢?试验后果和 GPT-3.5 没有显著差异(悲观)。

GPT-4 试验后果:https://poe.com/s/VIkeeiqjDGVfuym0Kn5B

2.4 降低要求

在文章《The Art of ChatGPT Prompting》中,提到:“It’s important to provide the ChatGPT with enough information to understand the context and purpose of the conversation, but too much information can be overwhelming and confusing.”

图片截图自原文:https://fka.gumroad.com/l/art-of-chatgpt-prompting

那么,有没有可能是因为咱们提出的信息量太大,导致 ChatGPT 无奈聚焦呢?

咱们尝试让 ChatGPT 针对某个算法输入题解:

 我须要你负责算法老师和指导者,你须要给出一道 LeetCode 问题的代码和解题思路。要求:1、应用中文答复,应用 Kotlin 语言;2、应用二分查找 + 哈希表的解法
3、蕴含算法、算法概括,算法详细描述、算法推导过程、代码实现、复杂度剖析
4、不要输入题目形容和测试用例
题目:718. 最长重复子数组 

大同小异,这也阐明上一节的测试后果并不是因为要求过多导致。

2.5 重新认识 ChatGPT 的能力和限度

在经验过重复被折磨后,我决定放弃让 ChatGPT 写题解的想法,起因是:

  • 1、ChatGPT 的确有总结提炼的能力,但要 ChatGPT 给出精确、全面、深度的答案,目前 ChatGPT 做不到;
  • 2、相比于总结,人类更看重的是对问题的深度拆解和建构能力,目前 ChatGPT 做不到。

其实,目前爆火的两类 AI 技术,都是工具型 AI,而不是科幻作品中常见的通用型 AI。无论是基于大语言模型 LLM 的 ChatGPT,还是基于扩散算法 Diffusion 的 MidJourney 等绘画工具,实质上都是应用海量数据针对特定场景训练出的模型。它们领有让全人类难可望不可即的数据处理能力,但它的能力下限也被封印在这个躯壳中。

AI 这个词,被泛化了。

像 ChatGPT 就是应用互联网上海量的文本数据作为大型预训练语料库,让机器从语料库中学习语言模型,并通过 Transformer 模型来预测下一个单词的概率分布。这外面有 2 个关键词:

  • 概率: ChatGPT 语言模型的数学根底是概率论,通过预测词的概率来输入答案,它相对无奈给出 100% 精确的答复,更不用说自主创作,甚至常常不苟言笑地给出自圆其说的答复(GPT-4 也一样)。“原创想法的高明表白”比“清晰表白的非原创想法”更有价值,此观点咱们在《什么是原创?独立实现就是原创吗?》这篇文章里探讨过。
  • 语料库: ChatGPT 是基于互联网上的公共数据库(截止至 2021 年),不蕴含互联网上的公有数据库,企业和集体的公有数据库,超出语料库范畴的内容它无奈给出答案的。

图片截图自 InstructGPT 论文 https://arxiv.org/pdf/2203.02155.pdf

回到文章结尾的那个设想,ChatGPT 能做到吗?—— ChatGPT 不仅做不到,还远远做不到,在可见的将来,也不太可能做到。

2.6 在学习过程中应用 ChatGPT 的领导准则

话说回来,咱们给 ChatGPT 一个很高的期待值,而后以它达不到期待值为由否定它,是主观的吗?不是。

刚开始应用 ChatGPT 的时候,它所体现的能力确实让咱们很多人感觉十分惊叹。只是随着实际应用次数增多,随着发问问题的深刻和复杂化,ChatGPT 的谬误才开始逐步显现出来,直到最初令人悲观而已,是咱们把它捧得太高了!

所以,在应用 ChatGPT 等 AI 技术时,咱们应该遵循哪些根本准则呢:

  • 准则 1 – 被动升高预期:

不要神化 ChatGPT,也不要否定 ChatGPT,而是升高对 AI 的预期,被动把握应用和管制 AI。

我认为将 ChatGPT 称为人类有史以来最智能的一本字典,或者是正确的定位。

在搜索引擎时代,信息以数据的模式存储在全世界的数据库中,咱们要从这些信息中取得解决方案,就须要破费大量的工夫去触达、筛选、浏览和加工。而在应用 ChatGPT 后,ChatGPT 可能帮咱们搜寻和整顿信息,并间接呈现出整顿后的信息,即便咱们对这个畛域无所不知。

ChatGPT 最大的意义,在于它可能解决“信息量太大”而“注意力太少”的矛盾。它可能在一瞬间将每个人在木桶效应中最短的那根短板进步到平均水平,每个人的延展性将被极大地延长。

因而,尽管目前 AI 无奈无效解决综合性的简单问题,但对于比拟根本的模式化的问题,ChatGPT 能在短时间生成残缺的计划,也是相当厉害的。把对 ChatGPT 的预期升高,了解它的能力和限度,能力更好的管制它。

  • 准则 2 – 监督和领导:

不要冀望 ChatGPT 可能自主解决问题,更不必放心 AI 会取代人类。

ChatGPT 确实能够帮助咱们实现某些特定工作 / 特定动作,但它更须要在人类的监督和领导下能力无效产出,更无奈代替人类的创造力和解决问题的思考力。

还有,大家都遇到过 ChatGPT 遇到简单问题就开始不苟言笑地胡言乱语,此时须要人类去被动查验和领导它直到给出正确答案。有时候,与其花工夫调教 ChatGPT,还不如本人花工夫如数家珍解决问题来得快。

  • 准则 3 – 思考的权力:

将思考的权力让渡给 AI,是危险的。

ChatGPT 的确具备总结的能力,然而过渡依赖于 AI 来辅助学习,放弃思考的过程,放弃摸索未知的过程,放弃折磨大脑皮层的过程,是危险的。长此以往势必会造成学习能力和主观能动性的进化,抗压能力的进化(窥视真谛,失去的就肯定是真谛吗)。

很多时候,咱们谋求的不仅仅是最终的答案,还包含寻求答案的过程,是一种所谓的“心流”状态。因而,越是折磨大脑皮层的动作,咱们越不能让渡给 AI,而那些须要破费大量工夫的反复的搜寻整顿动作,不交给 AI 还交给谁呢?

阶段 论断
1、白板编码 100% 不裸露给 AI
2、浏览优质题解 了解过程尽量不裸露给 AI,应用 AI 作为 Checker
3、形象问题模型 应用 AI 查找和整顿信息

至此,咱们论断确定。

接下来基于此论断开始应用 ChatGPT 辅助学习过程中的单个动作:


3. 面向 ChatGPT 编程的正确打开方式

3.1 应用 ChatGPT 输入提醒

在做题时,有时候一下子卡住了然而又想挑战本人,能够让 ChatGPT 输入提醒试试看,相似于 LeetCode 上的 Hint 性能。

 我须要您负责算法老师和指导者,给出一道 LeetCode 问题的 5 条提醒。要求:1、用中文答复,答复精简,限度在 15 字内
2、如果存在多种解法,优先提醒复杂度最差的暴力解法,再顺次提醒复杂度更优的解法
问题:718. 最长重复子数组 

这次 AI 给出了 5 个解法,而在之前的答复只给出了 2 个解法。

3.2 应用 ChatGPT 补齐题解构造

有的题解只提供了可运行的代码,然而省略了推导过程或证实过程,甚至没有复杂度剖析,咱们能够题解交给 ChatGPT 补齐,以 newhar 的这篇题解为例:

 我须要你负责算法老师和指导者,你须要补齐一道 LeetCode 题的题解。要求:1、应用中文答复;2、为代码减少正文
3、剖析工夫和空间复杂度
4、解释这个算法
代码:class Solution {
public:
    int collectTheCoins(vector<int>& coins, vector<vector<int>>& edges) {int n = coins.size();
        unordered_set<int> nes[n];
        for(const auto& e : edges) {nes[e[0]].insert(e[1]);
            nes[e[1]].insert(e[0]);
        }
        // 1. 删除所有的无金币的叶子节点,直到树中所有的叶子节点都是有金币的(相似拓扑排序)vector<int> deleted(n, 0);
        queue<int> q;
        for(int i = 0; i < n; ++i) 
            if(nes[i].size() == 1 && coins[i] == 0) 
                q.push(i);
        
        while(q.size()) {int cur = q.front(); q.pop();
            deleted[cur] = 1;
            for(int ne : nes[cur]) {nes[ne].erase(cur);
                if(coins[ne] == 0 && nes[ne].size() == 1) {q.push(ne);
                }
            }
        }
        
        // 2. 删除树中所有叶子节点,及其相邻边(删两次)for(int iter = 0; iter < 2; ++iter) {for(int i = 0; i < n; ++i) {if(!deleted[i] && nes[i].size() == 1) {deleted[i] = 1;
                }
            }
            for(int i = 0; i < n; ++i) {if(deleted[i]) {for(int ne : nes[i]) {nes[ne].erase(i);
                    }
                }
            }
        }
        
        // 3. 答案就是剩下的树中的边数
        int res = 0;
        for(const auto& e : edges)
            if(!deleted[e[0]] && !deleted[e[1]]) 
                res += 2;
        
        return res;
    }
};

GPT-4 试验后果:https://poe.com/s/VIkeeiqjDGVfuym0Kn5B

3.3 应用 ChatGPT 辅助浏览

有些题解后果残缺,解说也很具体,然而其中某些难点或某几行代码过于简单,能够针对性提出问题,ChatGPT 也有能力联合上下文答复。

3.3 应用 ChatGPT 翻译代码

有些题解只会提供一种语言或少部分语言的代码,比方 我的题解 个别只有 Java / Kotlin 语言,能够让 ChatGPT 翻译:

 我须要你负责算法老师和指导者,你须要将代码翻译为 Python:要求:1、蕴含代码正文
代码:class Solution {fun collectTheCoins(coins: IntArray, edges: Array<IntArray>): Int {
        val n = coins.size
        // 入度表
        val inDegrees = IntArray(n)
        // 领接表
        val graph = HashMap<Int, MutableList<Int>>()
        for (edge in edges) {graph.getOrPut(edge[0]) {LinkedList<Int>() }.add(edge[1])
            graph.getOrPut(edge[1]) {LinkedList<Int>() }.add(edge[0])
            inDegrees[edge[0]]++
            inDegrees[edge[1]]++
        }
        // 残余的边
        var left_edge = edges.size // n - 1
        // 1、拓扑排序剪枝无金币子树
        val queue = LinkedList<Int>()
        for (node in 0 until n) {
            // 题目是无向图,所以叶子结点的入度也是 1
            if (inDegrees[node] == 1 && coins[node] == 0) {queue.offer(node)
            }
        }
        while (!queue.isEmpty()) {
            // 删除叶子结点
            val node = queue.poll()
            left_edge -= 1
            // 批改相邻节点
            for (edge in graph[node]!!) {if (--inDegrees[edge] == 1 && coins[edge] == 0) queue.offer(edge)
            }
        }
        // 2、拓扑排序剪枝与叶子结点间隔不大于 2 的节点(裁剪 2 层)// 叶子节点
        for (node in 0 until n) {if (inDegrees[node] == 1 && coins[node] == 1) {queue.offer(node)
            }
        }
        for (node in queue) {
            // 2.1 删除叶子结点
            left_edge -= 1
            // 2.2 删除到叶子结点间隔为 1 的节点
            for (edge in graph[node]!!) {if (--inDegrees[edge] == 1) left_edge -= 1
            }
        }
        // println(inDegrees.joinToString())
        // coins=[0,0],edges=[[0,1]] 会减去所有节点导致呈现正数
        return Math.max(left_edge * 2, 0)
    }
}

ChatGPT 会依据原有代码逻辑转层翻译为目标语言,根本实现得不错。美中不足的是,我素来没遇到过代码一次转换后不出错的状况,须要重复领导能力改对,理论作用个别。

3.4 应用 ChatGPT 标准代码

咱们能够将本人写的代码交给 ChatGPT 做 CodeReview:

 我须要你负责算法老师和指导者,你须要对代码做 CodeReview:要求:1、评估代码规范性
2、指出有余指出
3、给出改良后的版本
代码:略 

图片过大,只截取局部信息。

大部分是不苟言笑地胡言乱语,成果十分个别,跟市面上已有的 Review 工具齐全比不了,果然 CodeReview 是个教训活 🌚!!

GPT-4 试验后果:https://poe.com/s/XelhIjmHxWFtbnZpLmEd

3.5 应用 ChatGPT 举荐类似题目

咱们能够让 ChatGPT 举出类似题型:

 我须要你负责算法老师和指导者,你须要给出 10 道同类型题目和链接:题目:718. 最长重复子数组 

能够看到,ChatGPT 的学习深度只能剖析到 “动静布局” 这一层,举荐的题目理论关联度不高。

咱们尝试减少限定条件,例如要求算法模型都蕴含动静布局、滑动窗口和二分查找:

 我须要你负责算法老师和指导者,你须要给出 10 道同类型题目和链接:要求:1、都蕴含动静布局、滑动窗口和二分查找解法
题目:718. 最长重复子数组 

这次类似度很高,不错。

是不是逐步把握调教 ChatGPT 的正确形式?更多 case 就不再展现了,心愿这篇文章可能给你带来一些灵感或者思路。


4. 总结

回到文章结尾的新闻。新闻里提到的 Google L3 级别,其实面向的是实习生或应届生的测试职位,考查的算法也是比拟根底和模式化的问题,更不会波及简单的零碎设计问题(但薪水也有 18.3 万美元,果然宇宙的止境是外企)。

让我意外的是,在 OpenAI 的 GPT-4 技术报告中,GPT-4 在 LeetCode 算法上的测试数据体现十分蹩脚。如果以 GPT-4 的程度是不可能通过 Google 的算法面试的,更不用说该新闻发表日期时的 ChatGPT 应该还在用 GPT-3.5 模型。

这个新闻的可信度很低。

GPT-4 技术报告:https://cdn.openai.com/papers/gpt-4.pdf

总结一下:

  • 1、ChatGPT 可能解决“信息量太大”而“注意力太少”的矛盾,每个人的延展性将被极大扩大;
  • 2、ChatGPT 的确有总结提炼的能力,但对问题的深度拆解和建构能力,ChatGPT 无奈做倒;
  • 3、将思考的权力让渡给 AI 是危险的,越是折磨大脑皮层的过程越不能让渡给 AI;
  • 4、咱们的对手不是 AI,而是比你更懂管制 AI 的人。

最初,心愿大家在学习算法的路线上共勉,小彭等拿到 Guardian 牌子起初回来还愿 😭。

你认为 ChatGPT 技术是否被适度炒作?你对这个问题有什么见解?欢送聊聊你的看,也欢送你转发、留言、在看,给我一个反馈喔。


ChatGPT 试验材料

  • 交换|面向 ChatGPT 学习算法 —— Krahets 著
  • 如何与 ChatGPT4 结对编程晋升研发效率 —— cheney(腾讯)著
  • 我和 chatGPT 对线操作系统!—— cxuan 著

参考资料

  • The Art of ChatGPT Prompting: A Guide to Crafting Clear and Effective Prompts —— fatih kadir akin 著
  • ChatGPT Is a Blurry JPEG of the Web —— Ted Chiang(《来临》作者)著
  • 通过谷歌面试的 ChatGPT 要取代码农了?硅谷工程师:先别急 —— 硅星人 著
  • 最近很火的 ChatGPT 到底是什么?会给咱们的生存带来什么扭转?—— 李睿秋 Lachel 著
正文完
 0