学渣如何学习数据结构的

学渣如何学习数据结构的

投稿:小鹿

周六写了一篇《基础篇|学渣是如何学习数据结构的》,这篇稿子经过大佬的指导整体改了一遍,更加注重不同基础读者的可操作性和实用性,无论是你是计算机专业还是非计算机专业,基础篇写到的方法完全很实用。为了考虑到另一部分读者,可能已经入门或者有了一定的能力了,接下来怎么来继续学习数据结构与算法呢?这一篇提高篇将会详细的分享一下进一步提高的学习方法。

一般学习方法存在的误区

在分享之前,我想分享一下部分人在数据结构与算法上普遍存在的误区或者可以说是低效的学习方法。一方面就是很多人在没有完全掌握数据结构的时候就去 Leetcode 去刷题,我之前这个误区我也走进去过,大二的时候,对数据结构的了解只有一点皮毛,然后在网络上看到大佬建议去LeetCode 刷算法题提高逻辑思维能力,也为了能够顺利的通过面试。

 

当我把数据结构刷了三遍的时候,才觉得刷题的前提一定至少过一遍数据结构,知道他们具有什么特征,有哪方面的应用,最基本的代码实现能够顺手就写出来,掌握这些之后,然后再去刷题的效率就会提高数倍。那么你会问到,完全掌握也有个程度,怎么个程度算是掌握呢?

 

比如,当提到数组时,你能够很轻松自由的进行扩展,比如数组是什么?数组的优点和缺点有哪些,怎么优化数组的缺点,时间复杂度又是多少?能不能随手写一个动态扩容的数组?如果这种基本的知识掌握了,就去Leetcode 刷关于数组的题目,这种思维能力就会很快的得到提升。

 

提高自己检索数据结构的能力

 

在基础篇中,实践的第三阶段中的检索数据结构,只是简单的做了介绍和练习方法,这一阶段对在解决实践项目中有什么用呢?

 

举个确切的例子,比如你是百度的一位前端工程师,前端页面有这样一个功能需要你去做,每个小时我们在首页就要显示用户搜索最多的10个热点新闻,我们很容易就会想到先对全网所有的关键字进行统计,从中选出出现频率最多的十个关键字进行在页面显示。

 

那我们用什么方法进行统计呢?这时候就用到我们日常中学习时间的第三个阶段检索,我们在大脑中快速的检索能够实现统计的数据结构,因为涉及到动态数据不断插入,我们选择散列表来统计每条新闻的关键的被用户搜索的数量,因为百度的用户算是上千万甚至上亿的用户,我们必须确保程序执行效率。因为涉及到动态数据不断的进行添加,再根据要选出前 10 大关键字的特点,我们就会用到堆这种动态数据结构能够在时间复杂度为O(logn)的时间内进行统计。

 

在这个解决问题当中,使用的散列表要考虑到散列冲突,散列冲突有涉及到解决办法,会结合到链表或者快速增删改查的等数据结构,一下就扩展开来。可能检索的阶阶段需要专注的会用大量的时间来去思考去总结, 我觉得所思考的时间是非常值得的。

 

提高实际解决问题的能力

 

学数据结构的最终目的就是为了提高自己解决实际问题的能力,咱们就从实际中最小的问题开始,解决实际中最小的问题之前先知道数据结构中最经典的问题的解决方法。比如动态规划问题最经典的应用就是 0/1 背包问题,当时我就讲 0/1 背包问题扩展成能够解决实际中的问题,比如参与天猫超市的满减活动。虽然两者都是求最优解问题,但是,当我亲自实践去解决实际中的问题的时候,又遇到了问题。

 

实际问题中往往比设定的题型复杂的多,有时候出现眼高手低的情况,你可能分析问题能力很强,随便给你一个问题你就鞥能够通过性能、效率、内存消耗很快的分析出用哪种数据结构最适合,这毕竟是猜想,当真正的把代码写出来的时候,却很惊奇的发现不是想象的那么好,性能、内存消耗也不是最优。

 

在没工作之前或者再没接触大型用到数据结构和算法的项目之前,每个人最好还是要具备这种能力的,这种能力的提高来自的日常的刻意练习。

 

 本文来自作者「小鹿」的投稿,在运营订阅号:一个不平凡的码农 。

1. 

2. 

3. 

4. 

640?wx_fmt=png

点一个赞少一个Bug ↓

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页