1.什么是数据结构和算法
什么是 数据结构和算法 呢?
可能是你之前经常在很多地方都看到有人讨论 数据结构和算法,但是它到底是什么一直云里雾里.
因为似乎我们 学习编程 的过程中,没有必要 了解这些,我只是在学习一门语言的 基本语法/高级语法/做出界面效果/实现发杂的逻辑 就可以了.
数据结构和算法? 它是什么? I don't care?
如果我们知识想了解语言的 应用层面,那么数据结构和算法显得没有那么重要.
举个例子:
Java的线性结构列表,有ArrayList和LinkedList,如果选择呢?
记住规则,你也可以很好的选择,但是如果你了解它们底层的数据结构就会非常清晰的知道如何选择.
虽然,我们也许不重头到尾设计一门编程语言,但是了解这些同样重要.
什么时候会想学习数据结构和算法?
面试时被问到的时候.
工作一两年之后.
那么,到底什么是数据结构的算法呢?
官方定义:并没有...
我们分开来理解它们是什么?
什么是数据结构?
民间定义:
"数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系.这些联系可以通过定义相关的函数来给出." ---<<数据结构 算法于应用>>
"数据结构是ADT(抽象数据类型 ABstract Data Type)的物理实现." --- <<数据结构于算法分析>>
"数据结构(data structure)是计算机中存储 组织数据的方式.通常情况下,精心选择的数据结构可以 带来最优效率的算法." ---中文维基百科
我们还是从 自己的角度 来认识数据结构吧:
数据结构就是 在计算机中,存储和组织数据的方式
我们知道,计算机中数据量非常庞大,如何以高效的方式组织和存储呢?
这就好比一个庞大的图书馆中存放了大量的书籍,我们不仅仅要把书放进入,还应该在核实的时候能够取出来
我们从摆放图书说起
如何摆放图书?
如果是自己的书相对较少,我们可以随意摆放摆放
如果你有一家书店,书的数量相对较多,我们就需要摆放整齐
如果我们开了一个图书馆,书的数量相当庞大,我们就需要分类摆放整齐
图书摆放要是的两个 相关操作 方便实现:
操作1:新书怎么插入?
操作2:怎么找到某本指定的书?
方法1:随便放
操作1:哪里有空放哪里,一步到位!
操作2:找某本书,累死...
方法2:按照书名的拼音字符顺序排放
操作1:新进一本<<阿Q正传>>,按照字母顺序找到位置,插入
操作2:二分查找法
方法3:把书架划分成几块区域,按照类别存放,类别中按照字母顺序
操作1:先定级别,二分查找确定位置,移出空位
操作2:先定级别,再二分查找
结论:
解决问题方法的效率,根数据的组织方式有关
计算机中存储的数据量相当于图书馆的书籍来说数据量大,数据种类更多
以什么样的方式,来储存和组织我们的数据才能再使用数据时更加方便呢?
这就是数据结构需要考虑的问题
数据结构:队列(Queue),树(Tree),堆(Heap),数组(Array),栈(Stack),链表(Linked List),图 (Graph),散列表(Hash)
常见的数据结构较多:
每一种都有其对应的应用场景,不同的数据结构的不同操作性能是不同的.
有的查询性能很快,有的插入速度很快,有的是插入头和尾速度很快
有的做范围查找很快,有的允许元素重复,有的不允许重复等等
在开发中如何选择,要根据具体的需求来选择
注意:数据结构和语言无关,常见的编程语言都有直接或者间接的使用上述常见的数据结构
为什么之前学习JavaScript没有接触过数据结构呢?好像只见过数组.
单纯从 客户程序员 的角度,我们并不需要过多的了解它们的现实细节.
但是简单的使用不能让我们更加灵活的使用它们.了解真相,你才能获得真正的自由.
什么是算法?
算法(Algorithm)的认识
在之前的学习中,我们可能学习过集中排序算法.并且知道,不同的算法,执行效率是不一样的.
也就是说解决问题的过程中,不仅仅数据的存储方式会影响效率,算法的优势也会影响哲效率
那么到底什么是算法呢?
算法的定义:
一个有限指令集,每条指令的描述不依赖于语言
接受一些输入(有些情况下不需要输入)
产生输出
一定在有限步骤之后终止
算法通俗理解:
Algorithm这个单词本意就是解决问题的方法/步骤逻辑
数据结构的额实现,离不开算法.
举例:电灯不工作的解决算法