接下来会陆续更新有关数据结构的文章。仅记录自己学习的心得和总结。供有兴趣的同学一起学习!
什么是数据?
数据是信息的载体;数据元素是数据的基本单位,而一个数据元素可以由若干个数据项组成。
什么是数据结构?
数据结构指的是数据之间的相互关系,即数据的组织形式。
-
分类
- 数据的逻辑结构
- 数据的存储结构
- 数据的运算
数据的逻辑结构
数据元素之间的逻辑关系,也称数据的逻辑结构,数据的逻辑结构是从逻辑关系上描述数据,
与数据的存储无关,是独立于计算机的。
- 分类:
-
线性结构
若结构是非空集,则有且仅有一个开始节点和一个终端节点,并且所有结点都最多只有一个直接前趋和一个直接后趋。 线性表是一个典型的线性结构。栈、队列、串等都是线性结构。
-
非线性结构
一个几点可能有多个直接前趋和直接后趋。 数组、广义表、树和图等数据结构都是非线性结构。
-
数据的存储结构
数据元素及其关系在计算机存储器内的表示,称为数据的存储结构。
- 分类:
-
顺序存储方法:
该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点见的逻辑关系有存储单元的邻接关系来提现。通常借助程序语言的数组描述。
-
链接存储方法:
该方法不要求逻辑上相邻的结点在物理位置上依相邻,结点见得逻辑关系由附加的指针字段表示。通常借助于程序语言的指针类型描述。
-
索引存储方法:
该方法通常在储存结点信息的同时,还建立附加的索引表。 索引表有若干索引项组成。 若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引,稠密索引中索引项的地址指示结点所在的存储位置。 若每个结点在索引表中只对应一个索引项,则该索引表称之为稀疏索引,索引中索引项的地址指示一组结点的起始存储位置。 索引项的一般格式是:关键字+地址。 关键字是能唯一标识一个结点的那些数据项。
-
散列存储方法:
该方法的基本思想是:根据结点的关键字直接计算出该结点的存储地址。
-
数据的运算
数据的运算,即对数据施加的操作。最常见的有:检索、删除、更新和排序等。
算法+数据结构=程序
数据结构:是指数据的逻辑结构和存储结构;
算法:是对数据运算的描述;
如何选用正确的算法?
- 执行算法所耗费的时间;
- 执行算法所耗费的存储空间,其中主要考虑辅助存储空间;
- 算法应易于理解,易于编码,易于调试等等;
一个算法所耗费的时间=算法中每条语句的执行时间之和
每条语句的执行时间=语句的执行次数(频度)*语句执行一次所需时间
算法的时间复杂度 T(n)
在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。
-
分类:
-
时间复杂度
指执行算法所需要的计算工作量
-
空间复杂度
指执行这个算法所需要的内存空间
-
-
计算时间复杂度
一般看看有几重for循环,只有一重则时间复杂度为O(n),二重则为O(n^2),依此类推, 如果有二分则为O(logn),二分例如快速幂、二分查找,如果一个for循环套一个二分, 那么时间复杂度则为O(nlogn)。
例子1
public class example01 {
public static void main(String[] args) {
System.out.println("a");
System.out.println("b");
}
}
// T(n)=O(1)
例子2
public class example02 {
public static void main(String[] args) {
int sum = 0;
for(int i=1;i<=100;i++) {
sum = sum + i;
}
}
}
// T(n)=O(n)
例子3
public class example03 {
public static void main(String[] args) {
int sum = 0;
for(int i=1;i<=100;i++) {
for(int j=1;j<=100;j++)
sum = sum + i;
}
}
}
// T(n)=O(n^2)