改进算法思维

时间:2009-09-29 21:05:17

标签: algorithm

我正在考虑如何提高我找到问题的算法解决方案的能力。我曾想过从各种数学领域解决数学问题,如离散数学或线性代数。经过“谷歌搜索”,我读了一篇文章声称需要学习游戏编程以实现这一目标,这对我来说似乎是合乎逻辑的。

你对我有同样的担忧吗?或者你有什么想法吗?我期待听到他们。

提前谢谢大家。

PS1:我想说我已经知道编程和如何编程(虽然我处于业余级别:-))我只是想在具体问题上进行改进,而不是开始学习它

P.S.2:我认为这是一个有用的主题供将来参考,所以我检查了社区wiki框。

13 个答案:

答案 0 :(得分:47)

每天解决问题。观察红绿灯并问自己:“如何同步这些以优化交通流量?或优化行人流量?两者的最佳解决方案是什么?”。看看电梯并问自己“为什么这些电梯使用的规则与我昨天访问的其他建筑物中的电梯不同?它是如何实际实施的?如何改进?”。

尝试在任何地方看到问题,即使它已经解决了。反思解决方案。问问自己为什么你自己的优秀解决方案可能不如你能看到的那样好 - 你错过了什么?

等等。每天。一直以来。

这个想法是,几乎所有东西都可以被视为一种算法(一个对某人具有某种意义的目标,以及一种实现它的方法)。下次在电视上观看比赛时,或者在阅读最新银行抢劫的新闻报道时,请记住这一点。问问自己“目标是什么?”,“它的目标是什么?”和“方法是什么?”。

它很容易被误认为是批判性思维,但更多的是质疑自己的解决方案,而不是你试图理解和改进的解决方案。

答案 1 :(得分:26)

首先,最重要的是:练习。想想每次解决所有问题的方法。它不必在您的计算机上进行编程。所有算法都会很棒。像这样:当你习惯换卡时,你是如何比较你的套牌和朋友的,以确定你们两个交易的最佳方式?你怎么能定义你可以做多少交易才能做到最大但却没有得到任何重复的卡?

使用像这个网站http://uva.onlinejudge.org/index.php这样的问题数据库和在线评委,这些网站有一百个关于通用算法的问题。而且你根本不需要成为专家程序员来解决任何问题。你需要的是具有逻辑和数学的良好能力。在那里,您可以找到从最简单到最具挑战性的问题。其中大多数来自编程马拉松。

然后,您可以使用C,C ++,Java或Pascal实现它们并将它们提交给在线评判者。如果你有一个好的算法,它将被接受。否则,法官会说你的算法给出了问题的错误答案,或者解决它需要很长时间。

阅读算法有所帮助,但不要浪费太多时间......阅读无助于自己解决问题。也许您可以阅读问题,尝试为自己找出解决方案,与源提出的解决方案进行比较,看看您错过了什么。不要试图记住它们。如果您已经充分了解这个概念,那么您可以在任何地方实施它。对大多数人来说,理解是最困难的部分。

答案 2 :(得分:11)

Polya的“如何解决它”是一本很好的书,用于思考如何解决数学问题和做证明,我建议任何解决问题的人。

但是!它并没有真正解决当现实世界通过信道噪声,用户狡猾,其他程序获取资源等为系统提供输入时所发生的兴奋。为此,值得研究应用于实际输入的算法。 (对Knuth的集合强制性且值得称赞),以及面对相同(TCP,内核内部)相当强大的系统。提出良好的算法解决方案的一部分是知道已经存在的东西。

除了阅读所有这些,当然还有练习练习

答案 3 :(得分:7)

你应该看看G. Polya的Mathematics and Plausible Reasoning。这是一本罕见的数学书,它实际上涉及数学发现所涉及的思维过程。我认为这与提出算法所涉及的思维过程相同。

答案 4 :(得分:5)

“实践完美”的说法绝对适用。我在编程时辅导我的一个朋友,我提醒他“如果你不知道如何骑自行车,你可以阅读每本关于它的书,但这并不意味着你会比Lance Armstrong更好明天 - 你必须练习“。

在您的情况下,如何尝试Project Euler中的问题? http://projecteuler.net

那里有很多问题,每一个你都可以练习开发算法。一旦获得足够好的实施,您就可以访问其他人的解决方案(针对特定问题),并了解其他人如何做到这一点。不要将其视为数学问题,而应将其视为为求解数学问题创建算法的问题。

在大学里,我实际上参加了算法设计和分析课程,其背后肯定有很多理论。您可能会听到人们在谈论“大O”的复杂性和类似的东西 - 算法本身有很多不同的属性,这可以使人们更好地理解什么是“好”算法。你可以在这方面进行长期研究。

答案 5 :(得分:5)

检查一些online judgesTopCoderalgorithm tutorials)。拿一些算法书(CLRSSkiena)并做更难的练习。多练习。

答案 6 :(得分:4)

我会建议你这条道路:

1.首先学习一门语言的基本部分。

2.然后学习一些基本的数学。

3.移动topcoder div2容易出问题。通常如果你得分不到250分。在任何一天,这意味着你需要大量练习,继续练习。

4.现在是时候学习程序员的一些工具,拿一本好书,如Steven Skienna的算法设计手册,学习动态编程和贪婪的方法。

5.现在转向马拉松,如果你不能迅速解决,不要气馁。改善不会在一夜之间发生,你必须耐心地继续努力。

6.从现在开始继续第5步,你将是一个更好的程序员。

答案 7 :(得分:3)

了解游戏编程可能会引导您获得良好的游戏编程算法,但不一定是更好的算法。

这是一个良好的开端,但我认为学习和应用算法知识的最佳方式是

  1. 了解您感兴趣的领域目前存在的优秀算法
  2. 通过查看其他区域扩展您的知识;例如,什么样的算法 从事遗传分析时需要?什么是确定的最佳方法 与洪水有关的径流潜力?
  3. 了解其他域中的问题并尝试使用您所使用的算法 熟悉它们是否合适。如果他们不试图打破问题,看看是否 你可以拿出自己的算法。

答案 8 :(得分:2)

还有一些值得阅读的书籍(没有特别的顺序):

  • 啊哈!洞察力(Martin Gardner)
  • 任何编程珍珠书籍(Jon Bentley)
  • 具体数学(Graham,Knuth和Patashnik)
  • 数学交流理论(Claude Shannon)

当然,大多数只是样本 - 同一作者的其他书籍和论文通常都很好(例如Shannon写了很多,非常值得一读,而且太少了人们给予应有的关注。)

答案 9 :(得分:1)

阅读SICP / Structure and Interpretation of Computer Programs并解决所有问题;然后阅读The Art of Computer Programming(所有卷),随时进行所有练习;然后在Project Euler处理所有问题。

如果你之后不熟悉算法,那么你可能没有希望。 LOL!

P.S。 SICP可以在线免费获得,但您必须购买AoCP(获得30美元的国际版,非北美版)。我自己也没有这样做过(我正在尝试空闲时间)。

答案 10 :(得分:1)

我可以推荐Nimal Nissanke(Addison Wesley)的“计算机科学家的入门逻辑和集合”一书。重点是集合论,谓词逻辑等。如果你愿意,基本上是解决代码中问题的数学。好东西,不太难以解决。

祝你好运......凯文

答案 11 :(得分:1)

大 如何尝试Euler项目中的问题? http://projecteuler.net

那里有很多问题,每一个你都可以练习开发算法。一旦获得足够好的实施,您就可以访问其他人的解决方案(针对特定问题),并了解其他人如何做到这一点。不要将其视为数学问题,而应将其视为创建解决数学问题的算法的问题

答案 12 :(得分:0)

好的,总结一下建议:

提高这种能力的最有效方法是尽可能频繁地解决问题。无论是现实问题(例如已经建议的电梯“算法”)还是像CLRS这样的书籍练习(很棒,我已经拥有它了) :-))。但我没有看到关于数学的评论,我不知道该怎么想(如果你同意或不同意)。: - s

链接很棒。我肯定会使用它们。我认为从国家/国际信息学竞赛中解决问题或阅读数学家证明定理的方式将是一个很好的练习。

再次感谢大家。尽管我已经对所提到的解决方案感到满意,但可以随意提出更多意见。

相关问题