LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: top

讨论一下 链表和数组的区别在哪里 !

[复制链接]
 楼主| 发表于 2004-4-6 22:08:40 | 显示全部楼层
感谢关注
发表于 2004-4-7 11:06:29 | 显示全部楼层
数组能够实现随机访问,也就是说能够计算出你要访问单元的地址(不需用户参与)而做到直接访问,所以访问速度快;而链表是属于顺序访问的,得从表头逐个遍历知道你要访问的单元。所以在定位上链表有速度优势,尤其在元素个数大的时候尤其明显,top说的就是这个道理:
如果你测试:申请并遍历10000个元素链表的时间与遍历相同元素的数组的时间,你就会发现时间相差了百倍!(以前测试过一个算法,用链表是1分钟,用数组是4秒钟)。所以这里我的建议是:在编写耗时大的代码时,尽可能不要采用链表!

至于时间是花在“申请”上还是“遍历”上,可能申请上更多?因为我觉得从堆中申请内存这个系统调用会花去更多的时间,而且链表是一个一个单元的malloc的。:confused:
但是数组的一个致命弱点就是direstrait说的插入和删除,这是由数组在内存中顺序存储的特性决定的。举个例子吧,排序的时候需要将元素在内存中捣来捣去,--如果你不用索引的话,而链表只要修改指针就可以了,当元素单元非常大的时候,修改指针显然比倒内存来的快。删除元素就不用说了,呵呵。
各种实现之间的性能差异只有在问题规模大的时候才明显。
发表于 2004-4-7 11:16:03 | 显示全部楼层
最初由 top 发表


从概念上来看,表是一种抽象数据类型;数组是一种具体的数据结构

这个有点不太明白,呵呵
没什么抽象不抽象具体不具体的,呵呵,在你用C语言实现的时候是无差别的
抽象和具体跟性能没什么关系吧:p
发表于 2004-4-8 16:04:54 | 显示全部楼层
最初由 cmandcj 发表
至于时间是花在“申请”上还是“遍历”上,可能申请上更多?因为我觉得从堆中申请内存这个系统调用会花去更多的时间,而且链表是一个一个单元的malloc的。:

一个一个单元申请并不是一定的,完全可以一块一块的申请。举个简单例子,我们学操作系统课的时候,有些自由内存分配的算法实现是用链表来实现的,如果你的目的就是来编写一个类似malloc的东西,怎么可以反过来用它呢?
我们完全可以先划出一片空间,然后维护两个链表,一个是我们的操作链表head,剩下的不用的单元放在另一张链表上headfree,加入节点时只要做一次移动就可以了,而不需要分配,删除一个节点时也不需要额外的释放,只要把这个节点移到headfree里就可以了。
直到headfree为空后,才需要再次划出一块内存。

这样的方法,避免了大量小块内存的申请,变成了几次稍大内存的申请,而且将空间集中了起来,显然可以大大提高申请的效率。

链表的特点是其链式结构,与内存的申请释放并没有直接的联系。
发表于 2004-4-8 18:12:33 | 显示全部楼层
我认为链表和数组个有优点:存在即是合理。
关键还是我们怎么用,用在那里。
 楼主| 发表于 2004-4-9 13:09:08 | 显示全部楼层
数据结构、数据类型和抽象数据类型
    数据结构、数据类型和抽象数据类型,这三个术语在字面上既不同又相近,反映出它们在含义上既有区别又有联系。

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

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



  其中,简单数据类型对应于简单的数据结构;构造数据类型对应于复杂的数据结构;在复杂的数据结构里,允许成分数据本身具有复杂的数据结构,因而,构造数据类型允许复合嵌套;指针类型对应于数据结构中成分数据之间的关系,表面上属简单数据类型,实际上都指向复杂的成分数据即构造数据类型中的数据,因此这里没有把它划入简单数据类型,也没有划入构造数据类型,而单独划出一类。

   数据结构反映数据内部的构成方式,它常常用一个结构图来描述:数据中的每一项成分数据被看作一个结点,通常我们用方框或圆圈表示,成分数据之间的关系用相应的结点之间带箭号的连线表示。如果成分数据本身又有它自身的结构,则结构出现嵌套。这里嵌套还允许是递归的嵌套。由于指针数据的引入,使构造各种复杂的数据结构成为可能。按数据结构中的成分数据之间的关系,数据结构有线性与非线性之分。在非线性数据结构中又有层次与网状之分。 由于数据类型是按照数据结构划分的,因此,一类数据结构对应着一种数据类型。数据类型按照该类型中的数据所呈现的结构也有线性与非线性之分,层次与网状之分。一个数据变量,在高级语言中的类型说明必须是读变量所具有的数据结构所对应的数据类型。

最常用的数据结构是数组结构和记录结构。
  数组结构的特点是:

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

      抽象数据类型的含义在上一段已作了专门叙述。它可理解为数据类型的进一步抽象。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。对于抽象数据类型的描述,除了必须描述它的数据结构外,还必须描述定义在它上面的运算(过程或函数)。抽象数据类型上定义的过程和函数以该抽象数据类型的数据所应具有的数据结构为基础。
 楼主| 发表于 2004-4-9 13:13:01 | 显示全部楼层
最初由 cmandcj 发表
这个有点不太明白,呵呵
没什么抽象不抽象具体不具体的,呵呵,在你用C语言实现的时候是无差别的
抽象和具体跟性能没什么关系吧:p





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

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

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



  其中,简单数据类型对应于简单的数据结构;构造数据类型对应于复杂的数据结构;在复杂的数据结构里,允许成分数据本身具有复杂的数据结构,因而,构造数据类型允许复合嵌套;指针类型对应于数据结构中成分数据之间的关系,表面上属简单数据类型,实际上都指向复杂的成分数据即构造数据类型中的数据,因此这里没有把它划入简单数据类型,也没有划入构造数据类型,而单独划出一类。

   数据结构反映数据内部的构成方式,它常常用一个结构图来描述:数据中的每一项成分数据被看作一个结点,通常我们用方框或圆圈表示,成分数据之间的关系用相应的结点之间带箭号的连线表示。如果成分数据本身又有它自身的结构,则结构出现嵌套。这里嵌套还允许是递归的嵌套。由于指针数据的引入,使构造各种复杂的数据结构成为可能。按数据结构中的成分数据之间的关系,数据结构有线性与非线性之分。在非线性数据结构中又有层次与网状之分。 由于数据类型是按照数据结构划分的,因此,一类数据结构对应着一种数据类型。数据类型按照该类型中的数据所呈现的结构也有线性与非线性之分,层次与网状之分。一个数据变量,在高级语言中的类型说明必须是读变量所具有的数据结构所对应的数据类型。

最常用的数据结构是数组结构和记录结构。
  数组结构的特点是:

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

      抽象数据类型的含义在上一段已作了专门叙述。它可理解为数据类型的进一步抽象。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。对于抽象数据类型的描述,除了必须描述它的数据结构外,还必须描述定义在它上面的运算(过程或函数)。抽象数据类型上定义的过程和函数以该抽象数据类型的数据所应具有的数据结构为基础。
发表于 2004-4-9 13:14:34 | 显示全部楼层
呵呵,当老师老师这么长篇大论的学生可不喜欢
 楼主| 发表于 2004-4-9 15:39:01 | 显示全部楼层
呵呵!

要是站在讲台上讲 几分钟的时间 !
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表