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

算法

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:อัลกอริทึม

程序设计语言

程序设计语言,是一组用来定义计算机程序的语法规则。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。 程序设计语言原本是被设计成专门使用在计算机上的,但它们也可以用来定义算法或者数据结构。正是因为如此,程序员才会试图使程序代码更容易阅读。 设计语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为在当今所有的计算都需要程序设计语言才能完成。 在过去的几十年间,大量的程序设计语言被发明、被取代、被修改或组合在一起。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常大,而有许多语言并对新手来说太难学;还有,不同程序之间的运行成本()各不相同。 有许多用于特殊用途的语言,只在特殊情况下使用。例如,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:อัลกอริทึม

数据

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

集合

集合(或簡稱集)是基本的数学概念,它是集合论的研究对象。最簡單的說法,即是在最原始的集合論─朴素集合論─中的定義,集合就是“一堆東西”。集合裡的“東西”,叫作元素。若然 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:집합

线性表

线性表(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)只是个抽象符号,其具体含义在不同情况下可以不同 一个数据元素可以由若干个数据项组成。数据元素称为记录,含有大量记录的线性表又称为文件。这种结构具有下列特点:存在一个唯一的没有前驱的(头)数据元素;存在一个唯一的没有后继的(尾)数据元素;此外,每一个数据元素均有一个直接前驱和一个直接后继数据元素。   

线性表的存储结构


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

参见


- 数据结构
- 链表
- 顺序表
- 数组
- 队列
- 堆栈
- 广义表 category:数据结构

顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

存储结构

/
- 线性表的动态分配顺序存储结构
- / #define LIST_INIT_SIZE 10 /
- 线性表存储空间的初始分配量
- / #define LIST_INCREMENT 2 /
- 线性表存储空间的分配增量
- / typedef struct SqList;

基本操作

/
- 顺序表示的线性表的基本操作(12个)
- / void InitList(SqList
- L) /
- 算法2.3
- / void DestroyList(SqList
- L) void ClearList(SqList
- L) Status ListEmpty(SqList L) int ListLength(SqList L) Status GetElem(SqList L,int i,ElemType
- e) int LocateElem(SqList L,ElemType e,Status(
- compare)(ElemType,ElemType)) Status PriorElem(SqList L,ElemType cur_e,ElemType
- pre_e) Status NextElem(SqList L,ElemType cur_e,ElemType
- next_e) Status ListInsert(SqList
- L,int i,ElemType e) Status ListDelete(SqList
- L,int i,ElemType
- e) void ListTraverse(SqList L,void(
- vi)(ElemType
- )) Category:数据结构

链表

链表是在计算机内存中以指针保持互相连接的形式保存的线性表。 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。 常用的链表有:单向链表双向链表循环链表Category:数据结构 ja:線形リスト ko:연결 리스트

单链表

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。 Image:Link.png

动态单链表

单向链表的数据结构可以分为两部分:数据域和指针域,数据域存储数据,指针域指向下一个储存节点的地址。 /
- 线性表的单链表存储结构
- / typedef struct LNodeLNode,
- LinkList; /
- 带有头结点的单链表的基本操作(12个)
- / void InitList(LinkList
- L) void DestroyList(LinkList
- L) void ClearList(LinkList L) /
- 不改变L
- / Status ListEmpty(LinkList L) int ListLength(LinkList L) Status GetElem(LinkList L,int i,ElemType
- e) /
- 算法2.8
- / int LocateElem(LinkList L,ElemType e,Status(
- compare)(ElemType,ElemType)) Status PriorElem(LinkList L,ElemType cur_e,ElemType
- pre_e) Status NextElem(LinkList L,ElemType cur_e,ElemType
- next_e) Status ListInsert(LinkList L,int i,ElemType e) /
- 算法2.9。不改变L
- / Status ListDelete(LinkList L,int i,ElemType
- e) /
- 算法2.10。不改变L
- / void ListTraverse(LinkList L,void(
- vi)(ElemType)) /
- vi的形参类型为ElemType,与bo2-1.c中相应函数的形参类型ElemType&不同
- /

静态单链表

/
- 线性表的静态单链表存储结构
- / #define MAX_SIZE 100 /
- 链表的最大长度
- / typedef struct component,SLinkList[MAX_SIZE]; /
- 一个数组只生成一个静态链表的基本操作(11个))
- / #define DestroyList ClearList // DestroyList()和ClearList()的操作是一样的 void InitList(SLinkList L) void ClearList(SLinkList L) Status ListEmpty(SLinkList L) int ListLength(SLinkList L) Status GetElem(SLinkList L,int i,ElemType
- e) int LocateElem(SLinkList L,ElemType e) /
- 算法2.13(有改动)
- / Status PriorElem(SLinkList L,ElemType cur_e,ElemType
- pre_e) Status NextElem(SLinkList L,ElemType cur_e,ElemType
- next_e) Status ListInsert(SLinkList L,int i,ElemType e) Status ListDelete(SLinkList L,int i,ElemType
- e) void ListTraverse(SLinkList L,void(
- vi)(ElemType)) Category:数据结构

双链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 /
- 线性表的双向链表存储结构
- / typedef struct DuLNode DuLNode,
- DuLinkList; /
- 带头结点的双向循环链表的基本操作(14个)
- / void InitList(DuLinkList
- L) void DestroyList(DuLinkList
- L) void ClearList(DuLinkList L) /
- 不改变L
- / Status ListEmpty(DuLinkList L) int ListLength(DuLinkList L) Status GetElem(DuLinkList L,int i,ElemType
- e) int LocateElem(DuLinkList L,ElemType e,Status(
- compare)(ElemType,ElemType)) Status PriorElem(DuLinkList L,ElemType cur_e,ElemType
- pre_e) Status NextElem(DuLinkList L,ElemType cur_e,ElemType
- next_e) DuLinkList GetElemP(DuLinkList L,int i) /
- 另加
- / Status ListInsert(DuLinkList L,int i,ElemType e) Status ListDelete(DuLinkList L,int i,ElemType
- e) void ListTraverse(DuLinkList L,void(
- visit)(ElemType)) void ListTraverseBack(DuLinkList L,void(
- visit)(ElemType)) Category:数据结构

循环链表

循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。

单向循环链表

存储结构和单链表相同。 /
- 设立尾指针的单循环链表的12个基本操作
- / void InitList(LinkList
- L) void DestroyList(LinkList
- L) void ClearList(LinkList
- L) /
- 改变L
- / Status ListEmpty(LinkList L) int ListLength(LinkList L) Status GetElem(LinkList L,int i,ElemType
- e) int LocateElem(LinkList L,ElemType e,Status(
- compare)(ElemType,ElemType)) Status PriorElem(LinkList L,ElemType cur_e,ElemType
- pre_e) Status NextElem(LinkList L,ElemType cur_e,ElemType
- next_e) Status ListInsert(LinkList
- L,int i,ElemType e) /
- 改变L
- / Status ListDelete(LinkList
- L,int i,ElemType
- e) /
- 改变L
- / void ListTraverse(LinkList L,void(
- vi)(ElemType))

哈希表

散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为哈希(Hash)函数,按这个思想建立的表为哈希表。对不同的关键字可能得到同一哈希地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该哈希函数来说称做同义词。综上所述,根据哈希函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”作为记录在表中的存储位置,这种表便称为哈希表,这一映象过程称为哈希造表或散列,所得的存储位置称哈希地址或散列地址。若对于关键字集合中的任一个关键字,经哈希函数映象到地址集合中任何一个地址的概率是相等的,则称此类哈希函数为均匀(Uniform)哈希函数,这就是使关键字经过哈希函数得到一个“随机的地址”,从而减少冲突。

常用的构造哈希函数的方法

散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位ǐ #直接定址法:取关键字或关键字的某个线性函数值为哈希地址。即H(key)=key或H(key) = a•key + b,其中a和b为常数(这种哈希函数叫做自身函数) #数字分析法 #平方取中法 #折叠法 #随机数法 #除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得的余数为哈希地址。即 H(key) = key MOD p, p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。

处理冲突的方法

#开放定址法;Hi=(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为哈希函数,m为哈希表长,di为增量序列,可有下列三种取法: ##di=1,2,3,…, m-1,称线性探测再散列; ##di=12, -12, 22,-22, 32, …, ±k2,(k<=m/2)称二次探测再散列; ##di=伪随机数序列,称伪随机探测再散列。 #再哈希法:Hi=RHi(key), i=1,2,…,k RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。 #链地址法(拉链法) #建立一个公共溢出区

插入

删除元素

查找的性能分析

哈希表的查找过程基本上和造表过程相同。一些关键码可通过哈希函数转换的地址直接找到,另一些关键码在哈希函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。在介绍的三种处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比较的过程。所以,对哈希表查找效率的量度,依然用平均查找长度来衡量。 查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。影响产生冲突多少有以下三个因素: #哈希函数是否均匀; #处理冲突的方法; #哈希表的装填因子。 哈希表的装填因子定义为:α= 填入表中的元素个数 / 哈希表的长度 α是哈希表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小。 实际上,哈希表的平均查找长度是装填因子α的函数,只是不同处理冲突的方法有不同的函数。以下给出几种不同处理冲突方法的平均查找长度:

参见:


- 数据结构 category:数据结构 ja:ハッシュテーブル

Solutreen

Das Solutréen ist eine jüngere Kulturstufe oder Industrie der Altsteinzeit (Paläolithikum), benannt nach der Fundstätte Solutré, einem fossilen Korallenriff nahe Mâcon im Département Saône-et-Loire in Burgund, Frankreich. Typisch für das Solutréen sind Gegenstände, die durch Abschlagen dünner Lamellen aus Feuerstein hergestellt wurden. Charakteristisch sind flächenretuschierte Blatt- und Kerbspitzen (etwa ein Depot von ca. 20.000 Jahre alten Blattspitzen, gefunden bei Digoin). Die im Musée Dénon in Chalon-sur-Saône ausgestellten, bis zu 40 cm großen, hauchdünnen Spitzen zählen bis heute zu den eindrucksvollsten Steingeräten des gesamten europäischen Paläolithikums. Daneben findet man Felszeichnungen, gravierte Knochen und Figuren. Das Solutréen wird auf den Zeitraum von ca. 22.000 bis 16.500 vor heute datiert und war in Frankreich, Portugal und Spanien verbreitet Kategorie:Steinzeit

jastrzbia gra aliasy cheap tickets Randki Prague appartements










































:: RELATED NEWS ::
Skabelon:Dagen/10. november

Begivenheder

Født - Dødsfald
- 1775 - US Marine Corps grundlægges.
- 1871 - Journalist og opdagelsesrejsende Henry Stanley, som er udsendt af New York Tribune, finder den savnede skotske hjernens elektriske aktivitet. Den består i at man sætter elektroderhovedets overflade og måler spændingen. Et elektroencefalogram (også forkortet EEG) er resultatet af en sådan måling. Som en af de første studerede tyskeren Hans Berger EEG i 1920'erne. I forbindelse med 8. juni 1877 - 22. marts 1937) var en dansk komponist, organist og højskolelærer. Han skrev melodierne til flere af tidens folkelige sange, bl.a. Spurven sidder stum bag Kvist og Jeg ser de bøgelyse Øer. Sammen med Carl Nielsen, grundlæggende SI-enheder. Mol er enheden for en mængde af genstande eller objekter og ville kunne anvendes ligesom SI-præfiksene, men anvendes faktisk til opgivelse af subatomar partikel- eller molekyle-mængder. Den fysiske og kemiske størrelse som m
Avogadros konstant
Mol er en af de 7 grundlæggende SI-enheder. Mol er enheden for en mængde af genstande eller objekter og ville kunne anvendes ligesom SI-præfiksene, men anvendes faktisk til opgivelse af subatomar partikel- eller molekyle-mængder. Den fysiske og kemiske størrelse som m
Wikipedia:Ugens artikel/arkiv
Arkiv over tidligere status for udarbejdelse af den enkelte "ugens artikel" kan ses nedenfor. ---- Ugens artikel (uge 39/2005): Færøerne Forslag til forside:
Status, mangler og forbedringsforslag: # Der bør være en henvisning til portal:Færøerne --Sir48 (Thyge) 20. sep 2005 kl. 19:00 (CEST) :Portal-skabelon er lavet og indsat # Alle billeder er nu fra Commons. --Sir48 (Thyge) 20. sep 2005 kl. 19:00 (C

Proctorværdi
Proctorværdien er et udtryk for, hvor meget et materiale kan komprimeres ved en given fugtighed. Den beregnes ved en standardtest på følgende vilkår:
- en 4,5 kg jordprøve med et 5 % vandindhold
- en faldhammer på 2,5 kg, der udløses 25 gange fra 30 cm højde
- massetætheden beregnes ved vejning efter komprimering
- forsøget gentages med stigende vandindhold
- de indsamlede tal for massetæthed plottes ud som en ’’proctorkurve’’ Kurven viser den maksimale massetæthed, som jorden kan komprimeres til med en given kraft. Kurven viser også, hva
Gaskonstant
Gaskonstanten (ofte betegnet R) er proportionalitetsfaktoren i idealgasligningen. Den kan opfattes som en molar udgave af Boltzmanns konstant idet gaskonstanten er produktet af Avogadros tal og Boltzmanns konstant. Den omtrentlige værdi er givet ved : R = NA · k = 8,31 J/(mol·
All Rights Reserved 2005 wikimiki.org