数据结构——基本概念、时间复杂度

基本定义

数据:描述客观事物的数值、字符以及能输入到机器且能够被处理的各种字符集合。
数据元素:是组成数据的基本单位,是数据集合的个体。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。
数据结构:指相互之间存在一种或多种特定关系的数据元素集合。
数据类型:一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。
抽象:抽取反应问题的本质,忽略非本质的细节
抽象数据类型(ATD):定义了一个数据对象,数据对象中数据元素间的结构关系以及一组数据操作
抽象数据类型特点:数据抽象、信息隐蔽

数据结构的内容
一、逻辑结构:(线性结构、非线性结构)
1.集合结构:同属于一个集合,无任何其他关系
2.线性结构:一对一的线性关系
3.树状结构:一对多的层次关系
4.图状结构或网状结构:多对多的任意关系
二、存储结构:逻辑结构在计算机中的存储映像
1.顺序存储结构:在内存中占连续的存储地址,如数组
2.非顺序存储结构:如链表
三、运算集合

算法5大特性

1.有限性:在有限步骤内正常结束,不能变成无限循环
2.确定性:每个步骤含义确定,无二义
3.可行性:每个计算步都可以在有限时间内完成
4.输入:有0个或多个输入
5.输出:至少有一个输出

算法要求、特征:
正确、可读、健壮、高效、低耗

算法性能评价

算法性能与什么有关?算法性能与问题规模相关。
一、算法时间性能分析
语句频度该语句在算法中重复执行的次数。
举一个栗子:
数据结构——基本概念、时间复杂度_第1张图片
分析:(1)中for循环到n是结束,会执行n+1次,但是循环体里面的只执行n次。在(1)的循环中(2)执行n次,然后(2)自身语句执行n+1次,所以(2)总执行n*(n+1)。因为(2)循环体里面只执行n次,所以(3)执行n方次,下面分析同理;

再举一个栗子:
求时间频度

x = 0for (int i = 0; i < n; i++) {               //(1)
	for (int j = i; j < n; j++) {           //(2)
		x++;                                //(3)
	}
}

(1)执行 n+1 次
(2)执行 n*(n+2)/2 次
(3)执行 n*(n+1)/2 次
算法的时间耗费即为所有语句频度的和。
数据结构——基本概念、时间复杂度_第2张图片
(我的字真丑= =)
【tips:等差数列求和Sn=n*a1+n(n-1)d/2或Sn=n(a1+an)/2】

时间复杂度:T(n)=O(f(n))
主要考虑用算法时间复杂度的数量级(渐进时间复杂度)来评价一个算法的时间性能。一般是算法中频度最大的语句频度。
还是这个栗子:

x = 0for (int i = 0; i < n; i++) {               
	for (int j = i; j < n; j++) {         
		x++;                               
	}
}

时间复杂度:T(n)=O()

常见时间复杂度的比较
O(1)


二、算法空间性能分析

空间复杂度:一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。 程序执行时所需存储空间包括以下两部分。  
(1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)) 其中n为问题的规模,S(n)表示空间复杂度。


有错误欢迎指出~

你可能感兴趣的:(数据结构)