精华内容
下载资源
问答
  • 什么是数据结构

    万次阅读 2007-03-19 10:30:00
    它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑的数据结构和物理的数据结构之分。逻辑的数据结构反映成分数据之间的逻辑关系,而物理的数据结构...
     
    
    数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。  数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

     

    数据结构与算法总论

     (一)何谓数据结构
            数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。 数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

            数据结构主要研究什么?

            数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

            什么是数据结构?什么是逻辑结构和物理结构?

            数据是指由有限的符号(比如,"0"和"1",具有其自己的结构、操作、和相应的语义)组成的元素的集合。结构是元素之间的关系的集合。通常来说,一个数据结构DS 可以表示为一个二元组:

            DS=(D,S), //i.e., data-structure=(data-part,logic-structure-part)

            这里D是数据元素的集合(或者是"结点",可能还含有"数据项"或"数据域"),S是定义在D(或其他集合)上的关系的集合,S = { R | R : D×D×...},称之为元素的逻辑结构。 逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网络结构。表和树是最常用的两种高效数据结构,许多高效的算法可以用这两种数据结构来设计实现。表是线性结构的(全序关系),树(偏序或层次关系)和图(局部有序(weak/local orders))是非线性结构。

            数据结构的物理结构是指逻辑结构的存储镜像(image)。数据结构 DS 的物理结构 P对应于从 DS 的数据元素到存储区M(维护着逻辑结构S)的一个映射:
            P(D,S) -- > M 存储器模型:一个存储器 M 是一系列固定大小的存储单元,每个单元 U 有一个唯一的地址 A(U),该地址被连续地编码。每个单元 U 有一个唯一的后继单元 U'=succ(U)。 P 的四种基本映射模型:顺序(sequential)、链接(linked)、索引(indexed)和散列(hashing)映射。
            因此,我们至少可以得到4×4种可能的物理数据结构:

            sequential (sets)
            linked lists
            indexed trees
            hash graphs

            (并不是所有的可能组合都合理)数据结构DS上的操作:所有的定义在DS上的操作在改变数据元素(节点)或节点的域时必须保持DS的逻辑和物理结构。

            DS上的基本操作:任何其他对DS的高级操作都可以用这些基本操作来实现。最好将DS和他的所有基本操作看作一个整体——称之为模块。我们可以进一步将该模块抽象为数据类型(其中DS的存储结构被表示为私有成员,基本操作被表示为公共方法),称之为ADT。作为ADT,堆栈和队列都是一种特殊的表,他们拥有表的操作的子集。 对于DATs的高级操作可以被设计为(不封装的)算法,利用基本操作对DS进行处理。

            好的和坏的DS:如果一个DS可以通过某种"线性规则"被转化为线性的DS(例如线性表),则称它为好的DS。好的DS通常对应于好的(高效的)算法。这是由计算机的计算能力决定的,因为计算机本质上只能存取逻辑连续的内存单元,因此如何没有线性化的结构逻辑上是不可计算的。比如对一个图进行操作,要访问图的所有结点,则必须按照某种顺序来依次访问所有节点(要形成一个偏序),必须通过某种方式将图固有的非线性结构转化为线性结构才能对图进行操作。

            树是好的DS——它有非常简单而高效的线性化规则,因此可以利用树设计出许多非常高效的算法。树的实现和使用都很简单,但可以解决大量特殊的复杂问题,因此树是实际编程中最重要和最有用的一种数据结构。树的结构本质上有递归的性质——每一个叶节点可以被一棵子树所替代,反之亦然。实际上,每一种递归的结构都可以被转化为(或等价于)树形结构。

            从机器语言到高级语言的抽象

            我们知道,算法被定义为一个运算序列。这个运算序列中的所有运算定义在一类特定的数据模型上,并以解决一类特定问题为目标。这个运算序列应该具备下列四个特征。 有限性,即序列的项数有限,且每一运算项都可在有限的时间内完成;确定性,即序列的每一项运算都有明确的定义,无二义性;可以没有输入运算项,但一定要有输出运算项;可行性,即对于任意给定的合法的输入都能得到相应的正确的输出。这些特征可以用来判别一个确定的运算序列是否称得上是一个算法。 但是,我们现在的问题不是要判别一个确定的运算序列是否称得上是一个算法,而是要对一个己经称得上是算法的运算序列,回顾我们曾经如何用程序设计语言去表达它。

            算法的程序表达,归根到底是算法要素的程序表达,因为一旦算法的每一项要素都用程序清楚地表达,整个算法的程序表达也就不成问题。

            作为运算序列的算法,有三个要素。 作为运算序列中各种运算的运算对象和运算结果的数据;运算序列中的各种运算;运算序列中的控制转移。这三种要素依序分别简称为数据、运算和控制。 由于算法层出不穷,变化万千,其中的运算所作用的对象数据和所得到的结果数据名目繁多,不胜枚举。最简单最基本的有布尔值数据、字符数据、整数和实数数据等;稍复杂的有向量、矩阵、记录等数据;更复杂的有集合、树和图,还有声音、图形、图像等数据。 同样由于算法层出不穷,变化万千,其中运算的种类五花八门、多姿多彩。最基本最初等的有赋值运算、算术运算、逻辑运算和关系运算等;稍复杂的有算术表达式和逻辑表达式等;更复杂的有函数值计算、向量运算、矩阵运算、集合运算,以及表、栈、队列、树和图上的运算等:此外,还可能有以上列举的运算的复合和嵌套。 关于控制转移,相对单纯。在串行计算中,它只有顺序、分支、循环、递归和无条件转移等几种。

            我们来回顾一下,自从计算机问世以来,算法的上述三要素的程序表达,经历过一个怎样的过程。 最早的程序设计语言是机器语言,即具体的计算机上的一个指令集。当时,要在计算机上运行的所有算法都必须直接用机器语言来表达,计算机才能接受。算法的运算序列包括运算对象和运算结果都必须转换为指令序列。其中的每一条指令都以编码(指令码和地址码)的形式出现。与算法语言表达的算法,相差十万八千里。对于没受过程序设计专门训练的人来说,一份程序恰似一份"天书",让人看了不知所云,可读性极差。 用机器语言表达算法的运算、数据和控制十分繁杂琐碎,因为机器语言所提供的指令太初等、原始。机器语言只接受算术运算、按位逻辑运算和数的大小比较运算等。对于稍复杂的运算,都必须一一分解,直到到达最初等的运算才能用相应的指令替代之。机器语言能直接表达的数据只有最原始的位、字节、和字三种。算法中即使是最简单的数据如布尔值、字符、整数、和实数,也必须一一地映射到位、字节和字中,还得一一分配它们的存储单元。对于算法中有结构的数据的表达则要麻烦得多。机器语言所提供的控制转移指令也只有无条件转移、条件转移、进入子程序和从子程序返回等最基本的几种。用它们来构造循环、形成分支、调用函数和过程得事先做许多的准备,还得靠许多的技巧。 直接用机器语言表达算法有许多缺点。
            大量繁杂琐碎的细节牵制着程序员,使他们不可能有更多的时间和精力去从事创造性的劳动,执行对他们来说更为重要的任务。如确保程序的正确性、高效性。程序员既要驾驭程序设计的全局又要深入每一个局部直到实现的细节,即使智力超群的程序员也常常会顾此失彼,屡出差错,因而所编出的程序可靠性差,且开发周期长。 由于用机器语言进行程序设计的思维和表达方式与人们的习惯大相径庭,只有经过较长时间职业训练的程序员才能胜任,使得程序设计曲高和寡。因为它的书面形式全是"密"码,所以可读性差,不便于交流与合作。因为它严重地依赖于具体的计算机,所以可移植性差,重用性差。这些弊端造成当时的计算机应用未能迅速得到推广。 克服上述缺点的出路在于程序设计语言的抽象,让它尽可能地接近于算法语言。 为此,人们首先注意到的是可读性和可移植性,因为它们相对地容易通过抽象而得到改善。于是,很快就出现汇编语言。这种语言对机器语言的抽象,首先表现在将机器语言的每一条指令符号化:指令码代之以记忆符号,地址码代之以符号地址,使得其含义显现在符号上而不再隐藏在编码中,可让人望"文"生义。其次表现在这种语言摆脱了具体计算机的限制,可在不同指令集的计算机上运行,只要该计算机配上汇编语言的一个汇编程序。这无疑是机器语言朝算法语言靠拢迈出的一步。但是,它离算法语言还太远,以致程序员还不能从分解算法的数据、运算和控制到汇编才能直接表达的指令等繁杂琐碎的事务中解脱出来。 到了50年代中期,出现程序设计的高级语言如Fortran,Algol60,以及后来的PL/l, Pascal等,算法的程序表达才产生一次大的飞跃。
            诚然,算法最终要表达为具体计算机上的机器语言才能在该计算机上运行,得到所需要的结果。但汇编语言的实践启发人们,表达成机器语言不必一步到位,可以分两步走或者可以筑桥过河。即先表达成一种中介语言,然后转成机器语言。汇编语言作为一种中介语言,并没有获得很大成功,原因是它离算法语言还太远。这便指引人们去设计一种尽量接近算法语言的规范语言,即所谓的高级语言,让程序员可以用它方便地表达算法,然后借助于规范的高级语言到规范的机器语言的"翻译",最终将算法表达为机器语言。而且,由于高级语言和机器语言都具有规范性,这里的"翻译"完全可以机械化地由计算机来完成,就像汇编语言被翻译成机器语言一样,只要计算机配上一个编译程序。 上述两步,前一步由程序员去完成,后一步可以由编译程序去完成。在规定清楚它们各自该做什么之后,这两步是完全独立的。它们各自该如何做互不相干。前一步要做的只是用高级语言正确地表达给定的算法,产生一个高级语言程序;后一步要做的只是将第一步得到的高级语言程序翻译成机器语言程序。至于程序员如何用高级语言表达算法和编译程序如何将高级语言表达的算法翻译成机器语言表达的算法,显然毫不相干。

     处理从算法语言最终表达成机器语言这一复杂过程的上述思想方法就是一种抽象。汇编语言和高级语言的出现都是这种抽象的范例。 与汇编语言相比,高级语言的巨大成功在于它在数据、运算和控制三方面的表达中引入许多接近算法语言的概念和工具,大大地提高抽象地表达算法的能力。 在运算方面,高级语言如Pascal,除允许原封不动地运用算法语言的四则运算、逻辑运算、关系运算、算术表达式、逻辑表达式外,还引入强有力的函数与过程的工具,并让用户自定义。这一工具的重要性不仅在于它精简了重复的程序文本段,而且在于它反映出程序的两级抽象。在函数与过程调用级,人们只关心它能做什么,不必关心它如何做。只是到函数与过程的定义时,人们才给出如何做的细节。用过高级语言的读者都知道,一旦函数与过程的名称、参数和功能被规定清楚,那么,在程序中调用它们便与在程序的头部说明它们完全分开。你可以修改甚至更换函数体与过程体,而不影响它们的被调用。如果把函数与过程名看成是运算名,把参数看成是运算的对象或运算的结果,那么,函数与过程的调用和初等运算的引用没有两样。利用函数和过程以及它们的复合或嵌套可以很自然地表达算法语言中任何复杂的运算。 在数据方面,高级语言如Pascal引人了数据类型的概念,即把所有的数据加以分类。每一个数据(包括表达式)或每一个数据变量都属于其中确定的一类。称这一类数据为一个数据类型。 因此,数据类型是数据或数据变量类属的说明,它指示该数据或数据变量可能取的值的全体。对于无结构的数据,高级语言如Pascal,除提供标准的基本数据类型--布尔型、字符型、整型和实型外,还提供用户可自定义的枚举类型、子界类型和指针类型。这些类型(除指针外),其使用方式都顺应人们在算法语言中使用的习惯。对于有结构的数据,高级语言如Pascal,提供了数组、记录、有限制的集合和文件等四种标准的结构数据类型。其中,数组是科学计算中的向量、矩阵的抽象;记录是商业和管理中的记录的抽象;有限制的集合是数学中足够小的集合的势集的抽象;文件是诸如磁盘等外存储数据的抽象。人们可以利用所提供的基本数据类型(包括标准的和自定义的),按数组、记录、有限制的集合和文件的构造规则构造有结构的数据。 此外,还允许用户利用标准的结构数据类型,通过复合或嵌套构造更复杂更高层的结构数据。这使得高级语言中的数据类型呈明显的分层。 高级语言中数据类型的分层是没有穷尽的,因而用它们可以表达算法语言中任何复杂层次的数据。 在控制方面,高级语言如Pascal,提供了表达算法控制转移的六种方式。
            (1)缺省的顺序控制";"。
            (2)条件(分支)控制:"if表达式(为真)then S1 else S2;" 。
            (3)选择(情况)控制:
            "Case 表达式 of
            值1: S1
            值2: S2
            ...
            值n: Sn
            end"
            (4)循环控制:
            "while 表达式(为真) do S;" 或
            "repeat S until 表达式(为真);" 或
            "for变量名:=初值 to/downto 终值do S;"
            (5)函数和过程的调用,包括递归函数和递归过程的调用。
            (6)无条件转移goto。
             
            这六种表达方式不仅覆盖了算法语言中所有控制表达的要求,而且不再像机器语言或汇编语言那样原始、那样繁琐、那样隐晦,而是如上面所看到的,与自然语言的表达相差无几。 程序设计语言从机器语言到高级语言的抽象,带来的主要好处是: 高级语言接近算法语言,易学、易掌握,一般工程技术人员只要几周时间的培训就可以胜任程序员的工作;高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;高级语言远离机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好,重用率高; 由于把繁杂琐碎的事务交给了编译程序去做,所以自动化程度高,开发周期短,且程、序员得到解脱,可以集中时间和精力去从事对于他们来说更为重要的创造性劳动,以提高、程序的质量。

            数据结构、数据类型和抽象数据类型

            数据结构、数据类型和抽象数据类型,这三个术语在字面上既不同又相近,反映出它们在含义上既有区别又有联系。

            数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由哪些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,物理上的数据结构反映成分数据在计算机内的存储安排。数据结构是数据存在的形式。

            数据是按照数据结构分类的,具有相同数据结构的数据属同一类。同一类数据的全体称为一个数据类型。在程序设计高级语言中,数据类型用来说明一个数据在数据分类中的归属。它是数据的一种属性。这个属性限定了该数据的变化范围。为了解题的需要,根据数据结构的种类,高级语言定义了一系列的数据类型。不同的高级语言所定义的数据类型不尽相同。Pascal语言所定义的数据类型的种类。

            其中,简单数据类型对应于简单的数据结构;构造数据类型对应于复杂的数据结构;在复杂的数据结构里,允许成分数据本身具有复杂的数据结构,因而,构造数据类型允许复合嵌套;指针类型对应于数据结构中成分数据之间的关系,表面上属简单数据类型,实际上都指向复杂的成分数据即构造数据类型中的数据,因此这里没有把它划入简单数据类型,也没有划入构造数据类型,而单独划出一类。
            数据结构反映数据内部的构成方式,它常常用一个结构图来描述:数据中的每一项成分数据被看作一个结点,并用方框或圆圈表示,成分数据之间的关系用相应的结点之间带箭号的连线表示。如果成分数据本身又有它自身的结构,则结构出现嵌套。这里嵌套还允许是递归的嵌套。

            由于指针数据的引入,使构造各种复杂的数据结构成为可能。按数据结构中的成分数据之间的关系,数据结构有线性与非线性之分。在非线性数据结构中又有层次与网状之分。 由于数据类型是按照数据结构划分的,因此,一类数据结构对应着一种数据类型。数据类型按照该类型中的数据所呈现的结构也有线性与非线性之分,层次与网状之分。一个数据变量,在高级语言中的类型说明必须是读变量所具有的数据结构所对应的数据类型。最常用的数据结构是数组结构和记录结构。数组结构的特点是:

            成分数据的个数固定,它们之间的逻辑关系由成分数据的序号(或叫数组的下标)来体现。这些成分数据按照序号的先后顺序一个挨一个地排列起来。每一个成分数据具有相同的结构(可以是简单结构,也可以是复杂结构),因而属于同一个数据类型(相应地是简单数据类型或构造数据类型)。这种同一的数据类型称为基类型。所有的成分数据被依序安排在一片连续的存储单元中。 概括起来,数组结构是一个线性的、均匀的、其成分数据可随机访问的结构。由于这、种结构有这些良好的特性,所以最常被人们所采用。在高级语言中,与数组结构相对应的、数据类型是数组类型,即数组结构的数据变量必须说明为array [i] of T0 ,其中i是数组、结构的下标类型,而T0是数组结构的基类型。 记录结构是另一种常用的数据结构。它的特点是:与数组结构一样,成分数据的个数固定。但成分数据之间没有自然序,它们处于平等地位。每一个成分数据被称为一个域并赋予域名。不同的域有不同的域名。不同的域允许有不同的结构,因而允许属于不同的数据类型。与数组结构一样,它们可以随机访问,但访问的途径靠的是域名。在高级语言中记录结构对应的数据类型是记录类型。记录结构的数据的变量必须说明为记录类型。

            抽象数据类型的含义在上一段已作了专门叙述。它可理解为数据类型的进一步抽象。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。对于抽象数据类型的描述,除了必须描述它的数据结构外,还必须描述定义在它上面的运算(过程或函数)。抽象数据类型上定义的过程和函数以该抽象数据类型的数据所应具有的数据结构为基础。

    (二)泛型设计和数据结构与算法
            下面我想再说说关于泛型程序设计模型对于数据结构和算法方面的最新推动,泛型思想已经把数据结构和算法方面的基本思想抽象到了一个前所未有的高度,现在有多种程序设计语言支持泛型设计,比如ADA,C++,而且据说在JAVA的下一版本和C#中也将对泛型设计进行全面的支持。

            先说说泛型设计的基本思想:泛型编程(generic programming,以下直接以GP称呼)是一种全新的程序设计思想,和OO,OB,PO这些为人所熟知的程序设计想法不同的是GP抽象度更高,基于GP设计的组件之间偶合度底,没有继承关系,所以其组件间的互交性和扩展性都非常高。我们都知道,任何算法都是作用在一种特定的数据结构上的,最简单的例子就是快速排序算法最根本的实现条件就是所排序的对象是存贮在数组里面,因为快速排序就是因为要用到数组的随机存储特性,即可以在单位时间内交换远距离的对象,而不只是相临的两个对象,而如果用联表去存储对象,由于在联表中取得对象的时间是线性的既O[n],这样将使快速排序失去其快速的特点。也就是说,我们在设计一种算法的时候,我们总是先要考虑其应用的数据结构,比如数组查找,联表查找,树查找,图查找其核心都是查找,但因为作用的数据结构不同将有多种不同的表现形式。数据结构和算法之间这样密切的关系一直是我们以前的认识。泛型设计的根本思想就是想把算法和其作用的数据结构分离,也就是说,我们设计算法的时候并不去考虑我们设计的算法将作用于何种数据结构之上。泛型设计的理想状态是一个查找算法将可以作用于数组,联表,树,图等各种数据结构之上,变成一个通用的,泛型的算法。这样的理想是不是很诱惑人?

            泛型编程带来的是前所未有的弹性以及不会损失效率的抽象性,GP和OO不同,它不要求你通过额外的间接层来调用函数:它让你撰写完全一般化并可重复使用的算法,其效率与针对特定数据结构而设计的算法旗鼓相当。我们大家都知道数据结构在C++中可以用用户定义类型来表示,而C++中的模板技术就是以类型作为参数,那么我可以想象利用模板技术可以实现我们开始的GP思想,即一个模板函数可以对于各种传递进来的类型起作用,而这些类型就可以是我们定义的各种数据结构。泛型算法抽离于特定类型和特定数据结构之外,使得其适应与尽可能的一般化类型,算法本身只是为了实现算法其需要表达的逻辑本质而不去被为各种数据结构的实现细节所干扰。这意味着一个泛型算法实际具有两部分。1,用来描叙算法本质逻辑的实际指令;2,正确指定其参数类型必须满足的性质的一组需求条件。到此,相信有不少人已经开始糊涂了,呵呵,不要紧。毕竟GP是一种抽象度非常高的程序设计思想,里面的核心就是抽象条件成为成为程序设计过程中的核心,从而取代了类型这在OO里面的核心地位,正是因为类型不在是我们考虑的重点,类型成为了抽象条件的外衣,所以我们称这样的程序思想为泛型思想------把类型泛化。

    (三)个人学习心得
            至于如何学习数据结构,我个人认为合适的方法是,首先从根本上就要认识到数据结构的本质,数据结构和算法之间的密切关系,以及数据结构的应用方法。不然我们很可能陷入各种数据结构的复杂特性中却还根本不知道到底什么才是数据结构的本质,学了很多很久却其实什么都没有弄明白,在这里我说点我个人的一点关于数据结构本质的东西:

            学好数据结构最重要的是对程序设计方式和程序语言概念和实现的理解int i;
            int i[];
            struct i{};
            ADT i{};
            到底有什么区别,这就是程序设计语言实现的问题了。
            定义了一种数据类型就是定义了一类操作
            int i,j;i=j+1;
            这样的操作在语言本身中实现了,也就是说你不需要关心这样的操作程序语言是如何完成的,所以int就是基本数据类型

            抽象了基本数据类型的就是数据结构。
            当你定义了
            ADT P{};
            的时候,比如如果P是链表,这就要你去实现它各种的操作。而且P能够完成的所有操作都必须由你去实现,而你实现得基础就是这些char int float *p...基本数据类型。这就是抽象数据类型。
            当你把类型定义完成后,剩下的就是算法去完成程序流程的控制。

            所以:数据结构+算法=程序

            还想说点的是,设计思想,程序设计语言,和数据结构,始终是促进计算机软件科学发展的最大动力。一般来说都是思想先与语言,然后出现支持这种思想和包含这样思想的数据类型的语言实现。

            具体说:
            面向机器编程 机器语言,汇编语言
            面向过程编程 C。。。。语言
            面向对象编程 JAVA C++
            当然思想毕竟只是思想,你可以用不同的语言实现。但必须说明的是只能用一个层面上的语言实现。 比如,机器语言,由于其语言本身抽象层很低,低到了就像给一个对象赋值的操作也要程序员进行位操作。为在语言实现这个层面上,它不支持。 为什么说C也可以进面向对象的编程呢?关键就在C很好的支持ADT了。他可以用复杂了ADT去代替C++中已经变成基本数据类型的CLASS,但是正是因为要用C完成OO,必须程序员来实现(定义ADT)。所以说,C不适合开发OO软件。而C++却恰恰把CLASS定义成了一个基本类型,这样就完成了OO这一个层次的抽象。当然由于C++是C的超集,他同样是完全支持面向过程的。

            说了这么多,就是想说说 数据结构和程序语言和设计思想的关系。当我们能把数据结构的学习和程序设计语言,程序设计想法相联系起来的时候,我想我们对数据结构本身的认识已经更加深刻了,我们学习到每一种的新的数据结构的时候我们不再恐慌,因为我们知道了任何一种数据结构都有其共同的共性和特殊的特性,每一种数据结构都是为了一个领域所现实的,从这一方面来说,数据结构本身就具有继承特性,我们可以用一个继承树来表示一个完整的数据结构体系,而每一种数据结构都是继承体系中的一个子节点。

            最后在这里我推荐几本我觉得比较出色的数据结构方面的教材:


            《数据结构与算法------面向对象的C++设计模式》 电子工业出版社出版。在amazon上是五星评价,个人认为其对数据结构的整体描叙和对各种应用算法十分出色。

            《Algorithm in c++ I-V》是RS的著作《Algorithm in c》的C++版本,完整的描叙了各种算法,amazon上五星评价,高等教育出版社有其影印版。

            《data structrus in C++ with STL》 使用C++标准模板库来描叙数据结构,是使用泛型设计的方法描叙数据结构的一本全面教材。清华出版了中文版,但有其影印版。


    展开全文
  • 什么是Mesh网络结构

    千次阅读 2019-10-27 10:32:48
    本文什么是Mesh技术?网状网络(Mesh)和传统...最常见最广泛使用的星型结构是以中央节点作为核心,其他节点都连接至中央节点,这种结构的成本较高、可靠性较低,但是其延迟小、结构简单便于管理。总线型结...

    本文是对什么是Mesh技术?网状网络(Mesh)和传统网络结构相比有什么优势?这篇文章的简化和总结,原文说的比较啰嗦,想看的点链接自己看。

    1.先来看传统局域网的问题:

    局域网的基本结构包括星型结构、环型结构、总线结构、分布式结构、树型结构等。最常见最广泛使用的星型结构是以中央节点作为核心,其他节点都连接至中央节点上,这种结构的成本较高、可靠性较低,但是其延迟小、结构简单便于管理。总线型结构则是各个网络设备都挂接在一条总线上,没有明显的中心,优点是结构简单、可扩展性好,但是缺点同样明显,比如维护困难、分支结构故障查找困难。为了在使用中更安全、更高效,目前绝大部分运行中的商用局域网都采用多种网络拓扑模式组合的方式,尽可能发挥局域网的性能并避免阻碍的产生。

    普通用户不会关心网络是怎么布置的,他们只关心网络能不能用,怎么连接网络?目前典型的局域网布置都采用星型结构或者多层星型结构,网络通过主路由器接入,再分配至各个分路由器,最后连接至不同的主机和设备上。这样的布线实现起来比较简单,并且所需的线缆数量也比较少。这样的布置方式和布置思想横跨了有线和无线时代,比如在家庭中,用户会从电信、联通等网络服务商处接入网络,再通过无线路由器转出多路信号或者无线信号供家中的多个有线、无线设备使用,这也是一个典型的星形结构。

    随着互联网的大爆发和无线网络的发展,之前的星型网络和总线型网络的问题数据中心暴露的愈发突出,比如数据中心的安全性和可靠性、总线型布置维护难度等。为了突破这些瓶颈,最近几年,一种并不新鲜但由于技术限制一直未被重视的网络拓扑结构就走上了前台,这就是Mesh——网状网络结构。

    2.Mesh网络的介绍及特点

    所谓Mesh网络,其实就是网络中所有的节点都互相连接,并且每一个节点至少连接其他两个节点,所有的节点之间形成一个整体的网络。在有线时代,由于网线的存在,要实现Mesh布局的网络显得非常困难。不过在无线时代,由于脱离了网线的羁绊,再通过各种全新技术的应用,无线Mesh网络的布局就显得相对容易了。

    从网络拓扑结构来看,无线Mesh网络具有如下特点:

    1. 任意节点之间互相连通,即去中心化,将传统WLAN中的无线“热点”扩展为真正大面积覆盖的无线“热区”;
    2. 无线Mesh网中每个节点都是AP节点,都具备自动配置和集中管理能力,简化了网络的管理维护;
    3. 无线Mesh网络拥有至少一条备用路径,因此在数据传输的可靠性上非常高;
    4. 无线Mesh网络大幅提升信号覆盖范围;
    5. 结构灵活,方便部署;

     

    展开全文
  • 数据结构中ElemType是什么意思

    万次阅读 多人点赞 2018-12-14 20:14:11
    ElemType数据结构的书为了说明问题而用的一个词。它element type(“元素的类型”)的简化体。 因为数据结构是讨论抽象的数据结构和算法的,一种结构中元素的类型不一定整型、字符型、浮点型或者用户自定义...

    ElemType是数据结构的书上为了说明问题而用的一个词。它是element type(“元素的类型”)的简化体。 因为数据结构是讨论抽象的数据结构和算法的,一种结构中元素的类型不一定是整型、字符型、浮点型或者用户自定义类型,为了不重复说明,使用过程中用“elemtype”代表所有可能的数据类型,简单明了的概括了整体。在算法中,除特别说明外,规定ElemType的默认是int型。

    elem是单词element(元素)的缩写,在程序定义中代表某一不确定的类型,也就是抽象的数据类型
    为了使程序可读性强,并且便于修改,让elem代表多种的数据类型
    也就是为int、char等等的数据类型,起了一个别名
    在头文件中定义:typedef char elem;            /* 抽象元素类型为char类型,这样定义之后,下面的程序中elem所定义的元素就是char类型的了 */
    如果需要修改其类型,直接修改char到其他类型,elem便又代表了所修改的类型数据,这也是方便性的体现。

    展开全文
  •  冯·诺依曼结构,又称为普林斯顿体系结构一种将程序指令存储器和数据存储器合并在一起的存储器结构。取指令和取操作数都在同一总线,通过分时复用的方式进行;缺点在高速运行时,不能达到同时取指令和取...

    冯诺依曼结构

      冯·诺依曼结构,又称为普林斯顿体系结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。取指令和取操作数都在同一总线上,通过分时复用的方式进行;缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。由于程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。
    这里写图片描述

    哈佛结构

      哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问,目的是为了减轻程序运行时的访存瓶颈。

      哈佛结构的中央处理器首先到程序指令储存器中读取程序指令内容,解码后得到数据地址,再到相应的数据储存器中读取数据,并进行下一步的操作(通常是执行)。程序指令储存和数据储存分开,数据和指令的储存可以同时进行,可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。
    这里写图片描述

    改进型哈佛结构

      改进型哈佛结构虽然也使用两个不同的存储器:程序存储器和数据存储器,但它把两个存储器的地址总线合并了,数据总线也进行了合并,即原来的哈佛结构需要4条不同的总线,改进后需要两条总线。
    这里写图片描述
    改进型哈佛结构其结构特点为:
    使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存,以便实现并行处理;
    具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输;
    两条总线由程序存储器和数据存储器分时共用。

    各结构对比分析

    这里写图片描述
    这里写图片描述
    这里写图片描述

    总结

      总得来说,哈佛机构的高性能体现在在单片机、DSP芯片平台上运行的程序种类和花样较少,因为各个电子娱乐产品中的软件升级比较少,应用程序可以用汇编作为内核,最高效率的利用流水线技术,获得最高的效率。
      冯诺依曼结构主要是基于电脑购买者对电脑的使用途径不同—-各种娱乐型用户、各种专业开发用户等,且安装的软件的种类繁多,升级频繁,多种软件同时运行时处理的优先级比较模糊,因特尔芯片不具备彻底智能分配各程序优先级和流水线的机制,机械的分配优先和流水线反而容易使用户不便。
      冯氏结构简单、易实现、成本低,但效率偏低;哈佛结构效率高但复杂,对外围设备的连接与处理要求高,十分不适合外围存储器的扩展。现在的处理器,依托CACHE的存在,已经很好的将二者统一起来了。现在的处理器虽然外部总线上看是诺依曼结构的,但是由于内部CACHE的存在,因此实际上内部来看已经类似改进型哈佛结构的了。

    展开全文
  • 什么是软件体系结构

    千次阅读 2019-10-31 21:06:33
    可以从很多角度来看这个问题 软件体系结构的定义:具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件、和连接构件。...软件体系结构处理算法与数据结构关于整体系统结构设计...
  • 从理论讲,C/S软件体系结构组件是什么?连接件是什么?上述实验程序中具体的组件是什么?连接件是什么? 组件为客户机应用程序、应用服务器和数据库服务器,连接件为经由网络的调用-返回机制或隐式调用机制。客户...
  • 战略决定结构是什么意思?

    万次阅读 2017-07-10 11:03:59
    战略决定结构是一个业务原则,它规定组织的办事处、部门、团队、过程和技术为了实现公司的战略而设计的。这个似乎理所当然,但是实际相反情况屡有发生。...战略决定结构的原则通常通过自
  • 数据结构ADT是什么

    千次阅读 2017-06-22 18:02:00
    数据结构是一个数据概念的定义,通过各种工具对数据结构的概念类型的描述称之为抽象数据类型,简单地说是指一个数学模型以及定义在该模型的一组操作。ADT包括数据数据元素,数据关系以及相关的操作。即ADT{ 数据...
  • 从本质讲,特征工程一个表示和展现数据的过程。 实际中,特征工程旨在去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解问题与预测模型之间的关系 结构化数据 结构化数据类型可以看做关系型数据库的...
  • 结构是一种非常常见的数据结构,并且在很多场景下也被用到。其实栈结构跟数组结构很像,只是在数组的基础...数据结构——栈一、什么是栈二、栈结构的方法三、用代码实现一个栈结构(1)创建一个构造函数(2)实现push
  • 什么是数据的结构

    千次阅读 2016-12-26 09:05:03
    例如链表就是让前一个数据知道自己的前后的数据是什么。 树就是让数据知道自己下一层子孙是谁。 这就是数据的结构化。通过联系有了先后的关系,形成了强关系的集合。 而文件可以看成集合,就是一大堆数据放在里面,...
  • 结构化数据是什么

    千次阅读 2017-06-23 15:28:47
    结构化数据主要指那些无法用固定结构来逻辑表达实现的数据,简单来说就是用户散落在论坛、微博、微信或其他渠道发表的关于产品...从形态,非结构化数据主要包含三大块:第一文本文字;第二图像、图片等;第
  • SEO基础:什么是结构化数据?

    千次阅读 2019-04-24 14:13:47
    对于那些不知道结构化数据是什么的人:这篇文章将告诉你! 更新:自11.0发布以来,Yoast SEO为您网站的每个文章或页面构建完整的结构化数据图表!图表是一个完整的结构化数据,具有到所有不同部分的明确定义的...
  • 什么是数据结构和算法

    千次阅读 2016-10-13 00:03:20
    以及在此基础为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而 执行的相应操作,这个相应的操作也叫算法。 数据结构 = 个体 + 个体的关系 算法 = 对存储数据的操作 算法 解题的...
  • 在系统总线说有PCI结构,pci到底什么东西?也一种线吗?
  • MVC模型结构是什么

    万次阅读 2015-12-23 13:25:55
    MVC模型(model)、视图(view)、控制(controller)这三个单词的首字母组成。它一种目前广泛流行的应用模型,它的目的实现Web系统的职能分工。 下图所示为MVC模型关系图。其中,模型层实现系统中的业务逻辑...
  • 结构风险在经验风险的基础加上表示模型复杂度的正则项(罚项)。 其中: J(f) 模型的复杂度,模型f越复杂,J(f)值就越大,模型越简单,J(f)值就越小。也就是说,J(f) 对复杂模型的惩罚。为什么说是惩罚...
  • 数据结构中的elemtype、elem是什么

    万次阅读 多人点赞 2018-05-02 16:27:02
    ElemType数据结构的书为了说明问题而用的一个词。它element type(“元素的类型”)的简化体。 因为数据结构是讨论抽象的数据结构和算法的,一种结构中元素的类型不一定整型、字符型、浮点型或者用户...
  • malloc是什么(数据结构

    万次阅读 2014-04-08 10:57:05
    (ElemType*)malloc(Lc.listsize*sizeof(ElemType))谁能帮忙解释一下? 在数据结构抄的,看不懂 尤其是ElemType*那个星号在后面,是什么意思
  • 什么是数据结构和算法?以及怎样学习它?

    千次阅读 多人点赞 2018-09-26 15:22:03
    什么是数据结构什么是算法? 数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 数据结构和算法相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构。 因此,我们无法孤立...
  • 什么是计算机网络体系结构

    千次阅读 2018-12-05 17:45:14
    要说明什么是计算机网络体系结构,可以设想一个最简单的情况:连接在网络的两台计算机要互相传输消息,在这两台计算机间就要有一条传输数据的通路,但只有这一条通路还远远不够比如要传输消息给目的主机总要知道...
  • 数据结构中的elem,elemtype是什么

    千次阅读 多人点赞 2019-10-14 11:41:10
    elem单词element(元素)的缩写,在程序...ElemType数据结构的书为了说明问题而用的一个词。它element type(“元素的类型”)的简化体。 因为数据结构是讨论抽象的数据结构和算法的,一种结构中元素的类型...
  • 数据结构是什么 数据结构+算法=程序 过程解析:发现问题,分析问题并抽象出具体的数据模型(待处理的数据以及数据之间的关系,即数据结构);设计算法,其中包括完成数据表示(将数据以及数据之间的关系存储到...
  • (1)数据结构是什么

    千次阅读 2016-10-21 20:01:45
    数据结构是什么? 当用计算机解决一个实际问题时,需要经过如下步骤: 1)从具体问题抽象出数学模型, 2)选择或设计数学模型的算法, 3)编写程序得到最终结果。 而数据结构是一门研究非数值计算程序设计问题...
  • java中的mvc和三层结构究竟是什么关系

    万次阅读 多人点赞 2016-12-12 17:21:52
    一件事,要知其然往往很简单,要知其所以然通常不是那么容易,就如最近重新巩固spring的过程中,就觉得还有许多...而mvc和三层结构究竟是什么关系,我曾在面试的过程中被人问过几次,也曾仔细的想过、查过这个问题,但
  • 简介 中间层 (Middle Tier)也称作“应用程序服务器层或...它们通过业务规则(可以频繁更改)完成该任务,并由此被封装到在物理与应用程序程序逻辑本身相独立的组件中。请参见客户端层、数据源层。 三层网络结构 指
  • [数据结构]什么是链表?

    千次阅读 2019-07-14 22:52:52
    链表一种物理存储单元非连续、非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现的–百度百科 大致分为单链表和双向链表 1.单链表:每个节点包含两部分,一部分存放数据变量的data,另一部分...
  • 一篇文章讲解了链表的相关知识,并用代码实现了一个链表结构。那么本文将介绍一下另一种特殊的链表结构,叫做 双向链表。 顾名思义,普通的链表都从 head 开始往后遍历...数据结构——双向链表一、什么是双向链表二
  • 服务器结构中的1U 2U 3U是什么意思

    千次阅读 2019-05-15 16:40:26
    服务器结构中的1U 2U 3U是什么意思? ​ U是一种表示服务器外部尺寸的单位。1U就是4.445CM,2U则是2x4.5CM,3U则是3x4.5CM 所谓“1U的PC服务器”,就是外形满足EIA规格、厚度为4.445cm的产品。设计为能放置到19英寸...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,278
精华内容 16,911
关键字:

上是什么结构