:: wikimiki.org ::
| 计算机科学 |
计算机科学
计算机科学是一门包含各种各样与计算和信息处理相关主题的系统学科,从抽象的算法分析、形式化语法等等,到更具体的主题如编程语言、程序设计、软件和硬件等。作为一门学科,它与数学、计算机程序设计、软件工程和计算机工程有显著的不同,却通常被混淆,尽管这些学科之间存在不同程度的交叉和覆盖。
计算机科学研究的课题是:
- 计算机程序能做什么和不能做什么(可计算性);
- 如何使程序更高效的執行特定任務(算法和复杂性理论);
- 程序如何存取不同类型的数据(数据结构和数据库);
- 程序如何显得更具有智能(人工智能);
- 人类如何与程序沟通(人机互动和人机界面)。
计算机科学的大部分研究是基于“冯·诺依曼计算机”和“图灵机”的,它们是絕大多數实际机器的计算模型。作为此模型的开山鼻祖,邱奇-图灵论题(Church-Turing Thesis)表明,尽管在计算的时间,空间效率上可能有所差异,现有的各种计算设备在计算的能力上是等同的。尽管这个理论通常被认为是计算机科学的基础,可是科学家也研究其它种类的机器,如在实际层面上的并行计算机和在理论层面上概率计算机、oracle 计算机和量子计算机。在这个意义上来讲,计算机只是一种计算的工具:著名的计算机科学家 Dijkstra 有一句名言“计算机科学并不只是关于计算机的,正如天文学并不只是关于望远镜一样”。
计算机科学根植于电子工程、数学和语言学,是科学、工程和艺术的结晶。它在20世纪最后的三十年间兴起成为一门独立的学科,并发展出自己的方法与术语。
早期,虽然英国的剑桥大学和其他大学已经开始教授计算机科学课程,但它只被视为数学或工程学的一个分支,并非独立的学科。剑桥大学声称有世界上第一个传授计算的资格。世界上第一个计算机科学系是由美国的普渡大学在1962年设立,第一个计算机学院於1980年由美国的东北大学设立。现在,多数大学都把计算机科学系列为独立的部门,一部分将它与工程系、应用数学系或其他学科联合。
计算机科学领域的最高荣誉是ACM设立的图灵奖,被誉为是计算机科学的诺贝尔奖。它的获得者都是本领域最为出色的科学家和先驱。华人中首获图灵奖的是姚期智先生.他于2000年以其对计算理论做出的诸多“根本性的、意义重大的”贡献而获得这一崇高荣誉。
计算机系统
计算机系统可划分为软件系统与硬件系统两大类。
硬件
- 结构控制和指令系统
- 算法和逻辑结构
- 存储器结构
- 冯·诺伊曼结构
- 哈佛结构
- 输入/输出和数据通信
- 数字逻辑
- 逻辑设计
- 集成电路
计算机系统组织
- 计算机系统结构
- 计算机网络
- 分布式计算
- 网络安全
- 计算机系统实现
软件
- 系统软件
- 操作系统
- 编译器
- 应用软件
- 计算机游戏
- 办公自动化
- 网络软件
- CAD软件
- 计算机程序
- 程序设计和程序设计实践
- 面向对象技术
- 程序设计语言
- 软件工程
- 软件复用
- 驱动程序
- 计算机模拟
- 程序设计方法学
数据和信息系统
- 数据结构
- 数据存储表示
- 数据加密
- 数据压缩
- 编码与信息论
- 文件
- 信息系统
- 管理信息系统
- 决策支持系统 - 专家系统
- 数据库
- 信息存储和数据存取
- 信息交互与表达
主要的研究领域
形式化基础
- 逻辑学
- 谓词逻辑
- 模态逻辑
- 时序逻辑
- 描述逻辑
- 数学
- 泛代数
- 递归论
- 模型论
- 概率论和数理统计
- 逻辑代数
- 布尔代数
- 离散数学
- 组合数学
- 图论
- 网论
- 信息论
理论计算机科学
- 形式语言
- 自动机
- 可计算性
- 算法
- 计算复杂性
- 描述复杂性
- 编译器
- 程序设计理论
- 信息论
- 类型理论
- 指称语义
- 微程序
- 遗传算法
- 并行计算
计算方法学
- 人工智能
- 计算机图形学
- 图像处理与计算机视觉
- 模式识别
- 语音识别
- 文字识别
- 签名识别
- 人脸识别
- 指纹识别
- 仿真与建模
- 数字信号处理
- 文档与文本处理
计算机应用
- 数值计算
- 数值分析
- 定理机器证明
- 计算机代数
- 工程计算
- 计算机化学
- 计算机物理
- 生物信息论
- 计算生物学
- 非数值计算
- 工厂自动化
- 办公室自动化
- 人工智能
- 信息存储与检索
- 符号语言处理
- 计算机辅助科学
- 计算机辅助设计
- 计算机辅助教学
- 计算机辅助管理
- 计算机辅助软件工程
- 机器人学
- 多媒体技术
- 人机交互
- 电子商务
特定技术
- 测试基准
- 机器视觉
- 数据压缩
- 设计模式
- 数字信号处理
- 文件格式
- 信息安全
- 国际互联网络
- 超大规模集成电路设计
- 网络传输协议
- 网络处理器技术
- 整数运算器
- 浮点运算器
- 矩阵运算处理器
- 网格
计算科学史
- 计算机历史
- 软件业历史
- 编程思想
相关学科
计算机科学与另外的一些学科紧密相关。这些学科之间有明显的交叉领域,但也有明显的差异。
- 信息科学 - 软件工程 - 信息系统 - 计算机工程 - 信息安全 - 密码学 - 数学 - 工程学 - 语言学 - 逻辑学
卓越的先驱者
- 艾伦·图灵
参见
- 计算机科学课程列表
- 计算机科学家
- 图灵奖
- 冯·诺依曼奖
- 中国计算机产业
- 中国计算机科学大事年表
- 程序设计语言列表
- 操作系统列表
- ASCII艺术
外部链接
ko:컴퓨터 과학
ja:情報工学
simple:Computer Science
th:วิทยาการคอมพิวเตอร์
Category:自然科学
Category:技术科学
计算
Originally, the word computing was synonymous with counting and calculating, and a science that deals with the original sense of computing mathematical calculations.
The following definition of computing is given in the ACM report [http://portal.acm.org/citation.cfm?id=63238.63239 Computing As a Discipline]:
The discipline of computing is the systematic study of algorithmic processes that describe and transform information: their theory, analysis, design, efficiency, implementation, and application. The fundamental question underlying all the computing is 'What can be (efficiently) automated?'
科学与理论
- 计算机科学
- 计算理论
- Computational models
- DBLP, as of October 2005, now lists over 675 000 bibliographic entries on computer science and several thousand links to the home pages of computer scientists
- 科学计算
硬件
See information processor for a high-level block diagram.
- 计算机硬件
- 计算机硬件设计
- 计算机网络
- 计算机系统
- 计算机硬件历史
Instruction-level taxonomies
After the commoditization of memory, attention turned to optimizing CPU performance at the instruction level. Various methods of speeding up the fetch-execute cycle include:
- designing instruction set architectures with simpler, faster instructions: RISC as opposed to CISC
- Superscalar instruction execution
- VLIW architectures, which make parallelism explicit
- 软件工程
- 计算机编程
- 软件专利
- History of computing hardware from the tally stick to the quantum computer
- Punch Card
- Unit record equipment
- IBM 700/7000 series
- IBM 1400 series
- System/360
- Early IBM disk storage
商用计算机
- Accounting software
- Computer-aided design
- Computer-aided manufacturing
- Computer-assisted dispatch
- Customer relationship management
- Data warehouse
- Decision support system
- Electronic data processing
- Enterprise resource planning
- Geographic information system
- Management information system
- Material requirements planning
- Strategic enterprise management
- Supply chain management
- Product Lifecycle Management
- Utility Computing
人的因素
- Accessible computing
- Human-computer interaction
- Cryptology - cryptography - information theory
- Cracking - demon dialing - Hacking - war dialing - war driving
- Social engineering - Dumpster diving
- Physical security - Black bag job
- Computer insecurity
- Computer surveillance
- defensive programming
- malware
- security engineering
数字数据
- integral data types - bit, byte, etc.
- real data types:
- Floating point (Single precision, Double precision, etc.)
- Fixed point
- Rational number
- Decimal
- Binary-coded decimal (BCD)
- Excess-3 BCD (XS-3)
- Biquinary-coded decimal
- representation: Binary - Octal - Decimal - Hexadecimal (hex)
- Computer mathematics - Computer numbering formats -
字符数据
- storage: Character - String - Text - Plain text
- representation: ASCII - Unicode - Multibyte - EBCDIC (Widecharacter, Multicharacter) - Fieldata - Baudot
其他专题
- 数据压缩
- 数字信号处理
- 图像处理
- 索引
- 数据管理
- Punch card
- Key punch
- Unit record equipment
计算机分类
- Analog computer
- Calculator
- Desktop computer
- Desknote
- Digital computer
- Embedded computer
- Home computer
- Laptop
- Mainframe
- Minicomputer
- Microcomputer
- Personal computer
- Personal digital assistant (aka PDA, or Handheld computer)
- Server
- Supercomputer
- Tablet PC
- Video game console
- Workstation
当前的公司
- Apple Computer
- Avaya
- Dell
- Fujitsu
- Gateway Computers
- Groupe Bull
- Hewlett-Packard
- Hitachi, Ltd.
- IBM
- Microsoft
- NEC Corporation
- NetCB
- Novell
- Red Hat
- Silicon Graphics
- Sun Microsystems
- Unisys
历史上的公司
- Acorn, bought by Olivetti
- Bendix Corporation
- Burroughs, merged with UNIVAC to become Unisys
- Compaq, bought by Hewlett-Packard
- Control Data
- Cray
- Data General
- DEC, bought by Compaq, in turn bought by Hewlett-Packard
- Digital Research - a software company for the early microprocessor-based computers
- English Electric
- Ferranti
- General Electric, computer division bought by Honeywell, then Bull
- Honeywell, computer division bought by Bull and
- ICL
- Leo
- Lisp Machines, Inc.
- Marconi
- Nixdorf, bought by Siemens
- Olivetti
- Osborne
- Packard Bell
- Raytheon
- Royal McBee
- RCA
- Scientific Data Systems, sold to Xerox
- Siemens
- Sinclair Research, created the ZX Spectrum, ZX80 and ZX81
- Symbolics
- UNIVAC, merged with Burroughs to become Unisys
- Varian
- Wang
专业组织
- Association for Computing Machinery (ACM)
- British Computer Society (BCS)
- Association for Survey Computing (ASC)
- Institute of Electrical and Electronics Engineers (IEEE), in particular the IEEE Computer Society
- Institution of Electrical Engineers
- International Electrotechnical Commission (IEC)
Standards organizations and consortia (see also standardization)
- International Electrotechnical Commission (IEC)
- International Organization for Standardization (ISO)
- Institute of Electrical and Electronics Engineers (IEEE)
- Internet Engineering Task Force (IETF)
- World Wide Web Consortium (W3C)
杂项
- List of computer term etymologies
- Load (computing)
- Indian Language Computing
Category:计算
ja:コンピューティング
算法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:อัลกอริทึม
计算机程序设计
程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。专业的程序设计人员常被称为程序员。
某种意义上,程序设计的出现甚至早于电子计算机的出现。英国著名诗人拜伦的女儿Ada Lovelace曾设计了巴贝奇分析机上解伯努利方程的一个程序。她甚至还建立了循环和子程序的概念。由于她在程序设计上的开创性工作,Ada Lovelace被称为世界上第一位程序员。
任何设计活动都是在各种约束条件和相互矛盾的需求之间寻求一种平衡,程序设计也不例外。在计算机技术发展的早期,由于机器资源比较昂贵,程序的时间和空间代价往往是设计关心的主要因素;随着硬件技术的飞速发展和软件规模的日益庞大,程序的结构、可维护性、复用性、可扩展性等因素日益重要。
另一方面,在计算机技术发展的早期,软件构造活动主要就是程序设计活动。但随着软件技术的发展,软件系统越来越复杂,逐渐分化出许多专用的软件系统,如操作系统、数据库系统、应用服务器,而且这些专用的软件系统愈来愈成为普遍的计算环境的一部分。这种情况下软件构造活动的内容越来越丰富,不再只是程序设计活动了,还包括数据库设计、用户界面设计、接口设计、通信协议设计和复杂的系统配置过程。
设计工具
- 开发环境
- 编辑器、编译器、解释器、调试工具
- 集成开发环境
- 可视化开发环境
- 计算机辅助软件工程??
相关条目
- 程序
- 软件
- 程序设计语言
- 程序设计实践
- 程序设计方法学
- 软件开发
- 设计模式
- 计算机科学课程列表
Category:程序设计
ja:プログラミング
ko:프로그래밍
计算机软件軟--件(中国大陆及香港用语,台湾作软体)是一系列按照特定顺序组织的计算机数据和指令的集合。一般来讲软件被划分为系统软件、应用软件和介于这两者之间的中间件。其中系统软件为计算机使用提供最基本的功能,但是并不针对某一特定应用领域。而应用软件则恰好相反,不同的应用软件根据用户和所服务的领域提供不同的功能。
软件并不只是包括可以在计算机上运行的程序,与这些程序相关的文件一般也被认为是软件的一部分。简单的说软件就是程序加文档的集合体。
软件被应用于世界的各个领域,对人们的生活和工作都产生了深远的影响。
系统软件
系统软件是负责管理计算机系统中各种独立的硬件,使得它们可以协调工作。系统软件使得计算机使用者和其他软件将计算机当作一个整体而不需要顾及到底层每个硬件是如何工作的。
一般来讲,系统软件包括操作系统和一系列基本的工具(比如编译器,数据库管理,存储器格式化,文件系统管理,用户身份验证,驱动管理,网络连接等方面的工具)。
应用软件
应用软件是为了某种特定的用途而被开发的软件。它可以是一个特定的程序,比如一个图像浏览器。也可以是一组功能联系紧密,可以互相协作的程序的集合,比如微软的Office软件。也可以是一个由众多独立程序组成的庞大的软件系统,比如数据库管理系统。
较常见的有
#文字处理软件 如WPS、Word等
#信息管理软件
#辅助设计软件 如AutoCAD
#实时控制软件
#教育与娱乐软件
按操作系统分类
- BeOS
- DOS
- Linux
- Mac OS
- Unix
- Windows
软件开发
软件开发是根据用户要求建造出软件系统或者系统中的软件部分的过程。软件开发是一项包括需求捕捉,需求分析,设计,实现和测试的系统工程。
软件一般是用某种程序设计语言来实现的。通常采用软件开发工具可以进行开发。
软件许可
不同的软件一般都有对应的软件许可,软件的使用者必须在同意所使用软件的许可证的情况下采能够合法的使用软件。从另一方面来讲,某种特定软件的许可条款也不能够与法律相抵触。
未经软件版权所有者许可的软件拷贝将会引发法律问题,一般来讲,购买和使用这些盗版软件也是违法的。
相关内容
- 计算
- 计算机
- 计算机科学
- 计算机程序设计
- 程序设计语言
- 软件工程
- 算法
- 数据结构
- 软件开发过程
- 软件开发工具
- 软件优化
- 数字图像处理
- 计算机图形学
- 办公自动化
- 计算机网络
- 数据库
- 电子表格
- 开放源代码
- 自由软件
- 密码学
- Wiki
- 網誌
- 操作系统
- 软件许可证
- 推荐软件
参见
- 计算机软件列表
ja:ソフトウェア
ko:컴퓨터 소프트웨어
nb:Dataprogram
simple:Software
th:ซอฟต์แวร์
数学
数学最早是研究量、结构、变化以及空间模型的学科。在现代,数学又是利用逻辑形式研究现实世界的空间形式和数量关系的学科,尽管对某一特定结构的研究往往属于自然科学,特别是物理学的范畴。同时由于数学自身的发展,数学家也要研究纯粹属于数学内部的结构。
创立于二十世纪三十年代的法国的布尔巴基学派认为:数学,至少纯粹数学,是研究抽象结构的理论。结构,就是以初始概念和公理出发的演绎系统。布学派认为,有三种基本的抽象结构:代数结构(群,环,域……),序结构(偏序,全序……),拓扑结构(邻域,极限,连通性,维数……)。
历史
:主页面:数学史
数学,起源于人类早期的生产活动,为古中国六艺之一,亦被古希腊学者视为哲学之起点。数学的希腊语μαθηματικός (mathematikós)意思是“学问的基础”,源于μάθημα (máthema)(“科学,知识,学问”)。
数学最早用于人们计数、天文、度量甚至是贸易的需要。这些需要可以简单地被概括为数学对结构、空间以及时间的研究。
对结构的研究是从数字开始的,首先是从我们称之为初等代数的——自然数和整数以及它们的算术关系式开始的。更深层次的研究是数论。
对空间的研究则是从几何学开始的,首先是欧几里德几何学和类似于三维空间(也适用于多或少维)的三角学。后来产生了非欧几里德几何学,在相对论中扮演着重要角色。
到了16世纪,算术、初等代数、以及三角学等初等数学已大体完备。17世纪变量概念的产生使人们开始研究变化中的量与量的互相关系和图形间的互相变换。随着自然科学和技术的进一步发展,为研究数学基础而产生的集合论和数理逻辑等也开始慢慢发展。
数学不是……
数学不是占数术。数学的证明或反证明的意念都要在逻辑之中进行,占数术却非。
数学不是会计学。虽然会计师的工作就是算术运算,他们只需检查计算是否准确。证明和反证假设对数学家很重要,但对会计师毫不重要。如果高等抽象数学的发展不能改善簿记的精确性和效率,和会计学毫无关系。
数学不是物理,虽然历史和哲学上两者关系密切。
参考书目
- Davis, Philip J.; Hersh, Reuben: The Mathematical Experience. Birkhäuser, Boston, Mass., 1980. A gentle introduction to the world of mathematics.
- Gullberg, Jan: Mathematics-From the Birth of Numbers. W.W. Norton, 1996. An encyclopedic overview of mathematics presented in clear, simple language.
- Mathematical Society of Japan: Encyclopedic Dictionary of Mathematics, 2nd ed.. MIT Press, Cambridge, Mass., 1993. Definitions, theorems and references.
- Michiel Hazewinkel (ed.): Encyclopaedia of Mathematics. Kluwer Academic Publishers 2000. A translated and expanded version of a Soviet math encyclopedia, in ten (expensive) volumes, the most complete and authoritative work available. Also in paperback and on CD-ROM.
- 数学--它的内容,方法和意义
参考网址
- [http://www.11abc.com/science/maths.htm 数学网址](数学网址) 。
- Rusin, Dave: [http://www.math-atlas.org/ The Mathematical Atlas](英文版)现代数学漫游。
- Weisstein, Eric: [http://www.mathworld.com/ World of Mathematics],一个在线的数学百科全书。
- [http://planetmath.org/ Planet Math],另一个在线的数学百科全书,使用GFDL,允许和维基百科交换条目。
- [http://www.mathforge.net/ MathForge],一个包含数学、物理、计算机科学和教育等范畴的新闻网志。
- [http://episte.math.ntu.edu.tw/ EpisteMath|数学知识]。
- 香港科技大学:[http://www.edp.ust.hk/math/ 数学网],一个以数学史为主的网站。
Category:数学
Category:自然科学
Category:科学
ja:数学
ko:수학
ms:Matematik
simple:Mathematics
th:คณิตศาสตร์
zh-min-nan:Sò·-ha̍k
软件工程软件工程(Software Engineering,简称为SE)是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。
在现代社会中,软件应用于多个方面。典型的软件比如有电子邮件,嵌入式系统,人机界面,办公套件,操作系统,编译器,数据库,游戏等。同时,各个行业几乎都有计算机软件的应用,比如工业,农业,银行,航空,政府部门等。这些应用促进了经济和社会的发展,使得人们的工作更加高效,同时提高了生活质量。
软件工程师是对应用软件创造软件的人们的统称,软件工程师按照所处的领域不同可以分为系统分析员,软件设计师,系统架构师,程序员,测试员等等。人们也常常用程序员来泛指各种软件工程师。
软件工程与计算机程序设计
软件工程存在于各种应用中,存在于软件开发的各个方面。而程序设计通常包含了程序设计和编码的反复迭代的过程,它是软件开发的一个阶段。
软件工程力图对软件项目的各个方面作出指导,从软件的可行性分析直到软件完成以后的维护工作。软件工程认为软件开发与各种市场活动密切相关。比如软件的销售,用户培训,与之相关的软件和硬件安装等。软件工程的方法学认为一个独立的程序员不应当脱离团队而进行开发,同时程序的编写不能够脱离软件的需求,设计,以及工程,这是一个被争论了很久的问题。实际上,软件开发兼有两者的特点。但是这并不意味着它们可以被互相混淆。
很多人认为软件工程之于计算机科学和信息科学就如传统意义上的工程学之于物理和化学一样。
在美国,大约40%的软件工程师具有计算机科学的学位。在世界其他地方,这个比例也差不多。他们并不一定会每天使用计算机科学方面的知识,但是他们每天都会使用软件工程方面的知识。
软件危机
请参考:软件危机
软件工程的兴起要根源于20世纪60,70和80年代的软件危机。在那个时代,很多的软件最后都得到了一个悲惨的结局。很多的软件项目开发时间大大超出了规划的时间表。一些项目导致了财产的流失,甚至某些软件导致了人员伤亡。同时软件开发人员也发现软件开发的难度越来越大。
OS 360操作系统被认为是一个典型的案例。到现在为止,它仍然被使用在IBM360系列主机中。这个经历了数十年,极度复杂的软件项目甚至产生了一套不包括在原始设计方案之中的工作系统。OS 360是第一个超大型的软件项目,它使用了1000人左右的程序员。Fred Brooks在随后他的大作《人月神话》(The Mythical Man-Month)中曾经承认,在他管理这个项目的时候,他犯了一个价值数百万美元的错误。
财产的损失:软件的错误可能导致巨大的财产损失。欧洲阿里亚娜火箭的爆炸就是一个最为惨痛的教训。
人员伤亡:由于计算机软件被广泛应用于包括医院等与生命息息相关的行业。这也使得软件的错误导致人员伤亡成为了可能。
在軟體工程界被大量引用的案例是Therac-25的意外. 在1985年六月到1987年一月之間, 六個已知的醫療事故來自於Therac-25錯誤地超過劑量, 導致患者死亡或嚴重輻射灼傷[http://courses.cs.vt.edu/~cs3604/lib/Therac_25/Therac_1.html]。
在工业上,某些嵌入式系统导致机器的不正常运转,从而将一些人推入了险境。
最近的相关报道可以参见[http://catless.ncl.ac.uk/Risks]。
银弹与没有银弹
从软件危机被提出以来。人们一直在寻找解决它的方法。于是一系列的方法被提出并且加以应用。比如结构化的程序设计,面向对象的开发,CMM,UML等等。
在1986年,IBM大型电脑之父Fred Brooks发表了他的著名论文《没有银弹》(No Silver Bullet:Essence and Accidents of Software Engineering)。
在这篇著名的论文中他断言:“在10年内无法找到解决软件危机的银弹”(There will be no silver bullet within ten years)。 这篇论文在其后引起了巨大的反响。关于这本论文及其引起的反响,可以参考银弹与没有银弹。
Fred Brooks的著名作品还有《人月神话》
方法学
软件工程的方法有很多方面的意义。包括项目管理,分析,设计,程序的编写,测试和质量控制。
软件设计方法可以区别为重量级的方法和轻量级的方法。重量级的方法中产生大量的正式文档。
著名的重量级开发方法包括ISO 9000,CMM,和统一软件开发过程(RUP)。
轻量级的开发过过程没有对大量正式文档的要求。著名的轻量级开发方法包括极限编程(XP)和敏捷流程(Agile Processes)。
根据《新方法学》这篇文章的说法,重量级方法呈现的是一种“防御型”的姿态。在应用“重量级方法”的软件组织中,由于软件项目经理不参与或者很少参与程序设计,无法从细节上把握项目进度,因而会对项目产生“恐惧感”,不得不要求程序员不断撰写很多“软件开发文档”。而轻量级方法则呈现“进攻型”的姿态,这一点从XP方法特别强调的四个准则—“沟通、简单、反馈和勇气”上有所体现。目前有一些人认为,“重量级方法”适合于大型的软件团队(数十人以上)使用,而“轻量级方法”适合小型的软件团队(几人、十几人)使用。当然,关于重量级方法和轻量级方法的优劣存在很多争论,而各种方法也在不断进化中。
一些方法论者认为人们在开发中应当严格遵循并且实施这些方法。但是一些人并不具有实施这些方法的条件。实际上,采用何种方法开发软件取决于很多因素,同时受到环境的制约。
软件开发过程
请参考软件开发过程
软件开发过程是随着开发技术的演化而随之改进的。从早期的瀑布式(Waterfall)的开发模型到后来出现的螺旋式的迭代(Spiral)开发,以致最近开始兴起的敏捷开发方法(Agile),他们展示出了在不同的时代软件产业对于开发过程的不同的认识,以及对于不同类型项目的理解方法。
注意区分软件开发过程和软件过程改进之间的重要区别。诸如像ISO 15504, ISO 9000, CMM, CMMI这样的名词阐述的是一些软件过程改进框架,他们提供了一系列的标准和策略来指导软件组织如何提升软件开发过程的质量、软件组织的能力,而不是给出具体的开发过程的定义。
软件工程的发展方向
“敏捷开发”(Agile Development)被认为是软件工程的一个重要的发展。它强调软件开发应当是能够对未来可能出现的变化和不确定性作出全面反应的。
敏捷开发被认为是一种“轻量级”的方法。在轻量级方法中最负盛名的应该是“极限编程”(Extreme Programming,简称为XP)。而与轻量级方法相对应的是“重量级方法”的存在。重量级方法强调以开发过程为中心,而不是以人为中心。重量级方法的例子比如CMM/PSP/TSP。
面向方面的编程(Aspect Oriented Programming,简称AOP)被认为是近年来软件工程的另外一个重要发展。这里的方面指的是完成一个功能的对象和函数的集合。在这一方面相关的内容有泛型编程(Generic Programming)和模板。
软件工程师
请参考软件工程师以及IT工程师认证
相关内容
- 软件工程相关条目列表
- 计算机科学
- 计算机科学课程列表
- 计算机软件
- 软件开发过程
- 软件项目分析
- 软件项目设计
- 软件测试
- 程序设计语言
- IT工程师认证
- 中国计算机产业
- 软件危机
參考
# 胡崑山,《中国软件产业发展现状与人才需求》,2003年9月1日,http://software.ccidnet.com/pub/article/c372_a62973_p1.html
外部链接
Category:软件工程
ja:ソフトウェア工学
th:วิศวกรรมซอฟต์แวร์
可计算性可计算性(calculability)是指一个实际问题是否可以使用计算机来解决.从广义上讲如“为我烹制一个汉堡”这样的问题是无法用计算机来解决的(至少在目前).而计算机本身的优势在于数值计算,因此可计算性通常指这一类问题是否可以用计算机解决.事实上,很多非数值问题(比如文字识别,图象处理等)都可以通过转化成为数值问题来交给计算机处理,但是一个可以使用计算机解决的问题应该被定义为“可以在有限步骤内被解决的问题”,故哥德巴赫猜想这样的问题是不属于“可计算问题”之列的,因为计算机没有办法给出数学意义上的证明,因此也没有任何理由期待计算机能解决世界上所有的问题.分析某个问题的可计算性意义重大,它使得人们不必浪费时间在不可能解决的问题上(因而可以尽早转而使用除计算机以外更加有效的手段),集中资源在可以解决的问题集中.
Category:计算机科学
算法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:อัลกอริทึม
数据结构
数据结构(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网
- 无向图
- 无向网 (带权无向图)
- | | |