Home About us Products Services Contact us Bookmark
:: wikimiki.org ::
數據結構

數據結構

算法+数据结构=程序
尼古拉斯·沃斯
数据结构(Data Structure)是计算机存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率的算法。数据结构往往同高效的检索算法索引技术有关。 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法程序设计语言的出现,面向对象的程序设计语言就是其中之一。 在计算机科学中,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 “数据结构”作为一门独立的课程在国外是从1968年才开始设立的。 1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。“数据结构”在计算机科学中是一门综合性的专业基础课。数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。数据结构这一门课的内容不仅是一般程序设计(特别是非数值性程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。 计算机是一门研究用计算机进行信息表示和处理的科学。这里面涉及到两个问题:
- 信息的表示
- 信息的处理 而信息的表示和组又直接关系到处理信息的程序的效率。随着计算机的普及,信息量的增加,信息范围的拓宽,使许多系统程序和应用程序的规模很大,结构又相当复杂。因此,为了编写出一个“好”的程序,必须分析待处理的对象的特征及各对象之间存在的关系,这就是数据结构这门课所要研究的问题。众所周知,计算机的程序是对信息进行加工处理。在大多数情况下,这些信息并不是没有组织,信息(数据)之间往往具有重要的结构关系,这就是数据结构的内容。数据的结构,直接影响算法的选择和效率。 计算机解决一个具体问题时,大致需要经过下列几个步骤:首先要从具体问题中抽象出一个适当的数学模型,然后设计一个解此数学模型的算法(Algorithm),最后编出程序、进行测试、调整直至得到最终解答。寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述。计算机算法与数据的结构密切相关,算法无不依附于具体的数据结构,数据结构直接关系到算法的选择和效率。运算是由计算机来完成,这就要设计相应的插入、删除和修改的算法 。也就是说,数据结构还需要给出每种结构类型所定义的各种运算的算法。 数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。 数据元素是数据的基本单位,在计算机程序中通常作为一个整体考虑。一个数据元素由若干个数据项组成。数据项是数据的不可分割的最小单位。有两类数据元素:一类是不可分割的原子型数据元素,如:整数"5",字符 "N" 等;另一类是由多个款项构成的数据元素,其中每个款项被称为一个数据项。例如描述一个学生的信息的数据元素可由下列6个数据项组成。其中的出身日期又可以由三个数据项:"年"、"月"和"日"组成,则称"出身日期"为组合项,而其它不可分割的数据项为原子项。 关键字指的是能识别一个或多个数据元素的数据项。若能起唯一识别作用,则称之为 "主" 关键字,否则称之为 "次" 关键字。 数据对象是性质相同的数据元素的集合,是数据的一个子集。数据对象可以是有限的,也可以是无限的。 数据处理是指对数据进行查找、插入、删除、合并、排序、统计以及简单计算等的操作过程。在早期,计算机主要用于科学和工程计算,进入八十年代以后,计算机主要用于数据处理。据有关统计资料表明,现在计算机用于数据处理的时间比例达到80%以上,随着时间的推移和计算机应用的进一步普及,计算机用于数据处理的时间比例必将进一步增大。 数据结构是指同一数据元素类中各数据元素之间存在的关系。数据结构分别为逻辑结构存储结构物理结构)和数据的运算。数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构。逻辑结构形式地定义为(K,R)(或(D,S)),其中,K是数据元素的有限集,R是K上的关系的有限集。 数据元素相互之间的关系称为结构。有四类基本结构:集合线性结构树形结构图状结构网状结构)。树形结构和图形结构全称为非线性结构。集合结构中的数据元素除了同属于一种类型外,别无其它关系。线性结构中元素之间存在一对一关系,树形结构中元素之间存在一对多关系,图形结构中元素之间存在多对多关系。在图形结构中每个结点的前驱结点数和后续结点数可以任意多个。 数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。它包括数据元素的表示和关系的表示。数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。 数据结构中,逻辑上(逻辑结构:数据元素之间的逻辑关系)可以把数据结构分成线性结构和非线性结构。线性结构的顺序存储结构是一种随机存取的存储结构,线性表的链式存储结构是一种顺序存取的存储结构。线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。逻辑结构与数据元素本身的形式、内容、相对位置、所含结点个数都无关。 算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数据的运算是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新的排序等。 数据结构的形式定义为:数据结构是一个二元组: Data-Structure=(D,S) 其中:D是数据元素的有限集,S是D上关系的有限集。 数据结构不同于数据类型,也不同于数据对象,它不仅要描述数据类型的数据对象,而且要描述数据对象各元素之间的相互关系。 数据类型是一个值的集合和定义在这个值集上的一组操作的总称。数据类型可分为两类:原子类型、结构类型。一方面,在程序设计语言中,每一个数据都属于某种数据类型。类型明显或隐含地规定了数据的取值范围、存储方式以及允许进行的运算。可以认为,数据类型是在程序设计中已经实现了的数据结构。另一方面,在程序设计过程中,当需要引入某种新的数据结构时,总是借助编程语言所提供的数据类型来描述数据的存储结构。 计算机中表示数据的最小单位是二进制数的一位,叫做位。我们用一个由若干位组合起来形成的一个位串表示一个数据元素,通常称这个位串为元素或结点。当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域。元素或结点可看成是数据元素在计算机中的映象。 一个软件系统框架应建立在数据之上,而不是建立在操作之上。一个含抽象数据类型的软件模块应包含定义、表示、实现三个部分。 对每一个数据结构而言,必定存在与它密切相关的一组操作。若操作的种类和数目不同,即使逻辑结构相同,数据结构能起的作用也不同。 不同的数据结构其操作集不同,但下列操作必不可缺: #结构的生成; #结构的销毁; #在结构中查找满足规定条件的数据元素; #在结构中插入新的数据元素; #删除结构中已经存在的数据元素; #遍历。 抽象数据类型:一个数学模型以及定义在该模型上的一组操作。抽象数据类型实际上就是对该数据结构的定义。因为它定义了一个数据的逻辑结构以及在此结构上的一组算法。抽象数据类型可用以下三元组表示:(D,S,P)。D是数据对象,S是D上的关系集,P是对D的基本操作集。ADT的定义为: ADT 抽象数据类型名 ADT 抽象数据类型名; 抽象数据类型有两个重要特性:
- 数据抽象
  - 用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。
- 数据封装
  - 将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。

常用的数据结构


- 离散结构
  - 集合
    - 并查集
    - 字典
      - 有序字典
- 线性结构
  - 线性表
    - 顺序表
    - 链表(鍵結串列
      - 单链表
      -
- 静态单链表
      -
- 跳表 (Skip list)
      - 双链表
      - 循环链表
      -
- 单循环链表
      -
- 双循环链表
  - 散列表(哈希表雜湊表)
  - (堆疊)
  - 队列佇列
    - 链队列
    - 循环队列
    - 优先队列 (有时使用来实现)
  - 双端队列
  -
  - 跳跃表
- 非线性结构
  - 数组
    - 二维数组矩阵
      - 稀疏矩阵
  - 广义表
  - 形结构
    - 二叉树二元樹
      - 哈夫曼树最优二叉树
      - 线索二叉树
      - 二叉排序树
      -
- 平衡二叉树
      -
  - AVL树
      -
  - 红黑树
      -
    - AA树
      -
  - 伸展树
      -
- 线段树
      -
      -
- 二叉堆
      -
- 二项堆
      -
- 斐波纳契堆
      -
- 配对堆
    - 森林
    - B树
      - 2-3-4树
    - 剖析树
    - 后缀树
    - Trie
    - 四叉树 (Quadtree)
    - 八叉树 (Octree)
    - kd树
    - 生成树
      - 最小生成树
  - 状结构(状结构)
    - 有向图
      - 有向网 (带权有向图)
      - 有向无环图 (DAG)
      -
- AOE网 (带权有向无环图)
      -
- AOV网
    - 无向图
      - 无向网 (带权无向图)
    - 连通图
      - 强连通图
    - 完全图
    - 稀疏图
    - 稠密图
    - 表示方法
      - 邻接矩阵
      - 邻接表
      - 十字链表
      - 邻接多重表
- 其他数据结构
  - 标签联合
  - 联合
  - 框架
  - 数据库和“表”

相关条目


- 算法
- 计算机科学
- 计算机科学课程列表

参考文献


- Cliford A. Shaffer/张铭等译:数据结构与算法分析(C++版,第二版),电子工业出版社 ISBN 7-5053-7646-2/TP.4425 [http://www.china-pub.com/computers/common/info.asp?id=6469]
- 严蔚敏 吴伟民著:数据结构(C语言版),清华大学出版社 ISBN 7-302-02368-9/TP.1185 [http://www.welan.com/html/00/32100.Html] Category:数据结构 ja:データ構造 ko:자료구조 th:โครงสร้างข้อมูล

尼古拉斯·沃斯

尼古拉斯·沃斯(Niklaus Wirth,1934年2月15日—),生於瑞士溫特圖爾,是瑞士計算機科學家。 從1963年1967年,他成為斯坦福大学的計算機科學部助理教授,之後又在苏黎世大学擔當相同的職位。1968年,他成為ETH信息学教授,又往施乐帕洛阿尔托研究中心進修了兩年。 他是好幾种編程語言的主設計師:
- Algol W
- Modula
- Pascal
- Modula-2
- Oberon 他亦是Euler語言的發明者之一。1984年他因發展了這些語言而獲图灵奖。他亦是Lilith電腦Oberon系統的設計和執行隊伍的重要成員。 他的文章Program Development by Stepwise Refinement視為軟體工程中的經典之作。他寫的一本書的書名Algorithms + Data Structures = Programs算法+数据结构=程式)是計算機科學的名句。 歐洲人通常都將他的名字讀得正確,讀作“Nih-klaus Virt”;但美國人通常讀成“Nickles Worth”近似的音。於是有人便說,歐洲人傳址呼叫他,美國人傳值呼叫他。

外部鏈結


- [http://www.cs.inf.ethz.ch/~wirth/ 他的主頁]
- [http://www.swissdelphicenter.ch/en/niklauswirth.php Pascal and its Successors]
- [http://www.acm.org/classics/dec95 Program Development by Stepwise Refinement], Communications of the ACM, Vol. 14, No. 4, Aprile 1971, pp. 221-227 category:瑞士人 category:程序員

数据

数据是可定义为意义的实体,它涉及到事物的存在形式。它是关于事件的一组离散的客观的事实描述,是构成信息知识的原始材料。数据可分为模拟数据数字数据两大类。数据指计算机加工的“原料”,如图形、声音、文字、数、字符和符号等。
-
ja:データ ko:데이터 simple:Data

程序设计语言

程序设计语言,是一组用来定义计算机程序的语法规则。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。 程序设计语言原本是被设计成专门使用在计算机上的,但它们也可以用来定义算法或者数据结构。正是因为如此,程序员才会试图使程序代码更容易阅读。 设计语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为在当今所有的计算都需要程序设计语言才能完成。 在过去的几十年间,大量的程序设计语言被发明、被取代、被修改或组合在一起。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常大,而有许多语言并对新手来说太难学;还有,不同程序之间的运行成本()各不相同。 有许多用于特殊用途的语言,只在特殊情况下使用。例如,PHP专门用来显示网页Perl更适合文本处理;C语言被广泛用于操作系统编译器的开发(所谓的系统编程)。 高级程序设计语言(也称高级语言)的出现使得计算机程序设计语言不再过度地倚赖某种特定的机器或环境。这是因为高级语言在不同的平台上会被编译成不同的机器语言,而不是直接被机器执行。最早出现的编程语言之一FORTRAN的一个主要目标,就是实现平台独立。 虽然大多数的语言可以既被编译()又被解译(),但大多数只在一种情况下能够良好运行。在一些编程系统中,程序要经过几个阶段的编译,一般而言,后阶段的编译往往更接近机器语言。这种常用的使用技巧最早在1960年代末用于BCPL,编译程序先编译一个叫做“0代码”的转换程序(),然后再使用虚拟器转换到可以运行于机器上的真实代码。这种成功的技巧之后又用于Pascal和P-code,以及Smalltalk和二进制码,虽然在很多时候,中间过渡的代码往往是解译,而不是编译的。 如果所使用的翻译的机制是将所要翻译的程序代码作为一个整体翻译,并之后运行内部格式,那么这个翻译过程就被成为编译。因此,一个编译器是一个将人可阅读的程序文本(叫做源代码)作为输入的数据,然后输出可执行文件()。所输出的可执行文件可以是机器语言,由计算机的中央处理器直接运行,或者是某种模拟器的二进制代码。 如果程序代码是在运行时才即时翻译,那么这种翻译机制就被称作解译。经解译的程序运行速度往往比编译的程序慢,但往往更具灵活性,因为它们能够与执行环境互相作用。参见解译语言

特点

每一种程序设计语言可以被看作是一套包含语法词汇含义的正式规范。 这些规范通常包括:
- 数据和数据结构
- 指令及流程控制
- 引用机制和重用
- 设计哲学 大多数被广泛使用或经久不衰的语言,拥有负责标准化的组织,经常会晤来创造及发布该语言的正式定义,并讨论扩展或贯彻现有的定义。

数据和数据结构

现代计算机内部的数据都只以二元方式储存,即开-关模式()。现实世界中代表信息的各种数据,例如名字、银行账号、度量以及同样低端的二元数据,都经由程序设计语言整理,成为高端的概念。 一个程序中专门处理数据的那个系统被称为程序语言的型态系统();对型态系统的研究和设计被称为型态理论()。语言可以被分为静态型态系统(),例如C++Java,和动态型态系统(),例如Lisp,JavaScript,Tcl和Prolog。前者可被进一步分为包含宣告型态()的语言,即每一个变量和函数的型态都清楚地宣告,或type-inferred语言(例如MUMPS,ML)。 大多数语言还能够在内置的型态基础上组合出复杂的数据结构型态(使用数组,列表,堆栈,文件等等)。面向对象语言(,又译作“物件导向语言”)允许程序员定义新的数据型态,即“对象”或“物件”(),以及运行于该对象的函数()和方法()。 除了何时以及如何确定表达式和型态的联系,另外一个重要的问题就是语言到底定义了哪些型态,以及允许哪些型态作为表达式的值。诸如C编程语言之类的低端语言允许程序命名内存位置、内存区域以及编译时的常量;ANSI C甚至允许表达式返回结构值()。功能性的语言一般允许变量直接使用运行时计算出的值,而不是指出该值可能储存的内存地址。

指令及流程控制

一旦数据被确定,机器必须被告知如何对这些数据进行处理。较简单的指令可以使用关键字或定义好的语法结构来完成。不同的语言利用序列系统来取得或组合这些语句。除此之外,一个语言中的其他指令也可以用来控制处理的过程(例如分支、循环等)。

引用机制和重用

引用的中心思想是必须有一种间接设计储存空间的方法。最常见的方法是通过命名变量。根据不同的语言,进一步的引用可以包括指向其他储存空间的指针。还有一种类似的方法就是命名一组指令。大多数程序设计语言使用宏调用、过程调用或函数调用。使用这些代替的名字能让程序更灵活,并更具重用性。

程序设计语言的历史

二十世纪四十年代当计算机刚刚问世的时候,程序员必须手动控制计算机。当时的计算机十分昂贵,唯一想到利用程序设计语言来解决问题的人是德国工程师楚泽()。 几十年后,计算机的价格大幅度下跌,而计算机程序也越来越复杂。也就是说,开发时间已经远比运行时间来得宝贵。 于是,新的集成、可视的开发环境越来越流行。它们减少了所付出的时间、金钱(以及脑细胞)。只要轻敲几个键,一整段代码就可以使用了。这也得益于可以重用的程序代码库。

常见的程序设计语言


- APLA+J
- Ada
- 汇编语言
- AWK
- BasicFortran
- VBScript
- Brainfuck
- CC++
- C#
- Clipper
- COBOL
- dBase
- PASCALDelphi
- Forth
- FoxPro
- F#
- Fava
- IDL
- Java
- JavaScript
- J#
- LISP
- LOGO
- Modula
- Perl
- PHP
- PL/I
- Prolog
- Python
- Ruby
- Scheme
- Smalltalk
- SQL
- Tcl/Tk
- Visual Basic
- Visual FoxPro
- XML

参见


- 计算机科学课程列表
- 程序设计语言列表
- 编译器
- Hello World程序
- 脚本语言
- 維基程序員 category:人工語言 ja:プログラミング言語

面向对象的程序设计

面向对象的程序设计(Object Oriented Programming,简称OOP,亦有譯為物件導向),指一种程序设计范型,同时也是是一种程序开发的方法论。它的最大特点是能够大幅度的提高软件项目的成功率,减少日后的维护费用,提高软件的可移植性和可靠性。 它的特征主要包括以下几个方面:
- 对象的使用—对象的概念被广泛的使用在从建模到构建程序的各个方面。
- 抽象化—将各种独立的操作分解成为可以用命名区分的单元。
- 封装性—不同的操作具有不同的作用范围。
- 多态性—对于不同数据类型的相似操作使用相同的命名。
- 继承性—类可以被继承,从而实现不同层次的对象。 抽象化是面向對象的一个重要特征但是并不是它所独有的特征。重用是面向對象的一个重要优点。 当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发范式。在这一方面,我们必须了解更多关于面向对象的分析(Object Oriented Analysis,简称OOA)和面向对象的设计(Object Oriented Design,简称OOD)方面的知识。

基本理论

继承性

可以把同一派生分枝的通用性方法分配在合理的祖先类层次上。父类的属性,子类会无条件继承。

封装性

隐藏具体实现的细节,有利于程序的局部化,进而减小程序出错的可能性和增强可维护性。

多态性

为后代类行为方法的变异提供了一种可能性,即使是从同一祖先派生下来的行为,也可以发生差异化,从而增强了系统的灵活性。

面向对象的语言

支持部分或绝大部分面向对象特性的语言即可称为基于对象的或面向对象的语言。 早期,完全面向对象的语言主要包括Smalltalk等语言,目前较为流行的语言中有JavaC#Eiffel等。随着软件工业的发展,比较早的面向过程的语言在近些年的发展中也纷纷吸收了许多面向对象的概念,比如C->C++BASIC->Visual Basic->Visual Basic.NETPascal->Object PascalAda->Ada95

基于类的模式

基于对象的模式

历史

相关书籍

相关内容

外部链接

Category:編程典範 Category:面向对象的程序设计 ja:オブジェクト指向 ms:Pengaturcaraan Berorientasikan Objek th:การเขียนโปรแกรมเชิงวัตถุ

算法

Category:代数 Category:算法 算法是指完成一个任务所需要的具体步骤和方法。也就是说给定初始状态或输入数据,经过计算机程序的有限次运算,能够得出所要求或期望的终止状态或输出数据。 算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度时间复杂度来衡量。

算法的历史

“算法”的中文名稱出自周髀算經;而英文名稱 Algorithm 来自于9世纪波斯数学家比阿勒·霍瓦里松的名字al-Khwarizmi,因為比阿勒·霍瓦里松在数学上提出了算法这个概念。“算法”原为"algorism",意思是阿拉伯数字的运算法则,在18世纪演变为"algorithm"。 第一次编写算法是Ada Byron于1842年巴贝奇分析机编写求解解伯努利方程程序,因此Ada Byron被大多数人认为是世界上第一位程序员。因为巴贝奇(Charles Babbage)未能完成他的巴贝奇分析机,这个算法未能在巴贝奇分析机上执行。 因为"well-defined procedure"缺少数学上精确的定义,19世纪20世纪早期的数学家、逻辑学家在定义算法上出现了困难。20世纪的英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。图灵机的出现解决了算法定义的难题,图灵的思想对算法的发展起到了重要的作用。

算法的特征

#输入,一个算法必须有零个或多个输入量。 #输出,一个算法应有一个或多个输出量,输出量是算法计算的结果。 #确定性,算法的描述必须无歧义,以保证算法的执行结果是确定的。 #有穷性,算法必须在有限步骤内实现。注:此处“有限”不同于数学概念的“有限”,天文数字般的有限对于实际问题并无意义。 #有效性(亦称可行性),能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。

形式化算法

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。 一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。

算法的复杂度

算法的时间复杂度

算法的时间复杂度是指算法需要消耗的时间资源。一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度也因此记做 T(n)=O(f(n)) 因此,问题的规模n越大,算法执行的时间的增长率与f(n)的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

算法的空间复杂度

算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

非確定性多項式時間(NP)

算法的实现

算法不单单可以用计算机程序来实现,也可以在神经网络电路或者机械设备上实现。

例子一

这是算法的一个简单的例子。 我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成是一颗豆子的大小,可以将下面的算法形象地称为“捡豆子”: # 首先将第一颗豆子放入口袋中。 # 从第二颗豆子开始检查,直到最后一颗豆子。如果正在检查的豆子比口袋中的还大,则将它捡起放入口袋中,同时丢掉原先口袋中的豆子。 # 最后口袋中的豆子就是所有的豆子中最大的一颗。 下面是一个形式算法,用近似于编程语言伪代码表示 给定:一个数列“list",以及数列的长度"length(list)" largest = list[1] for counter = 2 to length(list): if list[counter] > largest: largest = list[counter] print largest 符号说明:
- = 用于表示赋值。即:右边的值被赋予给左边的变量。
- List[counter]用于表示数列中的第counter项。例如:如果counter的值是5,那么List[counter]表示数列中的第5项。
- <= 用于表示“小于或等于”。

例子二

求两个自然数的最大公约数 设两个变量 M 和 N #如果 M < N,则交换 M 和 N #M 被 N 除,得到余数 R #判断 R=0,正确则 N 即为“最大公约数”,否则下一步 #将 N 赋值给 M,将 R 赋值给 N,重做第一步。 用“BASIC 代码”表示-- If M < N Then Swap M,N Do While R <> 0 R = M Mod N M = N N = R Loop Print N

算法设计和分析的基本方法


- 分治法
- 动态规划
- 贪心法(亦作饕餮法

算法的分类


- 基本算法
  - 枚举
  - 搜索
    - 深度优先搜索
    - 广度优先搜索
    - 启发式搜索
    - 遗传算法
- 数据结构的算法
- 数论与代数算法
- 计算几何的算法
  - 凸包算法
- 图论的算法
  - 哈夫曼编码
  - 树的遍历
  - 最短路径算法
  - 最小生成树算法
  - 最小树形图
  - 网络流算法
  - 匹配算法
- 动态规划
- 其他
  - 数值分析
  - 加密算法
  - 排序算法
  - 检索算法
  - 随机化算法
  - 关于并行算法,请参阅并行计算一文。

参见


- 计算机科学课程列表 ja:アルゴリズム ko:알고리즘 th:อัลกอริทึม

集合

集合(或簡稱集)是基本的数学概念,它是集合论的研究对象。最簡單的說法,即是在最原始的集合論─朴素集合論─中的定義,集合就是“一堆東西”。集合裡的“東西”,叫作元素。若然 x 是集合 A 的元素,記作 xA。 集合是现代数学中一个重要的基本概念。集合论的基本理论直到十九世纪末才被创立,现在已经是数学教育中一个普遍存在的部分,在小学时就开始学习了。这里对被数学家们称为"直观的"或"朴素的"集合论进行一个简短而基本的介绍;更详细的分析可见朴素集合论。对集合进行严格的公理推导可见公理集合论

导言

非正式的,一个集合就是将几个对象适当归类而作为一个整体。集合中的对象称作元素或成员。集合中的元素可以是任何东西:数字,人,字母,别的集合,等等。集合通常表示为大写字母 ABC,等等。两个集合 AB 相等,写作 A = B,如果它们有相同的元素。

集合的表示


- 集合可以用文字描述,比如: :A = 大于零的前三个自然数 :B = 红色、白色、蓝色和绿色
- 集合的另一种表示方法是在大括号中列出其元素,比如: :C = :D = 尽管两个集合有不同的表示,它们仍可能是相同的。比如:上述集合中,A = CB = D,因为它们正好有相同的元素。 元素列出的顺序不同,或者元素列表中有重复,都没有关系。比如:这三个集合 , 和 是相同的,同样因为它们有相同的元素。
- 集合在不严格的意义下也可以通过草图来表示,更多信息,请见文氏图

集合的元素个数

上述每一个集合都有确定的元素个数;比如:集合 A 有三个元素,而集合 B 有四个。 集合可以没有元素。这样的集合叫做空集,用符号 \varnothing 表示。比如:在2004年,集合 A 是所有住在月球上的人,它没有元素,则 A = \varnothing。就像数字零,看上去微不足道,而在数学上,空集非常重要。更多信息请看空集。 集合也可以有无穷多个元素。比如:自然数的集合是无穷大的。关于无穷大和集合的大小的更多信息请见集合的

子集

如果集合 A 的所有元素同时都是集合 B 的元素,则 A 称作是 B 的子集,写作 AB。若 AB 的子集,且 A 不等于 B,则 A 称作是 B 的真子集,写作 A ⊂ B 举例: :
- 所有男人的集合是所有人的集合的真子集。 :
- 所有自然数的集合是所有整数的集合的真子集。 :
-  ⊂  :
-  ⊆  空集是所有集合的子集,而所有集合都是其本身的子集: :
- \varnothingA :
- AA 更多信息,请见子集

并集

有多种方法通过现有集合来构造新的集合。 两个集合可以相"加"。AB 的并集,写作 A ∪ B,是或属于 A 的、或属于 B 的所有元素组成的集合。 子集 举例: :
-  ∪  = :
-  ∪  = :
-  ∪  = 并集的一些基本性质 :
- A ∪ B   =   B ∪ A :
- A  ⊆  A ∪ B :
- A ∪ A   =  A :
- A ∪ \varnothing   =  A 更多信息,请见并集.

交集

一个新的集合也可以通过两个集合"共"有的元素来构造。AB 的交集,写作 A ∩ B,是既属于 A 的、又属于 B 的所有元素组成的集合。 若 A ∩ B  =  \varnothing,则 AB 称作不相交。 并集 举例: :
-  ∩  = \varnothing :
-  ∩  = :
-  ∩  = 交集的一些基本性质 :
- A ∩ B   =   B ∩ A :
- A ∩ B   ⊆   A :
- A ∩ A   =   A :
- A ∩ \varnothing   =   \varnothing 更多信息,请见交集

补集

两个集合也可以相"减"。AB 中的相对补集,写作 B − A,是属于 B 的、但不属于 A 的所有元素组成的集合。 在特定情况下,所讨论的所有集合是一个给定的全集 U 的子集。这样, U − A 称作 A 的绝对补集,或简称补集,写作 A′。 全集 补集可以看作两个集合相减,有时也称作差集。 举例: :
-  −  = :
-  −  = :
-  −  = \varnothing :
- 若 U 是整数集,则奇数的补集是偶数 补集的基本性质: :
- A ∪ A′ = U :
- A ∩ A′ = \varnothing :
- (A′)′ = A :
- A − B = A ∩ B′ 更多信息,请见补集

公理集合論

把集合看作“一堆東西”會得出所謂罗素悖论。为解决罗素悖论,數學家提出公理集合論。在公理集合论中,集合是一个不加定义的概念。

在更深層的公理化数学中,集合仅仅是一种特殊的,是“良性类”,是能够成为其它类的元素的类。 类区分为两种:一种是可以顺利进行类运算的“良性类”,我们把这种“良性类”称为集合;另一种是要限制运算的“本性类”,对于本性类,类运算是并不都能进行的。 定义 类A如果满足条件“\exists B(A\in B)”,则称类A为一个集合(简称为集),记为Set(A)。否则称为本性类。 这说明,一个集合可以作为其它类的元素,但一个本性类却不能成为其它类的元素。因此可以理解为“本性类是最高层次的类”。 参见:公理化数学 -- 类的理论 -- 罗素公理体系 -- 集合代数 category:集合论 category:数据结构 ja:集合 ko:집합

集合

集合(或簡稱集)是基本的数学概念,它是集合论的研究对象。最簡單的說法,即是在最原始的集合論─朴素集合論─中的定義,集合就是“一堆東西”。集合裡的“東西”,叫作元素。若然 x 是集合 A 的元素,記作 xA。 集合是现代数学中一个重要的基本概念。集合论的基本理论直到十九世纪末才被创立,现在已经是数学教育中一个普遍存在的部分,在小学时就开始学习了。这里对被数学家们称为"直观的"或"朴素的"集合论进行一个简短而基本的介绍;更详细的分析可见朴素集合论。对集合进行严格的公理推导可见公理集合论

导言

非正式的,一个集合就是将几个对象适当归类而作为一个整体。集合中的对象称作元素或成员。集合中的元素可以是任何东西:数字,人,字母,别的集合,等等。集合通常表示为大写字母 ABC,等等。两个集合 AB 相等,写作 A = B,如果它们有相同的元素。

集合的表示


- 集合可以用文字描述,比如: :A = 大于零的前三个自然数 :B = 红色、白色、蓝色和绿色
- 集合的另一种表示方法是在大括号中列出其元素,比如: :C = :D = 尽管两个集合有不同的表示,它们仍可能是相同的。比如:上述集合中,A = CB = D,因为它们正好有相同的元素。 元素列出的顺序不同,或者元素列表中有重复,都没有关系。比如:这三个集合 , 和 是相同的,同样因为它们有相同的元素。
- 集合在不严格的意义下也可以通过草图来表示,更多信息,请见文氏图

集合的元素个数

上述每一个集合都有确定的元素个数;比如:集合 A 有三个元素,而集合 B 有四个。 集合可以没有元素。这样的集合叫做空集,用符号 \varnothing 表示。比如:在2004年,集合 A 是所有住在月球上的人,它没有元素,则 A = \varnothing。就像数字零,看上去微不足道,而在数学上,空集非常重要。更多信息请看空集。 集合也可以有无穷多个元素。比如:自然数的集合是无穷大的。关于无穷大和集合的大小的更多信息请见集合的

子集

如果集合 A 的所有元素同时都是集合 B 的元素,则 A 称作是 B 的子集,写作 AB。若 AB 的子集,且 A 不等于 B,则 A 称作是 B 的真子集,写作 A ⊂ B 举例: :
- 所有男人的集合是所有人的集合的真子集。 :
- 所有自然数的集合是所有整数的集合的真子集。 :
-  ⊂  :
-  ⊆  空集是所有集合的子集,而所有集合都是其本身的子集: :
- \varnothingA :
- AA 更多信息,请见子集

并集

有多种方法通过现有集合来构造新的集合。 两个集合可以相"加"。AB 的并集,写作 A ∪ B,是或属于 A 的、或属于 B 的所有元素组成的集合。 子集 举例: :
-  ∪  = :
-  ∪  = :
-  ∪  = 并集的一些基本性质 :
- A ∪ B   =   B ∪ A :
- A  ⊆  A ∪ B :
- A ∪ A   =  A :
- A ∪ \varnothing   =  A 更多信息,请见并集.

交集

一个新的集合也可以通过两个集合"共"有的元素来构造。AB 的交集,写作 A ∩ B,是既属于 A 的、又属于 B 的所有元素组成的集合。 若 A ∩ B  =  \varnothing,则 AB 称作不相交。 并集 举例: :
-  ∩  = \varnothing :
-  ∩  = :
-  ∩  = 交集的一些基本性质 :
- A ∩ B   =   B ∩ A :
- A ∩ B   ⊆   A :
- A ∩ A   =   A :
- A ∩ \varnothing   =   \varnothing 更多信息,请见交集

补集

两个集合也可以相"减"。AB 中的相对补集,写作 B − A,是属于 B 的、但不属于 A 的所有元素组成的集合。 在特定情况下,所讨论的所有集合是一个给定的全集 U 的子集。这样, U − A 称作 A 的绝对补集,或简称补集,写作 A′。 全集 补集可以看作两个集合相减,有时也称作差集。 举例: :
-  −  = :
-  −  = :
-  −  = \varnothing :
- 若 U 是整数集,则奇数的补集是偶数 补集的基本性质: :
- A ∪ A′ = U :
- A ∩ A′ = \varnothing :
- (A′)′ = A :
- A − B = A ∩ B′ 更多信息,请见补集

公理集合論

把集合看作“一堆東西”會得出所謂罗素悖论。为解决罗素悖论,數學家提出公理集合論。在公理集合论中,集合是一个不加定义的概念。

在更深層的公理化数学中,集合仅仅是一种特殊的,是“良性类”,是能够成为其它类的元素的类。 类区分为两种:一种是可以顺利进行类运算的“良性类”,我们把这种“良性类”称为集合;另一种是要限制运算的“本性类”,对于本性类,类运算是并不都能进行的。 定义 类A如果满足条件“\exists B(A\in B)”,则称类A为一个集合(简称为集),记为Set(A)。否则称为本性类。 这说明,一个集合可以作为其它类的元素,但一个本性类却不能成为其它类的元素。因此可以理解为“本性类是最高层次的类”。 参见:公理化数学 -- 类的理论 -- 罗素公理体系 -- 集合代数 category:集合论 category:数据结构 ja:集合 ko:집합

字典

字典是為字詞提供音韻、意思解釋、例句、用法等等的工具書。在西方,是沒有字典的概念,全是中國獨有的。 字典收字為主,亦會收詞。詞典或辭典收詞為主,也會收字。為了配合社會發展需求,詞典收詞數量激增並發展出不同對象、不同行業及不同用途的詞典。隨著吸收百科全書的元素,更有百科辭典的出現。

歷史

德意志語言正字大詞典 東方最早的字典可算是《尔雅》,成書時期大約在漢朝之前,因為《爾雅》把字分類並作出解釋,儒家學者把《爾雅》歸類為訓詁。 及後,大約在公元30年-124年,漢朝許慎編寫說文解字,創立了六書理論,制定了中文字部首的基礎,是字書中的佼佼者。 1190年,即西夏乾佑庚戍二十一年,黨項人骨勒茂才完成了西夏的第一部西夏文中文雙語字典-《番漢合時掌中珠》,成為考古學家翻譯西夏文的依據。 在1716年(康熙五十五年),第一部正名為字典的《康熙字典》正式面世。當中除了列舉字的出處外,還羅列《唐韻》、《廣韻》、《集韻》、《韻會》、《正韻》等等的反切,並對同音切語加以歸併。 1815年,英國傳教士馬禮遜澳門為了翻譯工作,編寫了中國第一部英語學習字典《華英字典》。馬禮遜在倫敦時候,曾經得到一名中國人的教導下學習一年漢語,抵達廣東後,曾翻譯《三字經》及《大學》,並且編寫過漢語語法書籍,所以對中國文化及語言有一定了解。因此在《華英字典》可以找到很多出自《紅樓夢》和《論語》的例句。《華英字典》是世界上第一本英漢-漢英對照的字典,篇幅大內容豐,有豐富的例句及解釋,並收錄大量成語、俗語。1844年衛三畏(Samuel Wells Williams)的《英華韻府歷階》及1847年麥都思(Walter Henry Medhurst)的《英漢字典》都把它當作參照基礎。 1866年,德國傳教士羅存德香港出版一部兩卷本的《英華字典》,可算是香港最早的雙語字典。羅存德在1848年到香港傳福音,於1853年成為香港的中國福音傳道會的主要負責人。他曾編寫過《英話文法小引》及《英華行篋便覽》。 1915年,中華書局出版《中華大字典》。

編纂的理念

規範主義描述主義從來是編纂字典的兩個重要派別。 描述主義者認為人為的規範是很不自然的事情。規範主義者卻認為要保持語言的質素甚至純潔,不應該任意讓人在實際語言的運用中敗壞了語言本身。 在中國,正式使用字典一詞,始於《康熙字典》。根據《說文解字》,典是五帝的書本,神聖尊貴的大冊。其意義在於可以成為典範的書本,規範了字的意義及用法。這就是規範主義的例子。 在西方,字典(dictionary)源於拉丁文中的dictio-(字)或者dict-(說話)。其意義在於收集字詞及慣用語,描述日常語言的運用。這正是描述主義的例子。

編纂的技術

早期字典的編纂是由各地收集文章及口語記錄來作參考。編纂人把這些每一個字詞的資料一筆一筆地抄寫到資料卡上。因為例句不足,往往需要由編寫辭典的專家創造一些例句。由於早期的交通不便,記錄不全,抄寫緩慢,使編纂工作達至數十年,尤其是第一本辭典的編纂工作是十分浩大。 創立了語料庫.根據字詞出現比率建立字頻表,為語言學家及字典編纂人提供客觀的數據,加快編纂速度。

功能

現代的字典都提供了很多功能,其中兩大功能分別是: #以溝通為主,幫助對文字的理解及翻譯 #以知識為主,針對某事物來尋獲知識

字的排序

中文字是表意文字,排列方式正是根據部首。部首在許慎創立時,共有540個,後來不斷歸納淘汰,《辭源》中的部首只剩下240餘個,到了《漢語大辭典》只有200餘個。在1925年之後,部分中文字典開始使用由王雲五發明的四角號碼檢字法,而大部分現代漢語字典的字詞卻跟據普通話音標來排列的。

音標系統

各地民族都為自己的語言發展一套音標系統。中文字的音標系統就是反切。把第一個字的音拼上第二個字的韻,再轉調而成。在書寫的時候不會把音標寫出來。 到了現代,西方詞典都使用國際音標。現代漢語詞典使用普通話的羅馬字母及4聲調符號(汉语拼音)作為音標系統。台灣出版的辭典就以注音符號作為音標系統。 香港的中文辭典仍然附註粵語注音。目前為止,有6套粵語注音的系統各自獨立發展,當中包括: #香港語言學學會 #耶魯 #萬國音標 #廣州 #黃錫凌 #劉錫祥

類別

雙語字典

雙語字典有單向及雙向之分。主要是把外語字詞用母語來解釋,或者把母語的字詞用外語來解釋。雙向雙語字典基本上是兩本單向雙語字典合拼在一起,更同時使用外語及母語作解釋。

學生字典

針對學生學習的要求,字典收詞方面、意思解釋及例句選材方面儘量以容易明白為原則,並且加入插圖幫助解釋。

常見內容

為了提供更多功能,辭典會加入其他內容。例如:地方名稱、常見人名列表、度量衡、其他語言的字母表等等。

形式

字典常常以不同的型態出現。袖珍版本為了方便攜帶。袋裝版本容易放在口袋裡。精簡版本只收錄非常常用的字詞。軟皮版本價錢便宜一點。硬皮版本耐用一點。電子字典方便查詢。網上字典方便連接其他系統。更有發聲字典讓學生容易掌握發音。

主要漢語字典列表


- 韻書
  - 《声类》
  - 《切韻
  - 《廣韻》,宋朝陳彭年等著
  - 《唐韻
  - 《古文四聲韻》,宋朝夏竦等著
  - 《集韻》,宋朝丁度等撰、方成珪考正
  - 《韻會
  - 《正韻
  - 《漢隸字源》
  - 《金石文字辨異》
  - 《韵镜》
  - 《七音略》
  - 《礼部韵略》
  - 《切韵指掌图》
  - 《五音集韵》
  - 《古今韵会举要》
  - 《中原音韵》
  - 《蒙古字韵》
  - 《五方元音》
  - 《音学五书》
  - 《六书音均表》
  - 《诗声类》
  - 《说文声类》
  - 《切韵考》
  - 《成均图》
  - 《十韵汇编》
  - 《五音集韻》,金朝韓道昭著
  - 《古今韻會舉要》,元朝黃公紹編輯、熊忠舉要
  - 《洪武正韻》,明朝樂韶鳳等撰
  - 《俗書刊誤》,明朝焦竑著
  - 《集韻考正》,清朝方成珪
- 字書
  - 《干祿字書》,唐朝顏元孫著
  - 《漢隸字源》,宋朝婁機著
  - 《字鑑》,元朝李文仲著
  - 《六書正》,元朝周伯琦著
  - 《正字通》,明朝康熙戊午17年,張自烈著
  - 《隸辨》,清朝顧藹吉著
  - 《經典文字辨證書》,清朝畢沅著
  - 《增廣字學舉隅》,清朝同治甲戌13年鐵珊著
  - 《宋元以來俗字譜》,民國劉復著 民國
- 字典
  - 《尔雅
  - 《說文解字》,漢朝許慎編著
  - 《训纂篇》
  - 《字林》,晋朝吕忱作
  - 《字统》,后魏杨承庆作
  - 《玉篇》,顾野王作
  - 《一切經音義》,唐朝釋玄應
  - 《字彙》,明朝萬曆年間梅膺祚
  - 《字彙補》,清朝康熙5年,吳任臣著
  - 《方言箋疏》,清朝錢繹撰
  - 《康熙字典》,清朝康熙年間,張玉書及陳廷敬等編
  - 《中華大字典》,陸費逵等編
  - 《新华字典
  - 《漢語大字典
  - 《新部首大字典
  - 《大字源
  - 《中華字海》中華書局印行
  - 《國音字典》中國大辭典編纂處
  - 《同源字典》,王力出版。
  - 《甲骨文字典》,四川辭書出版社。
  - 《[http://humanum.arts.cuhk.edu.hk/Lexis/Lindict/ 林語堂當代漢英詞典]》

主要出版商


- 商務印書館
- 中華書局

著名辭典編纂人物


- 马礼逊
- 羅存德
- 利瑪竇
- 衛三畏
- 麥都思
- 杜登
- 許慎
- 方毅杜亞泉孫硫珍張元濟傅運森
- 王雲五
- 王力
- 舒新城
- 呂叔湘

內部連結


- 詞典
- :en:Académie française
- :en:Dictionnaire de l'Académie française

外部連結


- [http://210.240.232.4/web/Content.asp?ID=49946&Query=6 詞典學]
- [http://www.people.com.cn/BIG5/jiaoyu/8216/36255/36258/2690728.html 呂叔湘先生對漢語詞典編纂事業的重大貢獻]
- [http://www.lib.nthu.edu.tw/library/department/ref/resources/referencetools.htm 國立清華大學圖書館]
- [http://www.de-han.org/desino/thoat/thoathan.htm 漢字文化圈的脫漢運動] category:工具書 category:字典 ja:辞典 ko:사전 ms:Kamus simple:Dictionary th:พจนานุกรม

线性表

线性表(Linear List)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列。 其中:
- 数据元素的个数n定义为表的长度 = "list".length() ("list".length() = 0(表里没有一个元素)时称为空表)
- 将非空的线性表(n>=0)记作:(a[0],a[1],a[2],…,a[n-1])
- 数据元素a[i](0≤i≤n-1)只是个抽象符号,其具体含义在不同情况下可以不同 一个数据元素可以由若干个数据项组成。数据元素称为记录,含有大量记录的线性表又称为文件。这种结构具有下列特点:存在一个唯一的没有前驱的(头)数据元素;存在一个唯一的没有后继的(尾)数据元素;此外,每一个数据元素均有一个直接前驱和一个直接后继数据元素。   

线性表的存储结构


- 顺序表
- 链表
  - 单链表
    - 动态单链表
    - 静态单链表
  - 双链表
  - 循环链表
    - 单循环链表
    - 双循环链表

参见


- 数据结构
- 链表
- 顺序表
- 数组
-