【数据结构】什么是数据结构?

绪论

第一个颇有意义,又没什么意义的问题:什么是数据结构??

其实,数据结构在计算机科学界至今没有标准的定义。我的根据各自的理解的不一样而有不一样的表述方法: 
  • Sartaj Sahni在他的《数据结构、算法与应用》一书中称:
       “数据结构是数据对象,以及存在于该对象的实例合组成实例的数据元素之间的各类联系。这些联系能够经过定义相关的函数来给出。”
          他将数据对象(data object)定义为“一个数据对象是实例或值的集合”。 
 
      
  • Clifford A.Shaffer在《数据结构与算法分析》一书中的定义是:“数据结构是 ADT(抽象数据类型Abstract Data Type) 的物理实现。”
  • 《算法导论》一书中定义:“数据结构是存储和组织数据的一种方式,以便于对数据进行访问和修改”
其实,究竟什么是数据结构这个问题 真的并非很重点。您将会在进一步学习它以后,有本身对它的一种理解。

咱们更应该关心的是,学习数据结构 能为咱们解决什么样问题?它给咱们 带来什么样的好处

第一个问题,在程序里面,有一个家族,若是您知道一我的的名字,想知道他老爸是谁那么应该怎么作?
其中一个答案是,建立一个结构体,里面包含了本人的名字和他老爸的名字,这样,当我找到这我的的名字的时候,相应的就能够知道他老爸是谁了, 但是这样好像很浪费空间啊,每有一个老爸就要多一份存储名字的空间, 一个家族里面有不少的老爸啊,
那么咱们能够换另一种方法,咱们不直接用老爸的名字,而是使用一个指向老爸包含名字的结构的指针,一样咱们可以找到他老爸的名字,
若是您这样作了,那么您已经在使用数据结构了!

程序设计实际 = 好的结构 + 好的算法!
一样的问题,不一样的设计方法,即便都能达到最后正确的结果,可是效果却很大的差异,有的可能只要一秒,有的可能须要几十秒,有的可能不须要太大的空间,有的可能很耗空间!


数据结构就是一门为您提供好的结构和好的算法的学科!

简单的讲,学习数据结构,您就能够编写更好的程序

数据结构相关的一些概念和术语:

  • 数据          :这个很好理解吧,全部计算机能处理的‘符号’都是数据。例如,整数、浮点数、图像、声音等;
  • 数据元素   :数据的基本单位,计算机对其做为总体看待的对象。例如,一本书(包括,书名、做者名等)
  • 数据项       :数据元素的最小单位,根据数据元素而定,对于书,书名是数据项。而对于名字这个数据元素,笔画是数据项;
  • 数据对象    :性质相同的数据元素的集合,是数据的一个子集。例如,整数数据对象是集合N= {...-2,-1,0,1,2...}
  • (数据)结构 :数据元素之间存在的关系;
  • 数据类型    :一个值的集合和定义在这个值集上的一组操做的总称;
  • 抽象数据类型:一个数学模型以及定义在该模型上的一组操做;

算法的设计要求:

  • 正确性:无可或非的应该把这个放在第一位!
  • 可读性:若是您的代码没有注释,没有缩进,还胡乱命名变量,若是我是老板,见一个开除一个;
  • 健壮性:指定是对错误输入的一个处理容忍的方法,而不至于致使程序异常;
  • 效率:通常能够理解为算法执行的时间(时间复杂度);
  • 存储量:指算法执行过程当中所须要的最大存储空间(空间复杂度);
推荐:《编程修养》,做为一个好的程序员,固然必须得有好的编程习惯!(PS:在我上传的资源里面有)
效率和存储量在通常状况下很差兼得,至于优先考虑哪一个,要看具体的应用了。

要学会简单衡量(具体的在后面讨论):

  • 时间复杂度:简单的理解是,基本操做次数对应于问题规模n的函数,一般有O(1)、O(n)、O(n^2)....;
  • 空间复杂度:对于输入数据操做所须要的额外空间;

最后,我想说一句,数据结构真的很差学,就严蔚敏老师那本300页的数据结构(C语言版),都足足够看一两个月了。
可是,若是您想做为一名合格的程序员,相信我,学好的它吧,无论有多难!
在C++的STL中,不少数据结构已经实现了,例如:表list、堆stack、队列queue)