标签:
转载请注明出处:http://www.cnblogs.com/wangyingli/p/5919297.html
数据结构学了有一年的时间了,但是一直没有好好的总结一下,现在回想起来,感觉好像都不怎么记得了。所以接下来一段时间我将重新学习一下,算是温故而知新了。本着「分享是一种美德」的精神,我将把我的学习总结记录下来,并与大家分享。
本节的主要内容有:
数据结构是计算机存储、组织数据的方式。在现实世界中,不同数据元素之间不是独立的,而是存在特定关系的,我们将这些关系称为结构。同样在计算机中,数据元素也不是孤立、杂乱无序的,而是具有内在联系的数据集合。
数据元素之间存在的一种或多种特定关系,也就是数据的组织形式,叫数据结构。也可以说,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。程序设计的实质就是数据结构和算法是设计,因此我们说程序设计 = 数据结构 + 算法。
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
数据项:一个数据元素可以由若干个数据项组成。数据项是A数据的不可分割的最小单位。。
数据对象:是性质相同的数据元素的集合,是数据的子集。
例如:一本书的书目信息为一个数据元素,而书目信息的每一项(如书名、作者名等)为一个数据项。
按照不同的角度,数据结构可分为逻辑结构和物理结构。其中逻辑结构是面向问题的,而物理结构是面向计算机的,它们的基本目标都是将数据及其逻辑关系存储到计算机内存中。
数据类型是指一组性质相同的值的集合及定义在该集合上的一些操作的总称。而抽象是指抽象出事物具有的普遍性的本质,它是抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括。抽象隐藏了繁杂的细节,只保留实现目标所必须的信息。因此抽象数据类型可以定义为:
抽象数据类型(Abstract Data Type,ADT)是指一个数学模型及定义在该模型上的一组操作,它是一种向用例隐藏内部表示的数据类型。
面向对象编程的特征之一就是使用数据类型的实现封装数据,以简化实现、隔离用例开发、实现模块化编程。抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性。它将实际生活中的问题分解为多个规模小、能够独立开发和调试的小型模块,然后进行独立编程。这种方式将代码的影响限制在局部区域,改进了我们的软件质量,促进了代码复用。抽象数据类型抽象的层次越高,那么可复用性也越强。比如:java中的Object是对所有对象的抽象。
java中数据类型可以分为两类:
注意:
算法(Algorithm)一词最早出现在波斯数学家al-Khwarizmi所写的《印度数字算术》中。欧几里得算法(求两个整数的最大公约数)被认为是史上第一个算法。
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法的基本特性:
程序与算法的区别:
程序(program)是软件开发人员根据用户需求开发的、用程序设计语言描述的适合计算机执行的指令(语句)序列。它包括「数据结构」、「算法」、「程序设计方法」和「编程语言」。程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的有穷性,比如操作系统也是一种程序,它可以一直运行。
算法的设计要求:
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。
算法的时间复杂度反映了算法执行的时间长短,它是度量一个算法好坏的重要指标。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
度量一个算法的时间复杂度通常有两种方式:
算法的时间复杂度是由最深层嵌套语句的频度决定的。
大O表示法的推导:
例1:
int i, j, temp;
for(i=0; i<n; i++) {
for(j=i, j<n; j++) {
temp++;
}
}
语句执行的总次数:
例2:
for(i=1;i<=n;i=i*2){
System.out.println(i);
}
执行的总次数满足:
例3:分析冒泡排序算法的时间复杂度
//冒泡排序算法
public static void bubbleSort(int[] data) {
if (data == null) {
return;
}
int temp = 0;
for (int i = data.length - 1; i > 0; --i){
for (int j = 0; j < i; ++j){
if (data[j + 1] < data[j]){
temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
}
}
}
}
算法分析:
常见时间复杂度大小关系:
算法的时间复杂度和两个因素有关:算法中的最大嵌套循环层数;最大嵌套循环结构中每次循环的次数。一般来说,具有多项式时间复杂度的算法是可以接受的;具有指数时间复杂度的算法,只有当n足够小时才可以使用。一般效率较好的算法要控制在O(N)或者O(log2 N)
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。其中,n为问题规模,f(n)为语句关于n所占存储空间的函数。
算法的空间复杂度分析方法和算法的时间复杂度分析方法基本相同。
例如:
int i, j, temp;
for(i=0; i<n; i++) {
for(j=i, j<n; j++) {
temp++;
}
}
上方代码中,仅需为变量 i、j、temp分配空间即可,所以空间复杂度 S(n)=O(1)S(n)=O(1)。
参考