精华内容
下载资源
问答
  • 如何学习数据结构

    2011-11-28 18:02:51
    如何学习数据结构
  • 20 20 20 20 如何学习数据结构 1 数据结构学习一定要自己独立完成代码实现虽然有时候你理解内容了但是实现上面还是会愈要很多困难的解决这些困难会帮助你提高程序设计的能力的 2 数据结构是计算机专业最重要最基础的...
  • 学渣如何学习数据结构的投稿:小鹿周六写了一篇《基础篇|学渣是如何学习数据结构的》,这篇稿子经过大佬的指导整体改了一遍,更加注重不同基础读者的可操作性和实用性,无论是你是计...
        

    学渣如何学习数据结构的

    投稿:小鹿

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

    一般学习方法存在的误区

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

    提高实际解决问题的能力

     

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

     

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

     

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

     

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

    1. 

    2. 

    3. 

    4. 

    640?wx_fmt=png

    点一个赞少一个Bug ↓

    展开全文
  • 我是如何学习数据结构与算法的?

    千次阅读 多人点赞 2018-10-24 16:25:02
    主要是最近几天后台有读者问我是如何学习数据结构与算法的,有没有什么捷径,是要看视频还是看书,去哪刷题等…而且有些还是大三大四的,搞的我都替你们着急、担心… 所以我今天就分享下自己平时都是怎么学习的。 ...

    数据结构与算法的地位对于一个程序员来说不言而喻。今天这篇文章不是来劝你们学习数据结构与算法的,也不是来和你们说数据结构与算法有多重要。

    主要是最近几天后台有读者问我是如何学习数据结构与算法的,有没有什么捷径,是要看视频还是看书,去哪刷题等…而且有些还是大三大四的,搞的我都替你们着急、担心…

    所以我今天就分享下自己平时都是怎么学习的。

    学习算法的捷径就是多刷题

    说实话,要说捷径,我觉得就是脚踏实地着多动手去刷题,多刷题。

    但是,如果你是小白,也就是说,你连常见的数据结构,如链表、树以及常见的算法思想,如递归、枚举、动态规划这些都没学过,那么,我不建议你去刷题的。而是先去找本书先去学习这些,然后再去刷题。

    也就是说,假如你要去诸如leetcode这些网站刷题,那么,你要先具备一定的基础,这些基础包括:

    1、常见数据结构:链表、树(如二叉树)。

    2、常见算法思想:贪婪法、分治法、穷举法、动态规划,回溯法。

    以上列出来的算是最基本的吧。就是说你刷题之前,要把这些过一遍再去刷题。如果你连这些最基本的都不知道的话,那么你再刷题的过程中,会很难受的,思路也会相对比较少。

    总之,千万不要急,先把这些基本的过一遍,力求理解,再去刷题。这些基础的数据结构与算法,我是在大一第二学期学的,我没看视频,我是通过看书学的,那时候看的书是:

    1、算法分析与分析基础:这本比较简单,推荐新手看。

    2、数据结构与算法分析—C语言描述:代码用C写的,推荐看。

    3、挑战程序设计竞赛(第二版):也是很不错的一本书,推荐看。

    具体可以看我的另外一篇文章,里面是介绍这几本书的:
    算法与数据结构书籍与视频福利

    说实话,我那一学期的时间几乎都花在数据结构与算法上,但刷的题很少,只是书本上的一些例题。所以当我把这些基本的过一遍之后,再去一些网站刷题依旧非常菜。

    所以你们千万别指望以为自己把这些思想学完之后刷题会很牛,只有多刷题,只有多动手实践,你的灵敏度才会提高起来。

    在这里说一下前阵子有个非常火爆的专栏—【数据结构与算法之美】

    我没买这个专栏,我想说的是,买了就一定要去看,千万别浪费。也千万不要觉得学完这个专栏你就会变的多牛逼,如果你只是跟着进度去学习这个专栏,自己没有花时间去刷题、去动手时间。那我可以保证,你学完之后还是那么菜。

    总结下:

    提高数据结构与算法没啥捷径,最好的捷径就是多刷题。但是,刷题的前提是你要先学会一些基本的数据结构与算法思想。

    追求完美

    如何刷题?如何对待一道算法题?

    我觉得,在做题的时候,一定要追求完美,千万不要把一道题做出来之后,提交通过,然后就赶紧下一道。

    算法能力的提升和做题的数量是有一定的关系,但并不是线性关系。也就是说,在做题的时候,要力求一题多解,如果自己实在想不出来其他办法了,可以去看看别人是怎么做的,千万不要觉得模仿别人的做法是件丢人的事。

    我做题的时候,我一看到一道题,可能第一想法就是用很粗糙的方式做,因为很多题采用暴力法都会很容易做,就是时间复杂度很高。之后,我就会慢慢思考,看看有没其他方法来降低时间复杂度或空间复杂度。最后,我会去看一下别人的做法,当然,并不是每道题都会这样执行。

    衡量一道算法题的好坏无非就是时间复杂度空间复杂度,所以我们要力求完美,就要把这两个降到最低,令他们相辅相成。

    我举道例题吧:

    问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?

    这道题我在以前的分章分析过,不懂的可以先看下之前写的:递归与动态规划—基础篇1

    方法1::暴力递归

    这道题不难,或许你会采取下面的做法:

    public static int solve(int n){
        if(n == 1 || n == 2){
            return n;
        }else if(n <= 0){
            return 0;
        }else{
            return solve(n-1) + solve(n-2);
        }
    }
    

    这种做法的时间复杂度很高,指数级别了。但是如果你提交之后侥幸通过了,然后你就接着下一道题了,那么你就要好好想想了。

    方法二:空间换时间

    力求完美,我们可以考虑用空间换时间:这道题如何你去仔细想一想,会发现有很多是重复执行了。所以可以采取下面的方法:

    //用一个HashMap来保存已经计算过的状态
    static Map<Integer,Integer> map = new HashMap();
    public static int solve(int n){
        if(n <= 0)return 0;
        else if(n <= 2){
            return n;
        }else{//是否计算过
            if(map.containsKey(n)){
                return map.get(n);
            }else{
                int m = solve(n-1) + solve(n-2);
                map.put(n, m);
                return m;
            }
        }
    }
    
    

    这样,可以大大缩短时间。也就是说,当一道题你做了之后,发现时间复杂度很高,那么可以考虑下,是否有更好的方法,是否可以用空间换时间。

    方法三:斐波那契数列

    实际上,我们可以把空间复杂度弄的更小,不需要HashMap来保存状态:

    public static int solve(int n){
        if(n <= 0)
           return 0;
        if(n <= 2){
            return n;
        }
        
        int f1 = 0;
        int f2 = 1;
        int sum = 0;
        for(int i = 1; i<= n; i++){
            sum = f1 + f2;
            f1 = f2;
            f2 = sum;
        }
        return sum;
    }
    

    我弄这道题给你们看,并不是在教你们这道题怎么做,而是有以下目的:

    1、在刷题的时候,我们要力求完美。

    2、我想不到这些方法啊,怎么办?那么你就可以去看别人的做法,之后,遇到类似的题,你就会更有思路,更知道往哪个方向想。

    3、可以从简单暴力入手做一道题,在考虑空间与时间之间的衡量,一点点去优化。

    推荐一些刷题网站

    我一般是在leetcode和牛客网刷题,感觉挺不错,题目难度不是很大。

    在牛客网那里,我主要刷剑指Offer,不过那里也有个在线刷leetcode,不过里面的题量比较少。牛客网刷题有个非常方便的地方就是有个讨论区,那里会有很多大佬分享他们的解题方法,不用我们去百度找题解。所以你做完后,实在想不出,可以很方便着去看别人是怎么做的。

    至于leetcode,也是大部分题目官方都有给出答案,也是个不错的刷题网站。你们可以两个挑选一个,或者两个都刷。

    当然,还有其他刷题的网站,不过,其他网站没刷过,不大清除如何。

    再说数据结构

    前面我主要是说了我平时都是怎么学习算法的。在数据结构方法,我只是列举了你们一定要学习链表树(二叉堆),但这是最基本的,刷题之前要掌握的,对于数据结构,我列举下一些比较重要的:

    1、链表(如单向链表、双向链表)。

    2、树(如二叉树、平衡树、红黑树)。

    3、图(如最短路径的几种算法)。

    4、队列、栈、矩阵。

    对于这些,自己一定要动手实现一遍。你可以看书,也可以看视频,新手可以先看视频,不过前期可以看视频,之后我建议是一定要看书。

    视频和书我以前有推荐过:
    算法与数据结构书籍与视频福利

    例如对于平衡树,可能你跟着书本的代码实现之后,过阵子你就忘记,不过这不要紧,虽然你忘记了,但是如果你之前用代码实现过,理解过,那么当你再次看到的时候,会很快就记起来,很快就知道思路,而且你的抽象能力等等会在不知不觉中提升起来。之后再学习红黑树啊,什么数据结构啊,都会学的很快。

    最最重要

    动手去做,动手去做,动手去做。重要的话说三遍。

    千万不要找了一堆资源,订好了学习计划,我要留到某某天就来去做…

    千万不要这样,而是当你激情来的时候,就马上去干,千万不要留到某个放假日啊什么鬼了,很多这种想法的人,最后会啥也没做的。

    也不要觉得要学习的有好多啊,不知道从哪学习起。我上面说了,可以先学习最基本的,然后刷题,刷题是一个需要长期坚持的事情,一年,两年。在刷题的过程中,可以穿插和学习其他数据结构。

    最后

    今天就说这么多,以上主要是我自己的学习方法,希望对你有所帮助。

    展开全文
  • 算法也是一种思想,当你去读一些优秀框架的源码,如果对算法和数据结构一无所知,读起来很困难,你无法理解人家为什么要那样写,那样写的好处是什么,接下来就跟大家分享下作为一个前端程序员,如何学习数据结构与...

    生命不是要超越别人,而是要超越自己。

    前言

    作为一个对算法没有任何认知,非科班出身的前端程序员,如果想提高自己的能力,不再只写业务代码当一个应用工程师,算法是必须掌握的一门本领。算法也是一种思想,当你去读一些优秀框架的源码,如果对算法和数据结构一无所知,读起来很困难,你无法理解人家为什么要那样写,那样写的好处是什么,接下来就跟大家分享下作为一个前端程序员,如何学习数据结构与算法。

    后续将持续更新与算法相关的文章,分享自己所学以及踩的各种坑,欢迎各位感兴趣的开发者持续关注💌

    什么是算法

    算法就是计算或者解决问题的步骤,算法与程序有些相似,区别在于程序是以计算机能够理解的编程语言编写而成的,可以在计算机上运行,而算法是以人类能够理解的方式描述的,用于编写程序之前。不过,在这个过 程中到哪里为止是算法、从哪里开始是程序,并没有明确的界限。

    就算使用同一个算法,编程语言不同,写出来的程序也不同;即便使用相同的编程语言, 写程序的人不同,那么写出来的程序也是不同的。

    数据结构与算法的作用

    计算机是一个冰冷的机器,操作者下发什么指令,计算机就会执行什么操作

    开发者要做的只是如何把实际问题转换成计算机可识别的指令,如何转化?《数据结构》的经典说法:设计出数据结构,在施加以算法就行了。
    开发者编写的指令好坏,将直接影响到程序的性能,指令又由数据结构和算法组成,因此数据结构和算法的设计与最终程序的好坏息息相关。

    入门书籍以及学习路线

    入门书籍推荐

    • 《学习JavaScript数据结构与算法》 第3版

    • 《我的第一本算法书》

    • 《数据结构与算法图解》

    • 《大话数据结构》

    学习路线推荐

    • 先学习《我的第一本算法书》

    书中没有使用任何编程语言,有丰富的配图来讲解算法和数据结构,作为一个小白,看这本书最为合适。

    • 再学习《学习JavaScript数据结构与算法》 第3版

    本书从js角度出发,讲解常用算法和数据结构。相对于前端而言,这本书可以让你理解算法和数据结构在前端的应用。

    • 最后学习《数据结构与算法图解》和《大话数据结构》

    这两本书采用其他编程语言讲解,学习完前两本书后,再来看两本书可以更深层次的理解算法。

    算法题目的选择与练习

    • 《剑指offer》

    可以在书中学习很多经典题目,练的多了会总结出每种算法的规律,掌握书中的内容后,再去解leetcode上的题会轻松很多。

    • 刷leetcode

    先从简单的题开始解,慢慢进入中等难度。中等的题目可以解决时,已经对典型题目有了很深的见解,此时再去解决更复杂的问题时,就可以活学活用,根据规律来解决问题。

    相关文章以及网站推荐

    前端该如何准备数据结构和算法

    awesome-coding-js

    写在最后

    • 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊
    • 本文首发于掘金,未经许可禁止转载💌
    展开全文
  • 其实学习数据结构重点并不在于哪本书,哪个教程,那个网课。首要的问题是,要搞清楚数据结构的目的。故名思议,数据结构这门学科就是为了让计算机能够以更加高效,简单,便捷的方式来存储和使用数据而产生的。所有的...

    看了这么多答案,感觉很多人都没回答到点子上。

    今天刚好帮表弟解释这个问题。我来讲下我的学习体验。

    其实学习数据结构重点并不在于哪本书,哪个教程,那个网课。

    首要的问题是,要搞清楚数据结构的目的。

    故名思议,数据结构这门学科就是为了让计算机能够以更加高效,简单,便捷的方式来存储和使用数据而产生的。所有的目标都围绕着存和取两个目标打转。在这两个目标下,有几个评估的指标,存取效率,可扩展性,顺序性,可排序性这几个特征。

    要明白这几种特征,就需要先搞清楚几个前提,

    一、内存的数据存储模式,是以顺序排列的方式存储的。

    也就是说,内存中的数据是起点是0,终点根据内存的大小和操作系统而定的一个顺序的序列。0被占用,后面存入的数据则依次存入。

    二、程序在一个线程中,一次只能从一个地址来取数据。所以,除了图之外,所有的数据结构都有且只有唯一的取数入口。所以,必须从一个入口来进行取数。

    三、内存的数据存取并不是单线的,而是很多个程序不断的进行并行操作的。所以数据的分布是不连续的,操作系统并不能保证可以一次性找到足够大的一块内存来存放一次操作所需要的所有数据。

    可以用磁盘碎片整理的图示来类比一下,使用一段时间以后,内存中的数据大概就是这个样子的,此时要想一次性开出一大块数据,是不可能的,所以要想办法解决数据量无限增加时的数据分配。

    四、数据结构的基础是最吃理解的一门课程,只要理解了,除了遍历算法之外,都豁然开朗,所以刷题毫无意义。关键是理解几中种数据结构存在的目的,和他们之间的区别。

    数据结构分为三大类。

    一、线性表:

    线性表是为了解决单线存储而出现的。

    数组:就是最简单粗暴的存储方法。就是直接拉出一大块数据存在那里。数组的快速存取其实只是一个副作用,因为所有的数据都在一起,可以直接算出来数据的地址。

    链表:则是为了解决可以无线增长的需求的。因为找不到一大块可以连续的存入数据,甚至也不知道程序可能使用的数据总量,所以就没办法划分一块数据来使用,划小了不够用,划大了浪费(这在早年是非常大的事情)。所以必须想办法解决问题。最后采用的方法就是从入口开始,每一个数据块不仅仅有数据,还会有指向下一个数据块的线索,用来寻找下一个数据。这就是链表。

    所谓的双向链表,只是加了一个向前的线索的链表而已。不仅如此,队列,栈,都是线性表的特殊形态。进行了操作上的限制罢了。既可以是数组,也可以是链表。

    二、树:

    树是为了解决单一入口下的非线性关联性的数据存储或者排序这样的功能而来的。

    最常见的应用是编程时候的map,就是利用了二叉树的可排序和可以快速插入并且保持序列完整的特性来构建键值数据对,来实现数据的插入增加以及快速查找的能力的。

    还有做语法解析,文字处理等等很多场景也会用到树。这就不一一赘述了。当然在吃透线性表的基础上,再去理解树也并不难。因为在本质上,树相对于链表,就是每个节点不止有一个后续节点但是只有一个前置节点。

    三 图:

    图是数据结构里最难的一部分,但是很多学校并不作为重点,因为确实大部分人不会用到。

    图的本质其实就是把线性表进一步扩展,每个节点会有不止一个前置和后缀节点,而且前置和后缀的概念也不再明晰,变成了关联节点。

    具体的应用主要是一些特殊的算法和图形学上的一些使用。我自己也没有用过。没办法细讲了。

    总之数据结构的前期学习要重理解。以倒推的方式,搞清楚每种数据结构产生的目标。多画画图,思考一下,理解透彻以后。再去做练习题会事半功倍。

    展开全文
  • 到底如何学习数据结构? 昨天买了本《大话数据结构》,之后就开始看。数据结构给我的印象就是一大堆code,自己实现很麻烦,而且很容易出detail errors,望着书上的代码,我在想,难道我真要把他们都能独自写下来...
  • 如何学习数据结构与算法

    万次阅读 多人点赞 2018-07-13 11:29:23
    经过一段时间的数据结构与算法的学习,和学习了前人的经验,为了更好的指导自己(希望也能帮助到别人)之后数据结构与算法的学习,总结一下数据结构与算法学习的方法。 一、记住数据结构,记住算法思想(是什么) ...
  • 如何学习数据结构和算法——大佬文章汇总

    千次阅读 多人点赞 2019-01-23 16:32:48
      第一篇     ... 国内的话,一般来讲,工资高的公司在面试时算法和数据结构题目的比重较大,工资一般的公司比重较小。当然同样公司的不同岗位... 国外的互联网公司呢,几乎只考算法和数据结构,很多年前就是...
  • 数据结构与算法的重要性对程序员来说不言而喻,本文就来分享下我是如何学习数据结构与算法的,希望对你们有所帮助。   学习算法的捷径就是多刷题   要说捷径,我觉得就是脚踏实地,多刷题。 但是,如果你是...
  • 先要声名一点,我目前没有考试的计划,只是想通过学习这门课程...以前在QQ群中,有人就反对过我学数据结构,那时我因为还处于迷茫阶段,不知学什么怎么学,大把的时间看了些算法,又把那些算法用delphi实现,那些程...
  • 1.什么是数据结构,什么是算法 定义: * 数据结构:指一组数据的存储结构 * 算法:就是操作数据的一组方式 关系: 数据结构是为算法服务的,算法要作用在特定的数据结构之上 因为数组具有随机访问的特点,常用的二分...
  • 一、相关概念正式了解数据结构之前,先来了解一些相关概念。①数据:所有能够输入到计算机中,且能被计算机处理的符号的集合。②数据元素:是数据(集合)中的一个“个体”,它是数据的基本单位,如二维表中一行记录。...
  • 边练,适度刷题每周花费1~2小时时间集中实现本周学习的数据结构和算法,实现方法:全部自己写出来,用代码实现一遍。2.多问,多思考,多互助3.打怪升级学习法在学习过程中,给自己设立一个切实可行的目标,如同...
  • 数据结构是什么: 数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。 数据结构是为算法服务的,算法是要作用再特定的数据结构上的。 需要什么: 效率和资源消耗的度量衡–复杂度...
  • 此分类下的文章是学习极客时间专栏——数据结构与算法之美的笔记,专栏作者是王争大神。 不知道会不会被CSDN限流。。。 什么是数据结构?什么是算法? 我们现在学习不是为了考试,所以不能死抠概念。虽然说没有必要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,446
精华内容 4,578
关键字:

如何学数据结构

数据结构 订阅