为什么要学习算法和数据结构?

这里有一些想法。可能你会发现这个问题在任何算法书的序言中回答,但无论如何,这是我的看法。

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)了解日常工具背后的内容

几乎每一个我们使用的工具,日复一日地应用了一些很酷的算法。

找到哪些算法应用于哪里可以是一个有趣的练习!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值