这里有一些想法。可能你会发现这个问题在任何算法书的序言中回答,但无论如何,这是我的看法。
1)不受数据结构编程语言的约束
没有对各种数据结构的了解,很容易限制在语言直接提供的数据结构方面思考解决方案。
如果您是Java程序员,您可能会考虑解决方案,只是在java.lang.util包中提供的内容。
那还有更多的东西 例如一个简单的需求:在低端,基本的手机,作为用户键入的东西,你想向用户呈现“自动完成”功能。在语言/图书馆容易提供的数据结构方面的思考并没有多大帮助。
一个简单的特技 会在这里帮忙。另一个例子,想想我们使用的任何网络网站 -
Facebook如何建议你的朋友,LinkedIn如何告诉personX是一个二级联系人?
一个图形 数据结构有助于在这里。
或者当有一个稳定的数字流入,你想保持最大的10个数字。(你没有
奢侈的存储所有的数字和排序) 最小的堆是一个去。
列表继续..
2)更好的硬件不是解决方案
没有额外的硬件将补偿低效的算法。超级计算机需要1周的时间才能使用插入排序排序十亿个数字,而家庭计算机需要18分钟,使用合并排序排序10亿个数字。
插入排序:O(n 2)
合并排序:O(n logn)
3)你会遇到一些非常有趣,非直观的解决问题的方法
给定一个n / 2个不同元素和另一个元素的n / 2个拷贝的数组。找到缺少的元素。
那么,我们都会想到的正常的解决方案是通过数组进行线性扫描,并在最坏的情况下读取n / 2 + 2个元素后找到缺少的元素。[最差的情况=所有n / 2个不同的数字首先出现在数组中,然后数字 - 哪个重复出现n / 2次]
有趣的是,这样可以更快地解决这个问题:
1
2
3
4
五
6
7
while(true) do
i = Rand.numberWithinRange(1 to n)
j = Rand.numberWithinRange(1 to n)
if(i!=j) and a[i]=a[j] then return i;
并且在10次迭代中算法不退出的概率为0.1074!
“随机化”证明是解决一些问题的惊人实用方法。
并为“随机化”提供更多的“真实世界”的应用程序 - 随机版本的快速排序是最实用/最有效的排序算法之一!
准备好让许多很酷的,非直观的,令人惊奇的解决问题的方法感到惊讶
4)刷新一点概率,对数和一些有趣的数学
有趣的是回到一些数学,特别是概率,期望值,对数。
5)学习一些有趣的设计范例
在学习不同的算法的同时,您也可以掌握不同的算法设计范例。
(分歧与征服,贪婪的方法,回溯,动态规划)
当有一个新的问题要解决时,这个知识有助于提出一个有效的解决方案。
6)这是一个技巧
某些事情只是“知识” - 当需要时,可以沿着这个方向学习。
例如:没有真正需要知道所有的“MVC”框架。知道一个就够了 有必要使用一些其他的MVC框架?那可以沿途学习
但算法和数据结构不属于该类别。这是一个技巧,推导出一个问题的算法/这是一个分析复杂性的技巧,并且告诉哪个算法是更好的算法/提前学习是很好的。获得技能是有趣的,对吧?
7)存在O(n)溶液时的二次复杂度
没有一些算法学习,当有效的解决方案已经存在时,我们很有可能提出无效的解决方案!
8)了解日常工具背后的内容
几乎每一个我们使用的工具,日复一日地应用了一些很酷的算法。
找到哪些算法应用于哪里可以是一个有趣的练习!