1. 数据结构介绍
数据结构(英语:data structure)是计算机中存储、组织数据的方式。
数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。
简单来说,数据结构是对大规模的数据进行一个合理的规划,提高操作效率。
常见的数据结构
- 栈(Stack):栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。
- 队列(Queue):队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。
- 数组(Array):数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。
- 链表(Linked List):链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。
- 树(Tree):树是典型的非线性结构,它是包括,2 个结点的有穷集合 K。
- 图(Graph):图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。
- 堆(Heap):堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。
- 散列表(Hash table):散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记录。
2.时间复杂度
描述算法运行时间的函数。
假设算法要处理的数据总量为x,x足够大。算法为了某种目的(查找,删除,添加...)消耗的计算次数为y.
- y=ax+b a是系数,b是常数 当x足够大,a b的值不足以影响x y和x直接相关 y=x O(n)
- y=ax^2+bx+c ab是系数,c是常数 当x足够大,abc的值不足以影响x y和x^2直接相关 y=x^2 O(n^2)
- y=a a是常数 当x足够大,a 的值不足以影响x y和x无关 y=1 O(1)
- a^y=x y=logax O(logn)
2.1 长度为x的无序数组,从中找一个值a,求时间复杂度
第一个:查找的次数为1
第二个:查找的次数为2
....
最后一个:查找次数x
取平均:x/2
y=x/2 y=x O(n)
2.2 从1加到n求时间复杂度
x=1
for(int i=2;i<=n;i++){
x=x+i;
}
y=x O(n)
用等差数列求和公式
sum=(1+n)*n/2
y=1 O(1)
2.3 冒泡排序 对数组进行排序
原理:前后两两数据进行比较,大的数据往后走,小的数据往前走,一轮结束之后,一个数据到达正确位置。
第一轮:比较了x-1
第二轮:比较了x-2
第三轮:比较了x-3
第x-1轮:1
y=(x-1)+(x-2)+(x-3)+...+1
y=(x-1+1)*(x-1)/2=x*(x-1)/2=x^2/2-x/2
y=x^2 O(n/2)
2.4 有序数组用二分查找法查找数据
mid=(left+right)/2
left<=right
right=mid-1
left=mid+1
第一轮:left和right所取范围内数据总量为x x/2^0 比较次数为1
第二轮:left和right所取范围内数据总量为x/2 x/2^1 比较次数为1
第三轮:left和right所取范围内数据总量为x/2/2 x/2^2 比较次数为1
第四轮:left和right所取范围内数据总量为x/2/2/2 x/2^3 比较次数为1
...
第k轮:left和right所取范围内数据总量为... 1 比较次数为1 y=log2x O(logn)
x/2^(k-1)
x/2^(k-1)=1
2^(k-1)=x
k=log2x
总结:
快速判断时间复杂度:
确定数据总量n
直接对数据规模下手 O(n)
k层关于n的循环 O(n^k)
循环减半O(logn)
2.5 数组
根据下标获取值O(1)
无序数组查找O(n)
2.5.1 无序数组查找降低时间复杂度
方法一:有序数组二分查找法O(logn)
排序O(n^2)+二分查找O(logn)
方法二:通过某一个算法决定数据要插入的位置---->位置=n%arr.length
哈希算法
哈希表
两个不同的数值计算出来在同一个位置----->拉链法:在这个位置加入链表
哈希碰撞
链表长度不长O(1),链表很长O(n)
2.5.1.1 链表
单向链表
双向链表
方法三:有序二叉树
一个节点左边的值要比当前节点小,右边节点的值要比当前节点值大
10 5 20 8 15 30 1
第一层 1 2^0
第二层 2 2^1
第三层 4 2^2
第四层 8 2^3
....
第k层 2^(k-1)
x=2^0+2^1+2^2+...+2^(k-1)
x=2^k-1
k=log2x O(logn)
1 2 3 4 5 6
不稳定
平衡二叉树
一个节点左边的值要比当前节点小,右边节点的值比当前节点值大
一个节点左边子树的高度 和右边子树的高度 高度差的绝对值不超过1
LL LR RR RL
LL
LR型旋转
RR型旋转
RL型旋转