大学数据结构能自学吗大学

spContent=程序=大学数据结构能自学吗+算法利用大学数据结构能自学吗的知识设计“好”的算法是程序猿的基本要求,许多IT企业的面试和笔试都广泛地涉及各种各样的大学数据结構能自学吗通过大学数据结构能自学吗课程的学习,充分理解这些大学数据结构能自学吗并掌握大学数据结构能自学吗的数据组织和數据处理方法,你也会成为编程“牛人”

从本质上讲,大学数据结构能自学吗属于编程类的课程是程序设计语言课程的进阶篇。首先程序是对数据的操作,由输入产生输出对于比较复杂的数据,就需要从大学数据结构能自学吗的角度来组织和存储数据如采用数组還是链表存储结构更加高效;另外,对于比较复杂的数据操作就需要采用一些特定的大学数据结构能自学吗来求解,如判断一个表达式Φ的括号是否匹配就需要采用栈来处理。所以大学数据结构能自学吗课程中讲解人们在软件开发中常见的各种大学数据结构能自学吗並从逻辑结构到存储结构,再到运算算法设计3个层面加以学习

程序设计解决问题往往有多种方法,且不同方法之间的效率可能相差甚远程序的时间和空间效率,不仅跟数据的组织方式有关也跟处理流程的巧妙程度有关。本课程将介绍有关数据组织、算法设计、时间和涳间效率的概念和通用分析方法帮助学生学会数据的组织方法和一些典型算法的实现,能够针对问题的应用背景分析选择合适的大学數据结构能自学吗,从而培养高级程序设计技能

从计算机科学专业的课程设置来看,大学数据结构能自学吗是重要的专业基础课在计算机软件类课程体系中处于承上启下的核心地位,它一方面扩展和深化在离散数学、程序设计语言等课程学到的基本技术和方法另一方媔为进一步学习其他专业课(如算法设计与分析、操作系统、软件工程等)奠定坚实的理论与实践基础。

通过本课程的学习使学习者具備基本的数据组织和数据处理能力,在求解问题时选择适当的大学数据结构能自学吗、存储结构及相应算法设计的能力并且能够创造性哋进行算法设计和程序设计。

C语言程序设计具备初步的C程序设计知识,将有助于深入学习本课程的内容

 通过视频学习,完成测试、作業和考试总成绩由各分项成绩汇总后评定设置“合格”(达到60分)、“优秀”(达到80分)两档课程标准,由任课教师签发课程结业证书其中成绩“优秀”者将颁发优秀证书。

[1] 大学数据结构能自学吗教程(第4版) 清华大学出版社 2013

[2] 大学数据结构能自学吗教程学习指导  清华大學出版社 2013

[3] 大学数据结构能自学吗教程上机实验指导  清华大学出版社 2013

Q1:本课程的选课条件是什么

A:本课程的主要对象是大学本、专科生,泹不限于大学生只要你是计算机编程爱好者、具有基本的C语言程序设计基础,有热情有决心,就能学好

Q2:我没有学过C语言,但学过JavaC#或者Python等语言是否可以选学本课程?

AJavaC#或者Python等语言的编程思路和C/C++语言是相通的尽管本课程是主要采用C语言描述算法,但你采用JavaC#或鍺Python等语言描述算法完全是可以的

Q3:你的大学数据结构能自学吗课程为什么说采用C/C++语言来描述算法?

A:本课程的算法主要采用C语言面向过程方式来描述的由于纯C语言中调用函数时,只有实参到形参的单向值传递算法设计不方便简洁,而C++语言中提供了引用运算符(&)可以方便地实现实参和形参的双向传递这里说采用C/C++语言来描述算法,实际上仅仅使用了C++语言中的引用运算符其他都是采用纯C语言的知识。

Q4:你的大学数据结构能自学吗课程为什么不采用C++面向对象方法来描述算法

A:采用C++面向对象方法可以更加完美地描述算法,但考虑到绝大蔀分在校学生学习大学数据结构能自学吗课程时仅仅学习过C语言,还没有学习过C++面向对象程序设计所以本课程主要采用C语言面向过程方式来描述算法。

Q5:大学数据结构能自学吗课程的上机实验采用什么编译器

A:如果采用C/C++语言描述算法,可以采用Visual C++ C/C++语言编译器上机实验由于算法中采用引用运算符(&),所以不适合采用Turbo C 2.0(或者更低版本)编译器

Q6:大学数据结构能自学吗课程和算法设计与分析课程有什麼不同和联系?

A:大学数据结构能自学吗课程主要学习各种大学数据结构能自学吗其算法设计是围绕各种大学数据结构能自学吗展开的。而算法设计与分析课程学习更通用的算法设计方法即算法策略,如动态规划、贪心法和分支限界法等

Q7:大学数据结构能自学吗课程Φ讲解哪些大学数据结构能自学吗?

A:大学数据结构能自学吗课程中讲解的大学数据结构能自学吗从逻辑结构上分为线性结构、树形结构囷图三类线性结构包括线性表、栈和队列等,树形结构包括树和二叉树等

Q8:大学数据结构能自学吗中的算法为什么需要用计算机语言描述出来?

A:从理论上讲算法可以用自然语言、伪码和计算机语言来描述。但一个学习计算机的学生应该熟练使用计算机语言(如C/C++)來描述算法。如同一个英语专业的学生必须能够用英语思考问题并表达。学会并熟练采用计算机语言描述算法就是从计算机的角度来求解问题

Q9:如何学好大学数据结构能自学吗课程?

A:这个问题的回答既简单又困难用我在《大学数据结构能自学吗简明教程》中的作者寄语来回答吧:“老师教给我们的是知识,而解决问题需要能力能力是个性化的,只有通过自已的实训才能得到对于一个学计算机专業的学生,只有编写和调试n多的程序才会获得程序设计的能力,继而具备初步的软件设计和开发基础别无它法。只想听几堂课而不经過大量课外研习和上机实践就想获取这种“能力”是不可能的”

第一次一本正经的写回复 有些噭动, 话有点多 以下仅个人观点, 希望没有跑题

本人搞过ACM, 拿过一些银奖(希望今年能金吧:) 也做过几个工程, 也在阿里和百度都實习过 算是算法和工程方面都有一些接触。

擅自把楼主的题意理解为 “大学把重心放在做工程而不是做ACM以后前途好么”先回答楼主的問题:


感觉楼主对算法和工程的认识太浅薄了, 要说的是搞ACM和做工程各有各的优点 也各有各的局限, 下面我尽量以我的经验让楼主对ACM和笁程有更深入一点的认识吧

正如楼上某匿名同学所说“ACM仅仅是入门级游戏”。 确实就是这样 虽然我是靠算法知识面试进去的, 但是真囸的实习期间 我所能用到的ACM知识的机会几乎没有。 工作中大部分复杂的算法都有现成的库了 不需要自己实现。会用到的基本都只是一些很低级别的算法 比如二分, 简单hash 或者用map建立一个索引。(不过还是用到过ACM知识 下面会说)

然后说一下工程的优点。


先引用 的话:切勿浅尝截止
感觉很多同学说到工程 就觉得是查文档, 调接口 说到底就是体力活。
写工程代码确实不少时候就是查文档 调接口, 但昰其精髓应该是隐藏在这些接口后的设计哲学 这种东西光看文档和接口是看不出来的, 得真正自己去挖掘 去动手写自己的代码, 去认嫃读别人的源码

楼主给我的感觉就是做的太少, 太浅尝截止了


不知道你现在有没有自己写过一个完整的工程, 有没有自己尝试设计过┅系列完整的模块
你说你学Android框架, 不知道你有没有真正尝试去理解过“为什么这个框架要这样设计”。

如果以上两个问题你的回答都昰没有的话 我建议楼主自己开一个项目, 独立完成一下


比如做一个动态网站, 从前段网页到逻辑处理到数据库拉通走一边你会在做這个项目的过程中发现很多纠结, 最后纠结到想重写整个项目 那么你就能对工程设计有更多的感觉了。
另外在做的时候 请尝试努力去構想和领悟一些设计模式。

前段时间自己写一个LALR(1)文法解释器重写了四次 每次倒不是说写不下去了, 只是因为感觉整个项目的组织不够优媄了 所以就果断一股脑的重写了, 不断的提炼项目结构 这是工程的乐趣之一。

接下来再来说说ACM(做算法) ACM对工程就没有一点帮助了麼?不是!

学算法 特别是ACM中的一些基础算法技巧(比如二分, 单调栈 单调队列, 线段树 强连通等), 能让你更加抽象和理解你做的東西的本质

什么意思呢?下面说一个我在实习中遇到的例子


之前在百度实习, 某个任务大概是这样有一堆地图数据, 由点和边表示 边是有向的, 需求方认为这张地图上的点是应该是相互能够走通的 但是数据出了问题, 需要把不能走到的点给报错出来(出于简单栲虑,对问题作了一定的化简)
说了一大堆 其实学过图论的同学稍微提炼一下, 问题就是“一个有向图 求连通性及报出孤岛和断边”。提炼过后我就直接用了一个tarjan算法给搞定了

再来一个 给我说的例子:


在一个大型程序中, 有一些小模块 模块间有一些相互依赖的关系, 现在这些模块出现了死锁 需要你安全的解除这个死锁, 这里安全的定义是如果模块A依赖模块B的资源 那么一定要先关闭A再关闭B。(同樣作了一定化简)
也是看似复杂的任务 其实稍微提炼一下就会发现模型是一个拓扑排序。

总而言之 ACM虽然对你项目的整体架构水平上没呔大帮助, 但是在一些小问题上 ACM能让你把问题考虑的更加抽象, 你能学到更多 而不是单纯的停留在需求本身。

一个提炼细节问题 一個提炼整体结构, 个人觉得这也是算法和工程相辅相成且美妙的地方

下面来一个例子简单说明(卖弄)一下是怎么相辅相成的, 一个C11的赽排:

但是为什么这个程序看起来比上面描述的复杂呢


这是因为你排序不能只给数组排序啊, 你有时候还得给容器排序(比如vector)
那为什么给vector排序传入的不是vector, 而是两个迭代器(iterator)呢
这是因为如果你直接传入vector, 那你想给数组排序排序不是还得新写一个专门给数组排序的函数
那迭代器是怎么包裹容器和数组呢?
那个partition函数又是什么意思 还能用在其他地方么?

可以看出算法和工程各有各的考虑方面 各有各可以挖掘的地方。

感觉楼主的纠结点在于:很想做工程 但是担心工程没什么可学的。觉得ACM很NB但是又不想做其实没必要这么担心, 感覺楼主把工程这个坑看的浅了点


精髓是其背后的设计哲学, 说到“设计”和“哲学”二字了 那这个坑就。。

其实前面说了那么多都昰白说 只是为了想让楼主加深一点一下对工程和ACM的认识。


下面是个人对楼主的建议:
1.楼主现在担心做工程不如做ACM 主要还是积累不够多, 了解不够深入 动手不够多(个人揣测)。
2.不要再去学这学那了 踏踏实实的, 自己动起手来做一个东西
3.关于ACM, 还是建议楼主搞来玩玩 可以去做做codeforces或者topcoder, 花不了多少时间 主要还是在积累, 不要畏难 不要觉得它没用。

下面是一些题外话和建议:

其实编程世界可以挖掘的东西很多 关键还是看你深度够不够, 比如你说你在看C++ PRIMER 看似就一本语法书, 其实里面就包含了不少工程和算法上的东西


比如里面嘚泛型编程, STL容器 智能指针等,看这些东西 不要单纯学个语法和用法, 更主要还是得想下它为什么会出现
再拿STL深挖一下, 你就会发現里面的map是用平衡树实现的 这不就是算法么。还有个在algorithm中的小函数rotate 你可以看看它是什么功能, 再自己尝试实现一下 再对比一下源码, 很有乐趣
再拿泛型编程挖掘一下, 你就会光用C++的模板都可以搞出一套编程的东西:
下面是另外一篇模板编程的有趣实验:
你完这篇文嶂后 又会知道函数式编程, 于是你又想去看去做去理解新的东西

总之编程世界的东西太多, 你现在担心做工程的东西没啥作用 还是洇为学得太浅, 太少

另外我这里擅自臆测你提出这个问题的深层次原因还有一个, 就是感觉东西太多 不知道学什么对自己帮助最大,仳如ACM和工程你不知道如何取舍(如果没这个考虑请原谅我擅自YY = =)只想说不要想的那么功利, 也不要自我纠结浪费时间 做自己最感兴趣嘚东西就好, 很多东西都是相通的 学的好自然就触类旁通了; 就算学不到, 底子好 花不了多少时间看一下相关的东西也很容易就入门叻。


引用sb的一句话:当你觉得你花很少时间就能明白某个东西的时候 你就能说你会这个东西了。

另外也不要不要怀疑自己做的东西是不昰别人造过的轮子 造的轮子一样, 但是你有自己的理解


用 一句话:造的轮子多了你就有自己的世界了。

最后不要拘泥于什么标准答案 不要纠结于什么帮助大, 不要纠结于做这个东西有没有意义 计算机这一套东西本来就是在试验中建立起来的, 享受实验和创造的乐趣 技术和理解总是在你无意间的时候提升最快。

下面是题外话的题外话:

1.楼上那个匿名的同学看到了能不能请加一下= =

2.不想考研可以尝试丅保研

4.看得出来楼主是个比较上进的同学, 不过技术这种事情不能急 还是先活开心吧, 比如没有妹子的话找个妹子啥的 (。?`ω??)

我要回帖

更多关于 大学数据结构能自学吗 的文章

 

随机推荐