首先,抱歉,但我的英语不是很好。
我在编程课程的第三学期,我不能“得到它”。
我通过了以前的考试,因为我的学习成绩是我同事的三倍。而且,现在在我的数据结构课程中,当教授要求我们制作列表算法时(例如),我的同事们开始编写代码而我(或者是“我”?),即使在看完它之后,也可以'理解。
我发现它很难受到痛苦。理解简单的算法需要1个小时。
所以问题是:任何人都可以向我推荐书籍或东西,这会让我更像是程序员吗?我的意思是,“正常”的人,在一个给定的问题之后,似乎立即在他们的头脑中制作图片并明星编写代码。
答案 0 :(得分:12)
你可能想要在逻辑上介绍哲学课。它与您使用计算机完全相同,但在不同的环境中。
答案 1 :(得分:7)
我认为有两种学习算法的方法: 1.自己尝试(然后用“正确”的答案进行复习)。当然,你应该从简单的开始。 2.实现其他算法(代码)。从算法到代码,反过来让你对算法的创建有一种很好的“感觉”。
但是我能给你的最佳建议(你可以用上面两种方式来获取) - 尝试非常擅长一些算法。 如果你能记住,写作并且甚至只是理解一些基本算法 - 你就是正确的方法。
无论如何,我认为学习算法主要是练习而不是“抽象知识”,所以准备好弄脏你的手......
祝你好运!!
答案 2 :(得分:7)
我发现掌握数据结构最重要的技能是“可视化”它们。如果您对数据结构没有清晰的了解,那么一切都会模糊不清。例如。采取堆栈(单链表)。它可能有助于将其视为一堆板块或波兰人(每个人的双手放在他面前的人的肩膀上)。
或双链表:想象一下,一排人抓住了左右邻居的腰带。现在你可以想象你必须做些什么来移除一个人:它的左邻居需要抓住右邻居的腰带,右邻居需要抓住左邻居的腰带。然后你可以“删除”那个人(或者垃圾收集器在Java等中为你做这个)
第二个重要技能是理解递归。您总是需要一个基本案例,通常涉及空列表或空节点。当您在递归方法中遵循算法时,请检查它是否正确,但不遵循该方法中的递归调用。这会让你发疯并导致一无所获。假设递归调用总是“做正确的事”。如果您当前的方法是正确的,那么基本情况也就完成了。一旦你理解了这一点,你就会理解递归。
答案 3 :(得分:6)
如果有帮助,您可能想要用您的母语尝试书籍。如果您的理解与您的英语理解有任何差距,那将为您增加额外的难度。
其次,算法只是实现某些目标的一系列步骤。尝试专注于像排序算法这样简单的事情,它们既有趣又易学。希望有所帮助。
答案 4 :(得分:4)
我不知道这个问题涉及多远,但它可能会有所帮助。
如果我将它们视为非正式的想法/盒子/形状/形式/连接/ ......而不是抽象的东西,算法和数据结构对我来说更清洁。
也就是说,每当我遇到一个新的数据结构时,我都会尝试以某种方式将其可视化,以便实际上能够“看到”单个操作对结构的作用。
我有时也遇到了一个问题,我实际上并不知道如何通过算法解决问题,所以我就开始画画了。
让我们以 - 例如 - 将二叉树转换为列表的问题为例。所以,我绘制了一棵树(任意大小并保持任意元素,但是它是一个“好”的例子)。然后我想我将如何将树转换为手动列表:
1
2 3
4 5 6 7
所以我想:我希望得到结果[4,2,5,1,6,3,7]
。我该如何逐步完成这项工作?
好的,首先,我找到最左边的元素(4
);我怎样才能做到这一点?好的,我从根开始向左走,直到没有更多。然后我删除这个元素并继续使用剩余的树:
1
2 3
. 5 6 7
好的,现在我会选择2
。我怎样才能到达2
?好吧,我可以再次从根开始向左走,直到没有其他或我只是从已删除的节点返回。
然后我继续寻找反复出现的模式,如何概括步骤等。
结果是,通过直观地表示算法正在做什么然后你可以实现它可能会有所帮助。
答案 5 :(得分:3)
我认为在实现任何内容之前使用图表是一种很好的做法。您可以制作diagrams或撰写a pseudo code,在开始设计或实施实际代码之前,它们很有用。
答案 6 :(得分:3)
当我第一次使用编程语言时,我遇到了类似的问题。我错过了很多讲座,因为这是我上大学的第一年!对我来说,没有任何书籍或讲师知道如何帮助你像程序员一样思考。我总是发现教学人员不知道如何“不再”像程序员那样思考,因此他们认为你知道简单的概念。所以最后在我的第一年结束时,我不得不主要赶上并且不得不自己填补空白......!这就是我现在对编程问题的看法:
对象:对于面向对象的编程对象是整个事物的关键。如果你考虑一下你的程序需要做什么,那么你可以将程序分解成更小的块。例如,如果您想要制作一杯茶,那么制作一杯茶所需的物品是:
1 -> A cup
2 -> A tea bag
3 -> Water
4 -> A kettle
5 -> A spoon
6 -> Milk
7 -> Sugar
所以现在你的程序有7个对象,它们会以某种方式相互作用来制作一杯茶。对象总是被声明为它们自己的类,并且将具有构造函数方法,这些方法在被调用时将创建对象的副本(实例化),然后可以在程序中使用它。您的类中的所有方法都将定义您的对象可以提供的功能。
Kettle kettle = new Kettle();
kettle.boilWater();
所以现在你有了你的对象,你应该考虑你的算法。
算法:在所有编程语言中,算法基本上只是一个步骤列表,可帮助您实现最终目标。在我们的例子中,我们的最终目标是制作一杯茶。
您将在算法中采取的步骤必须以合乎逻辑的方式一个接一个地进行,即您不能将牛奶倒入水壶,或将冷水倒入杯中并将糖煮沸等。
所以我们的算法可以如下:
Step 1: Pour water into Kettle
Step 2: Turn kettle on - to boil the water
Step 3: Put tea-bag into cup
Step 4: "IF" water is boiled -> pour into cup
"ELSE" wait until water has boiled
Step 5: Stir teabag with spoon
Step 6: Pour milk into cup
Step 7: Put sugar into cup
Step 8: Stir
总有一些不同的方法可以安排算法中的步骤,这些算法仍然可以使用,但始终记住要有逻辑顺序,否则你会弄得一团糟!
同样的原则也适用于最复杂的问题。最重要的是尝试将问题分解为最简单的步骤,并以常识的方式安排步骤。
当谈到更复杂的任务时,了解您可以使用哪些工具显然非常重要,即了解API为您提供的功能并熟悉语法。但正如人们在练习之前已经提到的那样,你已经完美了。这是你开始理解它的唯一方式,并相信我你最终会得到它...总有一天它会对你有意义只是想某种方式。将所有内容分解为简单的小步骤,然后以合理的方式排序步骤。这样做,它将开始对你有意义。我承诺!!
答案 7 :(得分:2)
如果你想深入了解并愿意努力工作,那就有"Structure and Interpretation of Computer Programs"。它已绝版,但可在网上获得。
深入探讨编程背后的概念思维过程并将其转换为代码。它使用方案,但原则适用于所有地方,这是一个很好的训练,以弯曲抽象肌肉。
不要一气呵成......花点时间,经常回来,玩得开心!
答案 8 :(得分:2)
尝试思考如何处理日常认知问题,并在纸面上正式确定解决问题的步骤。
例如,如果你曾经不得不重新排序一副52张混乱卡片,你可能已经知道插入排序或Merge Sort的某些变体。如果要求您对头部中的五个2位数字进行排序,则可能正在使用“选择排序”。如果你必须从混乱的套牌中找到一张特定的牌,你可能会使用线性搜索。如果您曾经见过“价格合适”的“高低游戏”,您可能知道二元搜索。如果你被要求将8-Queens问题解决为“谜题”,你几乎肯定会使用经典的回溯技术。
不要让“循环不变”或“渐近时间复杂度”这样的行话直接威胁到你。想想算法如何处理问题,当你想要推断它的正确性或效率时,你会发现自己“重新发现”这些术语。
答案 9 :(得分:1)
我建议你可以尝试一些包含许多算法问题的网站来解决。通常,您可以找到许多非常容易开始的问题,以及讨论它们的论坛。然后由你决定你花多少时间在他们身上。试着尽可能多地详细说明你自己究竟是什么,你不明白,然后你怎么能想出来(也许有人已经想到了这一点,你只需要找到答案)。对于最简单的问题,Google绰绰有余,无法找到您正在寻找的答案。
以下是您可以尝试的网站列表:
uva.onlinejudge.org - 与不同算法相关的大量问题列表
www.topcoder.com/tc - 现场比赛和许多入门教程。
www.algorithmist.com - 记录问题解决者随时间收集的链接列表。