尽管我认为自己是CompSci课程中比较优秀的程序员之一,但我对那些非常擅长数学的人很着迷。我必须说,每当我进行数学类型的作业或考试时,我的方法都是非常公式化的,即如果我遇到的问题看起来像A我必须使用方法B并且结果应该看起来像C,否则我犯了一个错误。我真的知道如何解决我修改过的问题。
我真的很想花一些时间来更好地理解数学问题及其解决方案,以深入研究算法和计算复杂性领域。
任何提示?
答案 0 :(得分:26)
听起来你有很好的数学技能 - 你了解机制,也许你学到的东西背后有一点直觉 - 但是你对良好解决问题的能力有点缺乏了解,特别是因为你说“我真的知道如何解决我以前遇到过的问题”。
要解决这个问题,我会看看Project Euler。绝对没有规定的方法来解决这些问题,并且它们通常需要综合多个知识领域来成功地解决每个问题。你会得到你的蛋糕并吃掉它 - 成为一个更好的程序员/数学家和一个更好的一般问题解决者,通过看看如何为特定问题带来许多东西。而且您将获得更深入的见解,了解看似完全不同的事物是如何在一个统一的整体中实际组合在一起的。 (在许多数学领域尤其如此。)
最后,感谢您希望成为更好的手艺练习者!如果每个人都表现出相同的抱负,我会情不自禁地认为软件总体上要好得多。
答案 1 :(得分:9)
最终,你需要“花一些时间在马鞍上”并选择一些有趣的东西,然后学习如何使用它。我对游戏编程数学很感兴趣,并选择了关于这个主题的New Riders书 - 不记得此刻的名字了。它有概念和练习,随着我的进步,我觉得我不仅理解了概念和理论,还理解了如何将其付诸实践。
您可以查看其中一些相关问题。那里有一些很好的答案。它们可能并非适用于您的情况,但有些会适用。
How can I learn the math necessary for working with computer vision?
How to learn mathematical notation?
https://stackoverflow.com/questions/651865/basic-math-book-for-a-programmer
Learning Applied Statistics with a focus on R
https://stackoverflow.com/questions/568899/user-friendly-math-textbooks
https://stackoverflow.com/questions/509488/recommendations-for-discrete-math-resources
Learning game programming (part 2) (math)
Math Resources for C/C++ Programmers
https://stackoverflow.com/questions/420500/helpful-math-classes-for-programmers
答案 2 :(得分:2)
答案 3 :(得分:1)
我会选择这些领域:
离散数学,线性代数, 组合,概率和 统计学,图论,数学逻辑。
这可以让你掌握CS的大部分领域。如果你想进入特殊领域,你必须深入研究某些领域:
Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory
您当然会找到这些条目:blogs to freshen up my math in practice和math programming and learning。他们会有一些建议。
除此之外,还可以获得一些关于线性代数和逻辑的好基础书籍。 Sedgewick有一些关于基本数学概念算法的好书。 John Vince在match concepts for computer graphics上有一个。
答案 4 :(得分:1)
实现。很多。
微积分和线性代数是一种不好的方法。数值方法可以帮助你(它们是在计算机中实现的),因为如果你可以实现它们,你可以用一点点努力来实现任何与数学相关的东西。
以下是我建议您开始寻找的一些主题。我已经实现了至少一种,它们不仅帮助我理解数学,还帮助我理解如何编写一些困难的数学问题。
找根。 解决线性系统和其他矩阵操作(如LU分解和有效行列式算法)。解决非线性系统。 最小二乘法(连续和离散)。 插值(主要是拉格朗日多项,简单矩阵插值)。 数值积分(我认为这是最简单的... Newton-Cotes,Chebyshev-Gauss,Gauss-Laguerre等) 数值常微分方程(RungeKutta和多步法)
现在,一些非数字科目:
运筹学/线性规划/优化:从带有Matrix符号的Simplex开始(我个人称之为复合体),然后尝试使用BranchAndBound并冒险进行动态编程..
数论有一些有趣的应用,特别是安全性和密码学
自己实施Vector3D课程。
此外,享受图表,包括最短路径算法和搜索。我认为这是最重要的数据结构。
如果您想为自己挑战,请深入了解优化:队列理论。做决定。蚁群优化。
我希望我能给你一些见解并且不会吓跑你! :)
答案 5 :(得分:1)
实践,实践和实践就是答案。我的孩子在数学上遇到了问题,我能够克服这个问题,习惯于他几乎每天练习数学30分钟,这比他花在Wii游戏上的时间少一半。这种做法是通过www.ourflashcards.com上的这个工具完成的。我不会为这个工具做广告,我保证你会有同样的感觉。
答案 6 :(得分:0)
我认为这取决于。我喜欢阅读的一本书 - 从数学重访开始 - 是Matt Buckland的Programming Game AI by Example。
快速谷歌制作this book,但这又取决于你正在做什么或计划做什么样的节目。
我个人认为你对物理学和代数数学的理解不会出错。
答案 7 :(得分:0)
让我想起毕业生的日子。我很快就了解到,提出数学问题并找到数字或蒙特卡罗解决方案比分析解决问题(即无计算机数学教授在黑板上的方式)更容易。这适用于数字问题,通常不会帮助你通过数学经济学考试。
在计算机上进行数学运算的另一种方法是使用Mathematica等,但这使得许多数学问题很容易解决,你并没有真正学到任何东西。手工整合任意复杂的功能是火箭科学。在Mathematica中集成任意函数(分析!)并不比使用calc.exe
困难我建议重新发明轮子并用您选择的大括号语言编写一个开源的,自包含的库,针对您最喜欢的应用数学分支,无论是素数还是线性编程。 Math API库因为难以编写黑盒子而闻名,没有人能够再次触摸它们。一个例子是Excel中的统计信息插件,它看起来好像没有人在几十年内有所改进。曾经写过数学图书馆的人都会学到很多东西。
答案 8 :(得分:0)
转到www.projecteuler.net网站。 你会发现有挑战性的问题。试着解决它们,有一天你会为自己感到骄傲。 好运
答案 9 :(得分:-1)
如果您想了解软件,请研究category theory