美文网首页js css html
《代码的降临》告诉我们的7件事

《代码的降临》告诉我们的7件事

作者: 追梦人在路上不断追寻 | 来源:发表于2023-01-10 22:56 被阅读0次

捷径可能很有用

  • 编码竞赛或类似leetcode的问题通常要求您以无症状的最佳方式解决问题,并制定适用于任何输入并考虑所有边缘情况的通用解决方案。
  • 数学竞赛和谜题要求您为给定问题找到优雅的确切解决方案或一些技巧,让您无需任何编码即可获得答案。
image.png

但 AoC 问题通常是不同的:您需要使用某些编码来回答特定输入的问题,但您不需要编写通用代码或获取始终有效的确切公式。有时,您需要编写一个有效的解决方案,但随后通过应用一些技巧来大大加快它的速度,例如,在第 11 个问题中将数字除以 LCM 或在问题 17 中查找一个循环。

在其他日子里,这些问题没有快速多项式解决方案,但如果你编写了一个足够最优的代码,你仍然可以在合理的时间内得到特定输入的答案。在某些问题中,提出一个近似的解决方案甚至就足够了,该解决方案不一定能保证正确答案,但比“正确”解决方案工作得更快,并且仍然可以为给定的输入提供正确的答案。也许所有这些“偷工减料”的技巧并不是为生产系统编写代码的最佳方式,但将它们应用于脑筋急转弯非常有趣。

解决 Tsql 中的难题

使用基于集合的 T-SQL 解决 AoC 难题是一次有趣的经历。作为一个没有数学或CS背景的人,戴上算法或数学思维帽对我来说是一种全新的体验。

基于集合的操作和过程操作之间的主要区别在于,所有操作都是同时发生的,并且一次一个元素地循环访问数组/结果集不是一种选择。需要明确的是,T-SQL 可以以过程方式处理变量、循环、游标等。我只是选择坚持基于集合的操作,作为对自己的挑战。

SQL Server 具有非关系功能,可帮助解决比标准关系表更高效的独特情况。具体说来:

  • **图形数据库 **— 在查找 2 个节点之间的最短路径方面非常有效。不幸的是,仅此而已。它无法为您提供所有间接连接的节点的列表。
  • 空间数据类型 — 非常适合一些视觉难题,例如第 15 天,我们必须找到传感器的盲点。我没有检查 40 亿个方块中的每一个是否都被覆盖,我只是创建了一个多边形来表示每个传感器的覆盖范围,将它们全部连接成一个多边形,并将其与代表框架的多边形进行比较并提取差异。所有这些都需要 15 毫秒才能运行。
  • 使用 SQL 的 JSON 解析功能来解析字符串 用 替换字符串中不必要的部分,然后使用或提取必要的数据是非常方便的。

算术运算的隐藏复杂性

当我们编写代码来解决问题时,我们经常假设像加法和乘法这样的算术运算需要恒定的时间,无论数字有多大。事实并非如此;例如,教科书的长乘法需要二次时间。寻找一种有效的乘法算法被列为计算机科学中未解决的问题之一。

解决代码出现难题第11 天*的步骤之一涉及将非常大的数字相乘,这使得朴素算法的运行时不切实际。解决这个问题需要确定大数的乘法是一个瓶颈,并找出一种方法来减少被乘以的数字的大小。

蛮力通常就足够了

虽然从算法的角度来看,我没有学到太多东西,但 AoC 确实教会了来自 LeetCode 相关平台的人一件事——蛮力通常就足够了。此外,非暴力解决方案甚至可能不存在。有一堆问题需要递归记忆,这被认为是一种蛮力,但它也需要精确调整参数和进一步的决策分支。

跳出框框思考的机会

您可以享受挑战自己的乐趣,并尽快完成日常谜题。您还可以通过使用尚未使用的新编程语言来挑战自己。在解决难题时,我们不应该忘记常见的错误,例如整数溢出或蛮力解决方案不是一切。例如,在第17天的俄罗斯方块拼图中,我们得到了五个形状,这些形状与运动模式一起依次出现,并要求我们在一定数量的落块之后找到积木的高度。

image.png

掉落 2022 个方块后很容易得到俄罗斯方块的高度,但是当它变成 1,000,000,000,000 块时,俄罗斯方块塔的高度是多少?如果我们使用具有高速CPU的超级计算机,蛮力可能是一个很好的解决方案,但是对于普通笔记本电脑,我不得不跳出框框思考。

在某些日子里,我不得不反复重写我的解决方案。第 16 天,我在打开阀门的难题*上卡了三天;当我在第二天试图弄清楚时,我听到自己说:“把大象留在这里,跑吧。

我还需要在第 20 天澄清立方体拼图,并学习如何以不同的方式切割立方体形状。

大量学习

这是我第一次参加这样的全球比赛。它开始是一个有趣而简单的问题,并在最后几天变得更具挑战性。每天中午我都粘在Mac上,等待下一个谜题的发布。我的一些学习和亮点:

  1. 比赛最后几天的谜题教会了我通过实现动态编程来优化代码的各种方法。
  2. 退后一步,重新思考整个问题是可以的。您可能会遇到可能让您多次头疼的问题。可以清洁石板,休息一下,然后用不同的方法重做相同的问题。是的,我说的是第16天和第24天
  3. 向他人学习。在Reddit线程上,人们分享他们的日常解决方案,你可以学习新技术来解决你已经解决的相同问题。在 swift 中,对于图和树问题,我找到了一种使用“间接枚举”而不是传统类创建节点的新方法,这很有趣。
  4. 特别提及第 22 天,第 2 部分,折叠立方体寻路问题。为了理解这个问题,我必须将输入结构模仿到一张纸上,将其剪切并折叠成一个3D立方体,对于编程问题来说,这既奇怪又令人兴奋。

与社区见面的机会

《代码的出现》对我来说是新的。起初,我认为这可能是另一个Leetcode问题,但事实证明,解决起来更容易,也更有趣。尽管大多数问题都是可以解决的,但我需要一个特定问题的帮助,我不得不在Reddit等社区上寻找线索。

我发现了一些很好的提示,这些提示将我带入了一个兔子洞,在那里我发现了一堆“奇怪”的东西,例如针对 AoC 问题优化的特定编译器/运行时。

相关文章

网友评论

    本文标题:《代码的降临》告诉我们的7件事

    本文链接:https://www.haomeiwen.com/subject/qefbcdtx.html