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

    千次阅读 2012-05-17 15:07:28
    很多计算机专业的同学对于大学2年级开设的数据结构课程很是头痛. 看见大家总在谈论数据结构重要性,可使自己学习却总也找不到合适的方法. 下面我和大家分享一下我过去一年多以来学习和应用数据结构方面一些经验. ...
    很多计算机专业的同学对于大学2年级开设的数据结构课程很是头痛. 
    看见大家总在谈论数据结构重要性,可使自己学习却总也找不到合适的方法.
    下面我和大家分享一下我过去一年多以来学习和应用数据结构方面一些经验.
    内容都是来自作者本人的一些经历和体验,希望对于大家学习数据结构有引导作用。

    1 什么是数据结构
    数据结构从文字上面来看,为数据和结构两部分。这样就很容易联系到数据结构的本质是一种对于数据结构花的知识。补充一个知识点,数据结构本质和离散数学有很密切的关系。离散数学是处理的是离散(非连续的)的数据,站在数据结构的观点上来看,也可以理解是一种非连续数据的结构。

    2 数据结构和程序设计语言
    数据结构和程序设计语言本身没有任何联系,唯一有的关系就实用程序语言去描述数据结构。
    因为数据结构是一种抽象数据,通过程序设计语言可以将在计算机中进行实现。今天大学里数据结构课程常用来描述数据结构的语言有C程序设计语言,C++程序设计语言和JAVA程序设计语言. 而对于喜欢其他语言的同学完全可以自己通过学习数据结构后用自己熟悉的程序设计语言去完成程序化的描述.
    我自己过去很喜欢C#程序设计语言,自己用C#程序设计对于一些数据结构进行了实现.
    大家可以通过访问CSTC我的专栏看到两篇C#描述的数据结构
    http://www.cstc.net.cn/?item=member&id=100500
    3 数据结构学习的技巧
    3.1 学习数据结构的概念后对于抽象数据类型的设计参考C++ STL标准库中容器的设计.这样对于无论是数据结构的学习还有程序设计接口能力上都会有很大的提高.
    3.2 对于数据结构课程中很多时候都不太重视的顺序(数组)做存储的数据结构,希望大家还是要多留意这快的知识.对于有些场合需要考虑时间换空间的情况下需要考虑顺序存储结构.
    3.3??数据结构学习一定要自己独立完成代码实现,虽然有时候你理解内容了,但是实现上面还是会愈要很多困难的,解决这些困难会帮助你提高程序设计的能力的.

    推荐一本习题集
    C++描述的数据结构的习题集(英文版)
    http://www.rjjd.com/bbs/read.php?tid=3468&page=1&fpage=1



    数据结构是计算机专业最重要最基础的一门课,对于有过编程经验的人,结合自己的编程体会去悟它的思想;对于初学者,捡一种自己最熟悉的语言去分析它总之千万不要陷在语言的细节上要高屋建瓴的去领会数据结构的思想。而且我觉得随着编程经历的丰富对它的体会越深入,最初接触是对一些思想可能只是生硬的记忆,随着学习的深入逐渐领悟了很多。奉劝孔孔不要灰心,对于实在弄不懂的东东,就先记住,应付过考试再说。
    http://www.programfan.com/club/old_showbbs.asp?id=26067&page=last
    展开全文
  • 如何学好数据结构与算法 陈小玉 《趣学数据结构》《趣学算法》作者 主题: 为什么要学数据结构 数据结构学习秘籍 算法为什么那么难 算法学习秘籍 如何打开数据结构与算法这两扇门 随着科学技术的发展,人工...

    如何学好数据结构与算法

    视频地址:https://www.bilibili.com/video/BV1Jp4y1X72Q/

    文字版:

    陈小玉

    《趣学数据结构》《趣学算法》作者

    主题:

    1. 为什么要学数据结构
    2. 数据结构学习秘籍
    3. 算法为什么那么难
    4. 算法学习秘籍
    5. 如何打开数据结构与算法这两扇门

    随着科学技术的发展,人工智能已渗透到各个行业,算法工程师非常火爆,急缺大量人才,年薪也越来越高。刚毕业30-40万很常见。很多人想入手学习算法,那么多算法,究竟该如何下手呢?

    很多人看到招聘要求,算法工程师有很多具体分支:

    /视频算法工程师

    图像处理算法工程师

    信号算法工程师

    自然语言算法工程师

    数据挖掘算法工程师

    搜索算法工程师

    例如有的招聘要求:

    1.至少熟悉一门编程语言C/C++/java/python/R

    2.熟练掌握数据结构,具有良好的算法基础和编程功底;

    /熟练运用各种常用算法和数据结构,有独立的实现能力;

    3.熟悉数据挖掘算法

    4.熟悉机器学习相关知识理论

    加分项:具有较为丰富的项目实践经验

    那么是不是要直接学习这些算法呢?

    其实不然,万丈高楼平地起,任何高深的算法都要从基础算法学起,不可能一口吃个胖子,所以入门算法还是要从基础开始:

    1. 首先学习一门语言,例如C/C++/Java/python,初学者学C++比较普遍。
    2. 学数据结构,数据结构书有很多,但是有些教材晦涩难懂,建议看图解多,通俗易懂的书,推荐《趣学数据结构》。
    3. 学算法,不要直接看《算法导论》,大量证明会让你崩溃。推荐《趣学算法》,有问题分析,完美图解,伪码详解,实战演练,适合初学者快速掌握经典算法。
    1. 为什么要学数据结构?

    招聘搞笑事

    如果你关注招聘试题,越是大的公司,问的问题越基础,有的甚至问你什么是栈和队列,反而一些小公司会关心你做过什么系统,关注点不同,大公司更注重基础扎实,发展潜力,而小公司希望你立刻、马上为他干活,通常是没什么技术含量的活。小公司喜欢细而长的竹子,大公司更喜欢碗口粗的竹笋。

    我曾经推荐一个学生到某知名公司,没多久,学生给我说了应聘的事情:“我介绍我开发了企业管理系统、在线商城系统等等,没想到他问我使用了什么数据结构和算法,我懂很多技术,那么多功能我都实现了,他不问,却问我使用了什么数据结构和算法,你说搞笑不?数据结构、算法我早就忘了,我会开发软件还不行吗?”人力资源总监也反馈过来意见:“很搞笑,这个学生做了不少系统,却说根本没用到数据结构和算法。”

    既然双方都觉得这是一个件搞笑事,我们就摊开来看,数据结构到底是什么东西。

    拨云见日,看清数据结构

    遇到一个实际问题,需要解决两个事情:

    1 如何将数据存储在计算机中;

    2 用什么方法策略解决问题。

    前者是数据结构,后者是算法。只有数据结构没有算法,相当于只把数据存储到计算机中而没有有效的方法去处理,就像一幢只有框架的烂尾楼;若只有算法,没有数据结构,就像沙漠里的海市蜃楼,只不过是空中楼阁罢了。

    数据是一切能输入到计算机的信息总和,结构是指数据之间的关系,数据结构就是将数据及其之间的关系有效地存储在计算机中。算法是指对特定问题求解步骤的一种描述,说白了就是解决问题的方法策略。数据结构和算法不依赖于语言,什么语言无所谓。但是如果上机实现的话,就要使用计算机语言。

    遇到一个实际问题,充分利用所学的数据结构,将数据及其之间的关系有效地存储在计算机中,然后选择合适的算法策略,并用程序高效实现,这就是N.Wirth教授所说的:数据结构+算法=程序

    为什么要学习数据结构?

    计算机专业本科生都开设数据结构课程,它是计算机学科知识结构的核心和技术体系的基石。研究生考试也是必考科目,随着科学技术的飞速发展,数据结构的基础性地位不仅没有动摇,反而由于近年来算法工程师的高薪火爆,而得到了业内空前的重视。很多人觉得基本的数据结构及操作已经在高级语言(如C++JAVA语言中)中封装,栈、队列、排序、优先队列等都可以直接调用库函数,学会怎么调用就好了,干嘛要重复造轮子? 那么到底有没有必要好好学习数据结构?

    先看学习数据结构有什么用处

    1 学习数据有效存储的方法

    很多学生在学习数据结构时,问我要不要把单链表插入删除代码背下来?要不合上书就不会写了。我非常诧异,为什么要背?理工科技术知识很少需要记忆的,是用的,用的!学习知识不是死记硬背,更重要的是学习处理问题的方法。同一个问题,如何有效地存储数据,不同的数据结构产生什么样的算法复杂性,有没有更好的存储方法提高算法的效率?例如,用顺序表查找需要O(n)的时间复杂度,用平衡树查找需要O(logn)的时间复杂度。这是什么概念呢?就像你有10个亿,一觉醒来,兜里只剩下30块!

    2 处理具有复杂关系的数据

    现实中很多具有复杂关系的数据,无法通过简单的库函数调用实现。专业认证中特别强调培养学生解决复杂工程问题的能力,什么是复杂工程问题?就是需要综合运用多个知识技术解决的问题。如同现在很多芯片高度集成,完全不需要芯片内部如何,直接使用就行了。但是,如果在现实中遇到一个复杂问题,一个芯片只能完成其中一个功能,难道要连接十几块芯片来解决这一个问题?你在搞圣诞树嘛?一个树枝挂个小礼物,叮叮当当的乱响。这显然是不合适的,我们需要的是完成该复杂问题的一个芯片,因此需要运用所学的数据结构知识,高效处理具有复杂关系的数据。

    通过学习数据结构,更加准确、深刻地理解不同数据结构之间的共性和联系,学会选择和改进数据结构,高效地设计并实现各种算法,这才是数据结构的精髓。

    1. 数据结构学习秘籍

    数据结构为什么那么难?

    网络上太多的同学吐槽被虐,如滔滔江水连绵不绝,数据结构太难了!真的很难吗?其实数据结构只是讲了三种:线性结构、树、图。到底难在哪里呢?通过调查了解大概有四个原因:

    1 无法接受的描述方式

    数据结构的描述大多是抽象的形式,我们使用自然语言表达习惯了,不容易接受数据结构的抽象表示。不止一个学生问我,书上的“ElemType”到底是什么类型?运行时怎么提示错误。它的意思就是元素类型,只是这样的描述,你需要什么类型就写什么类型,例如int。这样的表达方式让不少人崩溃。

    2 不知道什么用处

    尽管很多人学习数据结构,有的人是应付考试,有的人考研需要,有的人参加算法竞赛需要,而很多人不太清楚学习数据结构有什么用处,迷迷糊糊看书、做题、考试。

    3 体会不到其中的妙处

    由于教材、教师等等各种因素影响,很多学生没有体会到数据结构处理数据的妙处,经常为学不会而焦头烂额,无法体会其中乐趣,有趣是才有意思,兴趣是最大的驱动力。一旦体会到其中的奥妙,就会有停不下来的感觉。有读者给我留言,老师看了你的书根本停不下来。其实,我写书的时候也停不下来,神同步。

    4 语言基础不好

    我一直强调先看图解,理清思路,再上机。还是有很多同学已经理解了思路后,因为缺少main函数,输入输出格式不对,缺少括号等等各种语言问题卡壳,而这一切统统戴给了数据结构太难了这个大帽子。

    数据结构学习秘籍

    在讲学习秘籍之前,首先了解一下数据结构学习的三种境界:

    1 会数据结构的基本操作

    这是最基础的要求,学会各种数据结构的基本操作,取值、查找、插入、删除等。先看图解,理解各种数据结构的定义,操作方法,然后看代码,尝试自己动手上机运行,逐渐掌握基本操作。初学时,要想理解数据结构,一定要学会画图,通过画图形象表达,更能体会其中的数据结构关系。因此,初学阶段学习利器:画图,理解,画图。

    2 会利用数据结构,解决实际问题

    在掌握了书上的基本操作之后,就可以尝试利用数据结构解决一些实际问题了,先学经典应用问题的解决方法,体会数据结构的使用方法,然后再做题,独立设计数据结构解决问题。要想熟练应用就必须做大量的题,从做题中体会其中的方法。最好进行专项练习,比如线性表问题,二叉树问题,图问题,该阶段学习利器:做题,反思,做题。

    3 熟练使用和改进数据结构,优化算法

    这是最高境界了,也是学习数据结构的精髓所在,单独学习数据结构是无法达到这种境界的。它需要在学习算法的过程中慢慢修炼。在学习算法的同时,逐步熟练应用、改进,慢慢体会不同数据结构和算法策略的算法复杂性,最终学会利用数据结构改进和优化算法。该阶段已经在数据结构之上,通过在测试系统上刷各种算法题,体会利用数据结构改进优化算法。该阶段学习利器:刷题,总结,刷题。

    刷题网站:打比赛HDUPOJVjudgeCode Forces,找工作LeetCode

    1. 算法为什么那么难

    很多人感叹:算法为什么那么难

    首先,算法本身具有一定的复杂性,还有一个原因:讲的太烂!

    算法的教与学有两个困难:

    1)我们学习了那些经典的算法,在惊叹它们奇思妙想的同时,难免疑虑重重:这么牛,怎么想到的?对学生来说,这可能是最费解、也最让人窝火的地方。高手讲,学算法要学它的来龙去脉,包括种种证明。但这对菜鸟来说,简直比登天还难,很可能花费很多时间也无法搞清楚。这条路对大多数人来说,是行不通的,那怎么办呢?下功夫去记忆书上的算法?记住这些算法的效率?看似学会了,其实两手空空。遇到一个新问题,仍然无从下手。可这偏偏又是极重要的,无论作研究还是实际工作,一个计算机专业人士最重要的能力,就是解决问题——解决那些不断从实际应用中冒出来的新问题。

    2)算法作为一门学问,有两条几乎平行的线索。一个是数据结构(数据对象):数、矩阵、集合、串、排列、图、表达式、分布等等。另一个是算法策略:贪心、分治、动态规划、线性规划、搜索等等。这两条线索是相互独立的:同一个数据对象(例如图)上有不同的问题,例如单源最短路径和最优二叉树,就可以用到不同的算法策略,如贪心和动态规划;而同一个算法策略,例如排序和整数乘法,也会用到不同的数据结构。它们之间是多对多的关系。

    两条线索交织在一起,该如何表述?

    我们早已习惯《数据结构》中讲数据结构,《算法设计与分析》里面讲算法策略。各说各的,讲算法设计时就假设你已经对数据结构了如指掌,还没有哪一本算法书很好的解决这两个困难,传统的算法书,大多注重内容的收录,但却忽视思维过程的展示,因此我们学习了经典的算法,却费解于算法设计的过程。遇到一个实际问题,通过问题分析,选择使用什么样的算法策略,基于这种算法策略选择什么样的数据结构,有时算法策略和数据结构的选择并不是唯一的,不同的算法策略和数据结构设计的算法,其复杂性是不同的。而很多书就是灌输式的讲一个实例,一下子就选择了一个认定是最优的算法策略,告诉你就这样干,不谈数据结构,然后分析算法复杂性,就结束了。原则上讲算法策略就讲算法策略,不依赖任何程序设计语言和数据结构,但对很多学生来讲,尤其是语言没学好,数据结构也不熟练的同学,只讲算法策略,如同空中楼阁。自己用算法解决实际问题,一头雾水。

    《趣学算法》,从问题出发,根据实际问题进行分析,选择合适的算法策略,并分析为什么采用这种算法策略,然后选择什么数据结构,不同的数据结构复杂性会有什么区别,巧妙地将数据结构和算法策略拧成了一条线。通过大量实例,充分展现算法设计的思维过程,让学生充分体会遇到一个问题,如何分析,使用什么算法策略,采用什么数据结构,算法的复杂性如何?是否有优化的可能?

    西方教育旨在激发学生对世界的好奇心,而在这里,我们培养的是让学生怀着一颗好奇心,思考问题、解决问题的能力。更重要的是——体会学习的乐趣,发现算法的美!

    1. 算法学习秘籍

    知识在于积累,学习需要耐力。学习就像挖金矿,或许一开始毫无头绪,一头雾水,但转个角度,换换工具,时间久了总会找到一个缝隙。成功就是你比别人多走了一段路,或许恰恰是那么一小步。

    第一个建议:多角度,对比学习

    学习算法,可以先阅读一本简单的入门书,然后综合几本书横向多角度看,例如学习动态规划,拿几本算法书,把动态规划这章找出来,比较学习,多角度对比分析更清晰,或许你会恍然大悟,噢,原来如此简单。或许有同学说我哪有那么多钱买那么多书,只要你想学习,没有什么可以阻挡!你可以图书馆借,也可以联系你的老师,每学期上课前,我都会告诉学生,如果你想学习却没钱买书,我可以提供帮助。想一想,你真的没有办法?

    第二个建议:大视野,不求甚解

    经常有学生为了一个公式推导,或几句代码抛锚,甚至停滞数日,然后淹没在无尽的挫败感中,把自己弄得垂头丧气。公式可以不懂,代码可以不会。你不必投入大量精力试图推导书上的每一个公式,也不必探究语法或技术细节。学算法就是学算法本身,首先是算法思想,解题思路,然后是算法实现,算法思想的背后可能有高深的数学模型,复杂的公式推导,你理解了当然玄妙,不懂就拉倒。算法实现可以用任何语言,所以不必纠结是CC++JavaPython,更不必管严格的语法规则,除非你要上机调试。建议还是先领会算法,写伪代码,在大脑中调试吧,如果没有良好的编程经验,一开始就上机或许更让你崩溃。遇到不懂的部分,浏览一下或跳过去,读完了还不明白再翻翻别的书,总有一天,你会发现,“暮然回首,那人却在灯火阑珊处”。

    第三个建议:多交流,见贤思齐

    与同学,朋友,教师或其他编程爱好者们一起学习和讨论问题,是取得进步最有效的办法,也是分享知识和快乐的途径。加入论坛,加入交流群,会了解其它人在做什么,怎么做,遇到问题可以请教高手,带来醍醐灌顶的喜悦;也可以应助菜鸟,使你暗自得意,信心倍增。论坛和群也会分享大量的学习资料和视频,还有不定期的培训讲座,读书交流会,你会发现,不是你一个人在战斗!

    第四个建议:勤实战,越挫越勇

    实践是检验一切真理的标准。古人云:“学以致用”,“师夷长技以制夷”。请不要急切期盼“实际的”例子,更不要看不起小实例,“不积跬步,无以至千里”。大规模的成功商业案例所采用的算法,人工情感,无人驾驶,不是我们目前要解决的问题。看清楚脚下的路,比仰望天空更实际,多做一些实战练习,更好地体会算法的本质,在错误中不断成长,越挫越勇,终究会成参天大树。

    第五个建议:看电影,洞察未来

    不管是讲《人工智能》,还是《算法分析》,我都会建议同学们去看一看科幻电影,如《人工智能》、《记忆裂痕》、《绝密飞行》、《未来战士》、《她》等等。奇妙的是,这些科幻的东西,正在一步步的实现,靠的是什么?人工智能。计算机的终极是人工智能,人工智能的核心是算法。未来的战争是科技的战争,先进的科技需要人工智能。我们的国家还有很多技术落后,未来需要你。

    “一心两本”学习法:一颗好奇心,两个记录本。

    怀着一颗好奇心去学习,才能不断的解决问题,获得满足感,体会算法的美。很多科学大牛的秘诀就是永远保持一颗好奇心;一个记录本用来记录学习重点难点,随时的突发奇想;一个记录本做日记或周记,记录一天或一周来学了什么,有什么经验教训,需要注意什么,计划下一天或下一周做什么。不停的总结反思过去,计划未来,这样每天都有事做,心中满满的能量。一个人经常上课睡觉,因为他心中无事可做;一个人经常失眠,因为他心里事儿太多!

    1. 如何打开数据结构和算法这两扇门

    推荐给大家的两本入门书:《趣学数据结构》和《趣学算法》

    推荐这本书的三大理由:

    1完美图解+丰富实例,复杂问题简单化

    为基本操作配以图解,用数据结构解决生活中的实际问题,学习过程更加轻松有趣。

    2原理分析+实战演练,真正地学以致用

    通俗化讲解基础知识,在实战中体会数据结构的设计和操作,锻炼独立思考的能力。

    3配套代码+在线答疑,为学习保驾护航

    提供书中的范例程序源代码、练习题以及答案解析,并在博客和QQ群中答疑解惑。

    内容简介

    本书基于C++语言编写,从趣味故事引入算法复杂性计算及数据结构基础内容,涵盖线性结构、树形结构和图形结构,包括链表、栈和队列、树和图的应用等。本书内容还涉及数据结构的基本应用(包括各种查找、排序等)和高级应用(包括优先队列、并查集、B-树、B+树和红黑树等)。通过大量图解将抽象数据模型简单通俗化,语言表述浅显易懂,并结合有趣的实例帮助读者轻松掌握数据结构。

    适读人群 本书可作为程序员的学习用书,也适合没有太多编程经验但又对数据结构有强烈兴趣的初学者使用,同时也可作为高等院校计算机、数学及相关专业的师生用书,或学科竞赛的辅导用书和培训学校的教材。

     

    选择这本书的六大理由:

    1实例丰富,通俗易懂。从有趣的故事引入算法,从简单到复杂,使读者从实例中体会算法设计思想。实例讲解通俗易懂,让读者获得最大程度的启发,锻炼分析问题和解决问题的能力。

    2完美图解,简单有趣。结合大量完美绘图,对算法进行分解剖析,使复杂难懂的问题变得简单有趣,给读者带来巨大的阅读乐趣,使读者在阅读中不知不觉地学到算法知识,体会算法的本质。

    3深入浅出,透析本质。采用伪代码描述算法,既简洁易懂,又能抓住本质,算法思想描述及注释使代码更加通俗易懂。对算法设计初衷和算法复杂性的分析全面细致,既有逐步得出结论的推导过程,又有直观的绘图展示。

    4实战演练,循序渐进。每一个算法讲解清楚后,进行实战演练,使读者在实战中体会算法,增强自信,从而提高读者独立思考和动手实践的能力。丰富的练习题和思考题用于及时检验读者对所学知识掌的握情况,为读者从小问题出发到逐步解决大型复杂性问题奠定了基础。

    5算法解析,优化拓展。每一个实例都进行了详细的算法解析,分析算法的时间复杂度和空间复杂度,并对其优化拓展进一步讨论,提出了改进算法,并进行伪码讲解和实战演练,最后分析优化算法的复杂度进行对比。使读者在学习算法的基础上更上一个阶梯,对算法优化有更清晰的认识。

    6网络资源,技术支持。网络提供本书所有范例程序的源代码、练习题以及答案解析,这些源代码可以自由修改编译,以符合读者的需要。本书提供源代码执行、调试说明书,对读者存在的问题提供技术支持。

    内容简介:

    按照算法策略分为7章。

    1章从算法之美、简单小问题、趣味故事引入算法概念、时间复杂度、空间复杂度的概念和计算方法,以及算法设计的爆炸性增量问题,使读者体验算法的奥妙。

    27章介绍经典算法的设计策略、实战演练、算法分析及优化拓展,分别讲解贪心算法、分治算法、动态规划、回溯法、分支限界法、线性规划和网络流。每一种算法都有410个实例,共50个大型实例,包括经典的构造实例和实际应用实例,按照问题分析、算法设计、完美图解、伪代码详解、实战演练、算法解析及优化拓展的流程,讲解清楚且通俗易懂。附录介绍常见的数据结构及算法改进用到的相关知识,包括sort函数、优先队列、邻接表、并查集、四边不等式、排列树、贝尔曼规则、增广路复杂性、最大流最小割等。

    本书可作为程序员的学习用书,也适合从未有过编程经验但又对算法有强烈兴趣的初学者使用,同时也可作为高等院校计算机、数学及相关专业的师生用书和培训学校的教材。

    最后,以两本书的签名结束本次交流。

    展开全文
  • 如何学好数据结构?

    2021-03-10 11:49:56
    这两年来,每次有读者问我学数据结构和算法有什么好的图文课程,我都会推荐王争的《数据结构与算法之美》,毫不夸张的说,这是市面上最实用又全面的算法教程,口碑特别好(10W+的订阅量与评论区的大量好评),目前...

    大家好,我是程序员吴师兄。

    最近在公众号发布了不少图解 LeetCode 的文章,一些同学在后台打卡,甚是感动,以后也会每天都发布一篇,希望能帮助大家更好的刷题,通过算法面试,进入心仪的大厂。

    谈到刷题,还是有一些小技巧的:

    • 1、按算法分类来选题,这种做法可以极大的提高刷题的速度,而且能带来更好的效果
    • 2、刷题的过程中先看懂题目、再分析推导解法、最后转换为代码

    当然,这些技巧的前提是你得掌握了基础的数据结构和算法

    很多人学算法要么是拿起《算法 4》来啃,结果倒在第二章,要么在网上找一些零散的博客看,导致无法建立一个完整的系统框架,过段时间都忘了,怀疑自己智商不够。

    事实上,算法不是纯粹拼智商的,它是可以通过科学合理的方式训练出来的能力,刷题蛮干是不行的,需要遵循科学的方法,算法训练是个系统工程,得循序渐进着来,过于急功近利,反而会因做不出题而产生挫败感,带来反作用。

    这两年来,每次有读者问我学数据结构和算法有什么好的图文课程,我都会推荐王争的《数据结构与算法之美》,毫不夸张的说,这是市面上最实用又全面的算法教程,口碑特别好(10W+的订阅量与评论区的大量好评),目前已经安利了 600 人去看,看完后基本上都不害怕刷题了。


    v2-ebd6bc9293dded14155186881211217d_b.jpg


    运营小姐姐说过几天要涨价了,所以想趁着还有优惠,再次推荐给小伙伴们

    数据结构与算法之美_算法实战_算法面试-极客时间

    如果你在准备春招,建议把这个专栏刷一遍,这样数据结构基本没啥问题了,然后再按算法分类进行系统的刷题,那么在算法面试环节和面试官谈笑风生不成问题,聊一聊如何根据年龄给 100 万用户数据排序如何快速定位 IP 对应的省份地址如何防止数据库中的用户信息呗脱库

    再和大家聊一聊数据结构与算法在平时工作中的作用,毕竟很多人不想学就是不知道学它有啥用,业务工作中貌似又用不到。

    举个例子,在工作过程中,我们多多少少都接触过 OAuth2 ,在使用 OAuth2 授权的时候,通常应用会弹出一个类似这样的信息:

    • 1) 获取用户基本信息接口
    • 2) 获取用户列表接口
    • 3) 用户分组管理接口


    v2-c53be93020545749c448280a53d1bc36_b.jpg


    思考一下,如果让你设计数据库,应该怎么设计信息存储权限

    如果你不会数据结构的话,肯定是 if/else 组合各种 API 写一堆臃肿的代码。

    而如果你熟练掌握了各种数据结构的特点的话,那自然而然想到使用 bitmap 来存储权限。

    我们把权限划分成最小粒度之后,每一个 bit 都它的含义, 例如我们把权限划分为以下几种:

    • 获取你的头像、性别、昵称等基本用户信息
    • 以你的身份发布微博
    • 获取你的好友列表
    • 获取你的朋友圈信息

    每勾选一个选项,就代表着这个权限被授权,为了保证可扩展性,我们使用一个 uint64 来保存这些 bit ,也就是说,我们一共可以划分 64 种细分权限,然后对这些权限进行组合。

    例如,第一个 bit 如果设置了,那么就代表可以获取你的昵称、头像、地区、性别等基本用户信息, 第二个 bit 如果设置了,就可以用你的身份发状态。

    数据结构的实际作用还有挺多,感兴趣的可以搜索以下知识点:

    • 二叉树搜索用于中断处理、登记缓存查找等 哈希表,用于实现索引节点、文件系统完整性检查等
    • 红黑树用于调度、虚拟内存管理、跟踪文件描述符和目录条目等
    • Radix树,用于内存管理、NFS相关查找和网络相关的功能

    上面这些例子是关于数据结构的,我再举一个算法的例子,同样的也来思考一个问题:计算机的缓存容量无论再大,缓存满了还是要删除一些内容,给新内容腾位置。

    删除哪些内容呢

    我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。

    那么,什么样的数据,我们判定为「有用的」的数据呢?

    这个时候采取的策略就是 LRU 缓存淘汰算法。

    LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。

    很多时候判断程序员是不是编程高手,往往就是看这些细节:你用的算法是不是够优化,数据存取的效率是不是够高,内存是不是够节省等等。

    如果你还不懂数据结构和算法,或者没有系统的学习过,那肯定说不过去了,赶紧来补一补吧!

    数据结构与算法之美_算法实战_算法面试-极客时间

    推荐阅读:

    程序员吴师兄:剑指 offer 面试题精选图解 04 . 二维数组中的查找 (超详细超容易理解的动画解法!!!)

    程序员吴师兄:剑指 offer 面试题精选图解 03 . 数组中重复的数字(超详细超容易理解的动画解法!!!)

    程序员吴师兄:LeetCode 全站第一,牛逼!

    展开全文
  • 如何学好数据结构

    2020-05-18 15:19:27
    通过学习数据结构和算法的课程,我在知乎上看到的讲述数据结构比较完整和比较到位的总结和学习数据结构的关键点,整理出来分享给大家;原文链接在文章末尾欧~ 一. 冒泡排序 算法步骤: • 比较相邻的元素。如果...
    • 通过学习数据结构和算法的课程,我在知乎上看到的讲述数据结构比较完整和比较到位的总结和学习数据结构的关键点,整理出来分享给大家;原文链接在文章末尾欧~

    一. 冒泡排序

    算法步骤:
    • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
    • 针对所有的元素重复以上的步骤,除了最后一个。
    • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    二. 选择排序

    • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
    • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
    • 重复第二步,直到所有元素均排序完毕。

    三. 插入排序

    • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
    • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

    四. 希尔排序

    • 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
    • 按增量序列个数 k,对序列进行 k 趟排序;
    • 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

    五. 归并排序

    • 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
    • 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
    • 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
    • 重复步骤 3 直到某一指针达到序列尾;
    • 将另一序列剩下的所有元素直接复制到合并序列尾。

    六. 快速排序

    • 从数列中挑出一个元素,称为 “基准”(pivot);
    • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
    • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

    七. 堆排序

    • 创建一个堆 H[0……n-1];
    • 把堆首(最大值)和堆尾互换;
    • 把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;
    • 重复步骤 2,直到堆的尺寸为 1。

    八. 计数排序

    • 花O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max
    • 开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1)
    • 数组 B 中 index 的元素记录的值是 A 中某元素出现的次数
    • 最后输出目标整数序列,具体的逻辑是遍历数组 B,输出相应元素以及对应的个数

    九. 桶排序

    • 设置固定数量的空桶。
    • 把数据放到对应的桶中。
    • 对每个不为空的桶中数据进行排序
    • 拼接不为空的桶中数据,得到结果

    十. 基数排序

    • 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零
    • 从最低位开始,依次进行一次排序
    • 从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列

    作者:程序员吴师兄
    链接:https://www.zhihu.com/question/19830721/answer/667233164

    展开全文
  • 数据结构和算法是计算机科学中最重要的课程,作为一名Google的软件工程师,我经常看到一些求职者或刚毕业的学生,他们对于数据结构和算法的学习是远远不够的。这不是说他们看的书是有问题的,或教授们教错了内容,...
  • 文章目录Introduction Introduction 相互之间的关联 庖丁解牛 反馈 切题
  • 1. 给你一个长度为 n 的数组,其中只有一个数字出现了奇数次,其他均出现偶数次,问如何使用优秀的时空复杂度快速找到这个数字。一道让你拍案叫绝的算法题​mp.weixin.qq.com2. 假设有 100 层的高楼,给你两个完全...
  • 简介 学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 根据百度百科的介绍,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常...
  • 学习数据结构与算法,还是很有必要看几本相关的书籍,但根据不同基础的人,合适看的书也不一样,因此,针对不同层次、不同语言的人,推荐几本市面上口碑不错的书。 1. 入门级 针对刚入门的同学,建议不要急着去看...
  • 参考视频‘算法之神’左神带你搞定这道BAT大厂高频面试题/数据结构与算法/既需要思路又需要coding能力 为什么要学习数据结构 随着人工智能的发展,人工智能已经渗透到各个行业,算法工程师非常火爆,急缺大量人才...
  • 很多人觉得,算法与数据结构是一个门难上加难的学问,但小灰觉得,这才是IT领域最有趣的部分。学习数据结构,你并不需要死记硬背各种复杂操作指令、底层原理、模型架构,唯一需要的就是你巧妙的逻辑...
  • 怎样学好数据结构

    2013-03-06 14:18:28
    数据结构相关的东西,教你如何学好数据结构,比较有用
  • 学好数据结构的秘诀

    2021-01-08 22:23:22
    1.明确数据结构的重要性,树立学好数据结构的信心 数据结构是计算机科学与技术专业的核心课程,不仅仅涉及计算机硬件的研究范围,并且与计算机软件的研究有着更为密切的关系,“数据结构”课程还是操作系统、...
  • 如何学好算法和数据结构之我见

    千次阅读 多人点赞 2010-10-26 21:41:00
    数据结构与算法课程是大学计算机专业的重要基础课程。考研中,数据结构也几乎是专业课之必考。在实际工作中,数据结构依然很有用。至少很多公司面试笔试也会考的。如果你数据结构知识为零,那基本上是无法从事“更有...
  • 为什么要学好数据结构和算法

    千次阅读 2019-04-30 16:50:59
    数据结构如何影响编程? 解决实际问题时,搞清数据对象及其之间的关系后存入到内存中,让计算机能帮助我们处理,数据是以何种方式存入到内存的,将直接影响我们算法的实现过程。不同的数据结构,不同的算法,带来...
  •  首先,学习数据结构是为了解决“快”和“省”的问题,那么如何去评估算法的速度快和省空间呢?这就需要掌握时间和空间复杂度分析。同一段代码运行在不同环境、不同配置机器、处理不同量级数据…效率肯定不...
  • 如何学好数据仓库1

    2010-12-30 11:07:34
    如何快速的在数据仓库领域入门并做好现在的工作,是我这个新人需要在踏上旅程的开始就应该 想清楚的,不能稀里糊涂的就上路了,那么我的行囊里该准备些什么补给呢? 具备一些基础知识:了解数据仓库的基本特征,...
  • 如何学好数据挖掘

    2013-03-18 13:01:22
    下面是一位朋友的问题,其实每天都有不少同学和朋友向我提问各种学习数据分析、数据挖掘、统计分析等方面的问题,有时候真的很难仔细回答。其实,每个人都有自己的学习路径,还有自己的知识结构和期望的职业生涯,要...
  • 学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 微信公众号:程序员书单;作者丨黄小斜 其实数据结构就是用来描述计算机里存储数据的一种数学模型,因为计算机里要存储很多乱七八糟的...
  • 初学数据结构

    2020-12-29 08:47:41
    如何学好数据结构?顺序表的代码实现 数据结构 什么是数据结构? 数据结构时描述和组织数据的方式 数据+结构 数据结构是一门逻辑非常严谨的学科,插入数据的时候:1.判空 2.数据合法性判断 3. 插入数据的时候,这个...
  • 4.如何学好数据结构和算法 5.数据结构和算法书籍及资料推荐 1. 什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 2.什么是算法...
  • 其实,每个人都有自己的学习路径,还有自己的知识结构和期望的职业生涯,要得到一个统一的答案是困难的! 什么是解决问题:就是在明确实际情况和期望情况之间的差异后,为消除这种差异所采取的行动!在解决
  • (1)树是一种非线性的数据结构,它是由n(N>=0)个有限节点组成的一个具有层次关系的结合。 (2)边:从父节点到子节点的连线(边有方向) (3)兄弟节点:父节点相同的节点互为兄弟节点(如上图中的2 3,4 5, ...
  • 06数据结构

    2018-04-16 11:04:00
    目录 第1章绪论 ...1.2如何学好数据结构 5.2二叉树 1.3数据结构的概念 5.3树和森林 1.4算法和算法分析 5.4哈夫曼树 第2章线性表 5.5应用举例 ...
  • 今天分享一篇如何学好数据结构的经验总结:任何数据结构都可以从线性表演进而来。以顺序表为例,最简单的顺序表是无序的,那么增加一个要求,使其是有序的,那么只需要改动一下插入操作。依理类推,堆栈和队列,只...
  • 我们来看看如何高效地学习一门语言的数据结构,今天我们先看Python篇。所谓数据结构,是指相互之间存在一种或多种特定关系的数据类型的集合。Python在数据分析领域中,最常用的数据结构,莫过于DataFrame了,今天...
  • 小伙伴们大家好,在前几期我们主要分享了数据结构中排序与搜索的内容,那么从今天开始,我们来分享树的内容。树的概念树(tree)是一种抽象数据类型(ADT)或者是实现这种抽象数据类型的数据结构,用来模拟具有树状结构...
  • 数据结构

    2020-03-05 14:20:39
    数据结构是一门研究算法的学科,自从有了编程语言就有了数据结构,学好数据结构可以编写出更加漂亮,更加有效率的代码 要学习好数据结构就要多多考虑如何将生活中遇到的问题,用程序去解决 程序 = 数据结构 + 算法 ...
  • 如何学好网络技术

    2020-11-12 09:16:22
    如何学好网络技术 前言 网络到底是什么?如何更深入地学习网络技术?应该避免哪些误区? 一、网络是什么? 网络是通过通信线路将网络设备与终端设备连接并调试网络设备实现网络互通,从而达到资源共享的目的。 二、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 396
精华内容 158
关键字:

如何学好数据结构

数据结构 订阅