数据结构功能实例

未结帖
0 670
ajian admin_jim 2017-09-13
悬赏:5飞吻

有个经典的公式叫作:程序=数据结构+算法。认同这个公式的知友们请点个赞^_^

刚入数据结构和算法的坑,但是对其运用很是疑惑,网上一通搜,到底有什么用?没有讲的清楚的。在一本数据结构和算法的书里翻到一个小例子算是解了我的惑,是的,本人就是这么愚不可及,需要用代码告诉我有什么用。

根据班级同学不同的分段给出评级。
一个班级里不同分段的人数不是相等的,而是有着峰值和低谷。如何利用呢?
不及格1人,及格2人,中等4人,良好2人,优秀1人。
程序1:
if(a<60){
b="不及格";
}else if(a<70){
b="及格";
}else if(a<80){
b="中等";
}else if(a<90){
b="良好";
}else {
b="优秀";
}
执行次数:1×1+2×2+4×3+2×4+1×5=30
完全没利用到数据本身特点。   
       
程序2:
if(a<80){
b="中等40";
}else if(a<70){
b="及格20";
}else if(a<90){
b="良好20";
}else if(a<60){
b="不及格10";
}else {
b="优秀10";
}
执行次数:4×1+2×2+2×3+1×4+1×5=23
利用情况一般

程序3:
if(a<80){
  if(a<70){
     if(a<60){
a="不及格"
    }
a="及格";
  }
a="中等";
}else{
  if(a<90){
a="良好"
   }
a="优秀"
}
这个就不算了,肯定效率高多了。

程序3的设计其实就是数据结构里的赫夫曼树,发明目的是解决远距离通信的数据传输最优化问题,我们写程序的时候多考虑一些执行效率上的问题,自然很多算法和数据结构都有用武之地,算法和数据结构这个东西分开谈没意义,就向上例,数据之间没有一定的树层级关系,你用屁的算法。对了,上例的优化不针对树,如果数据中间峰值两边低谷这个顺序,用二分查找效率也是刚刚的,当然会麻烦一点,而且数据不是这个顺序怎么办,当然这是不同情况下的适应性问题了。谈谈为什么我会有这个思路,因为数据结构里讲到过四种数据逻辑结构,上例明显是从树形结构出发的,我们学过就会想想用集合和线性结构下的最优解,自然思路就出来了。

其他运用如栈的应用,四则运算表达式求值,编译器使用栈实现递归,函数出入栈。


-------------------------------------------------------------------------------------------------------------------------------------

作者:darkhorse pxf
链接:https://www.zhihu.com/question/29587605/answer/44895115
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

个人认为数据结构是编程最重要的基本功没有之一!

学了顺序表和链表,你就知道,在查询操作更多的程序中,你应该用顺序表;而修改操作更多的程序中,你要使用链表;而单向链表不方便怎么办,每次都从头到尾好麻烦啊,怎么办?你这时就会想到双向链表or循环链表。

学了栈之后,你就知道,很多涉及后入先出的问题,例如函数递归就是个栈模型、Android的屏幕跳转就用到栈,很多类似的东西,你就会第一时间想到:我会用这东西来去写算法实现这个功能。

学了队列之后,你就知道,对于先入先出要排队的问题,你就要用到队列,例如多个网络下载任务,我该怎么去调度它们去获得网络资源呢?再例如操作系统的进程(or线程)调度,我该怎么去分配资源(像CPU)给多个任务呢?肯定不能全部一起拥有的,资源只有一个,那就要排队!那么怎么排队呢?用普通的队列?但是对于那些优先级高的线程怎么办?那也太共产主义了吧,这时,你就会想到了优先队列,优先队列怎么实现?用堆,然后你就有疑问了,堆是啥玩意?自己查吧,敲累了。

总之好好学数据结构就对了。我觉得数据结构就相当于:我塞牙了,那么就要用到牙签这“数据结构”,当然你用指甲也行,只不过“性能”没那么好;我要拧螺母,肯定用扳手这个“数据结构”,当然你用钳子也行,只不过也没那么好用。学习数据结构,就是为了了解以后在IT行业里搬砖需要用到什么工具,这些工具有什么利弊,应用于什么场景。以后用的过程中,你会发现这些基础的“工具”也存在着一些缺陷,你不满足于此工具,此时,你就开始自己在这些数据结构的基础上加以改造,这就叫做自定义数据结构。而且,你以后还会造出很多其他应用于实际场景的数据结构。。你用这些数据结构去造轮子,不知不觉,你成了又一个轮子哥。

-------------------------------------------------------------------------------------------------------------------------------------


作者:刘欣
链接:https://www.zhihu.com/question/29587605/answer/147424220
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

《数据结构》是计算机专业的一门必修课, 可是很多学生学完以后,觉得用处不大, 还不如学个C,Java来的直接一点。

等到工作了以后做业务系统开发,发现根本就用不到那些书中的讲的二叉树、图、排序算法, 更加觉得这门课是在浪费时间了。

这种想法实际上是错误的。


学习数据结构,并不仅仅是学习其中现成的那些队列,堆栈,二叉树,图等经典结构, 也不仅仅是学习其中的那些快速排序、冒泡排序等算法。

更重要的是你要学习一种思想:如何把现实问题转化为计算机语言的表示。


计算机其实一种很笨,很机械的机器,只会按照预定的指令一步步执行,  而计算机语言的特点就是精确、无二意, 它的本质语言是二进制的, 即使是C,Java等高级一点的语言也只不过是包装而已, 它的表达能力并没有本质的提升, 仍然停留在很低的层次。


而我们用的自然语言则是典型的模糊的,不精确的, 程序员面临的一个重要问题, 或者是我们的主要工作就是怎么把自然语言描述的问题转化为计算机语言的表示。

到底该怎么转化, 《数据结构》已经给出了指引:  设计出数据结构, 在施加以算法就行了,  当然现实问题会更复杂, 需要框架,类库,模式等支撑。

这是一种非常重要的逻辑思维能力的锻炼, 也是程序员入门的条件。


很多半路出家的人, 仅仅上了个培训班后参加工作, 写出的代码实在是惨不忍睹, 很明显只掌握了工具,逻辑思维的训练远远不足。


就我个人而言, 大学时学《数据结构》以后, 为了准备高级程序员考试, 把里边的习题全部做了一遍, 发现真是受益匪浅, 不但高程的成绩非常好, 更重要的是在后来的工作中,遇到数据结构相关的实际问题, 基本上没有什么障碍,只要掌握了语言特性,  解决起来非常轻松。


总结一下,《数据结构》这门课其实会潜移默化的影响你的逻辑思维, 当然, 你需要多多练习才有可能使用纯熟, 等它变成身体一部分以后, 你就发现其实大部分编程任务都没什么难度了,更难的其实是对编程更高的要求:抽象的能力。

-------------------------------------------------------------------------------------------------------------------------------------


QQ截图20170913122722.png

-------------------------------------------------------------------------------------------------------------------------------------

作者:吕双全
链接:https://www.zhihu.com/question/29587605/answer/71567673
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

想从“由顶向下”的角度说说自己浅显的理解:

我们知道计算机是人类在思考“能不能偷懒”的原始欲望下创造出来——找一个自动、快速、不知疲惫地替人类进行各种工作的机器。在有了诸如“图灵机”等计算模型理论的支撑下,人们找到了通用的底层方式来实现自己想要功能的方法。但这些方法需要让计算机理解——或者可以被处理后理解,就需要我们以某种形式,将我们的问题一步步抽象、一步步化简,直到形成某种计算机可以理解的“程式化”的语言或组织形式,最后对计算机说一句:剩下的就交给你了!

举个不甚恰当的例子:
比如我们计划去旅游,我们手里有地图,想知道计划中的几个城市直接是否都有高速公路可以走,从而不会有某个城市因道路不通而无法驱车前往。虽然我们可以自己去查,但是我们有计算机啊!于是我们想借助它来完成这个任务,于是进行了第一步抽象——将城市表示为一个个点,道路表示为边,结合起来形成了叫数据结构。我们想知道的便是——这张图是否是一个连通图?比如我们用1、2、3、4分别表示“北上广深”(仅作意会),线段表示道路,于是有了这张图:

画出来以后,我们自己心里明白它表示什么,但计算机不懂。于是我们进行第二步抽象——将图编码,转化为计算机可以编译的语言。于是得到下面表示方式:
              <G> = (1,2,3,4) ((1,2),(2,3),(3,1),(1,4))
前面括号中我们用数字表示各个节点(对应“城市”)的编号,后面则用“(节点,节点)”成对的形式表示一条边(对应 “道路”)。
那么计算机如何处理呢?这时就需要设计一种算法,告诉它怎么理解和处理人类跟你说的话。比如可以按这样的方式:
 1,选择第一个节点并进行标记。
 2,重复第3步直到没有新的节点可以被标记。
 3,   对于G中的每个节点Ni,如果有一条边与其相连,且边的另一头是一个已经被标记的节点Nj(i不等于j),那么将Ni进行标记。(这一步要借助上面写出的“边的集合”((1,2),(2,3),(3,1),(1,4))
 4,扫描一遍点的集合(这里是(1,2,3,4)),如果都被标记了,那么就是连通图(对应“每个城市都有道路经过”);否则不是。

当计算机运行之后,我们开心的发现,得出了想要的结果。更开心的是它不仅可以对这几个城市查询道路,还可以对更多的城市做同样的查询!我们因此省去了自己人工查询的繁琐。
具体如何实现这个算法还要涉及更底层的方面,不过我想到这里数据结构与算法已经体现出来了——正是有了这兄弟俩,我们才能让借助计算机来得到想要的东西,从而大大方便我们的生活,以及创造出如此众多神奇的科技。

愈往深处和广处学习,愈觉得人类智慧的伟大。
数据结构与算法,正是前人在计算机领域智慧结晶的集中领域之一,我想有时甚至不需要知道学好它有什么用,因为体悟智慧本身不就是一种享受吗?


热忱回答0


最近热帖

近期热议

  1. javascript——prototype与__proto 9
  2. Mysql 中出现的Data truncated for column 3
  3. 在nginx中使用x-sendfile的解决方案 3
  4. 高版本jQuery面插件实现Ajax上传图片 1
  5. Thinkphp Socket.class.php 类的使用 1
  6. 使用ionic3创建第一个App 0
  7. ios-oc html5 0
  8. nginx.conf 0
  9. 基于ionic3.4.0的项目搭建 0
  10. php 缩略图 0