常用数据结构纵观

数据结构精要
本文总结了常见的排序算法如冒泡、选择、插入等,并对比了它们的时间与空间复杂度及稳定性。同时,还介绍了多种查找方法,包括顺序、折半、插值、斐波那契查找,以及哈希表的实现方法和冲突处理策略。
从学校开始到现在学习数据结构也有好久了,现在感觉需要总结一下
先总结一下
排序:

冒泡排序:
时间复杂度
平均情况:O(n^2)       最好情况:O(n)      最坏情况:O(n^2)
空间复杂度:O(1)
稳定性:稳定

简单选择排序:
时间复杂度
平均情况:O(n^2)       最好情况:O(n^2)      最坏情况:O(n^2)
空间复杂度:O(1)
稳定性:稳定

直接插入排序:
时间复杂度
平均情况:O(n^2)       最好情况:O(n)      最坏情况:O(n^2)
空间复杂度:O(1)
稳定性:稳定

希尔排序:
时间复杂度
平均情况:O(nlogn)~O(n^2)       最好情况:O(n^1.3)      最坏情况:O(n^2)
空间复杂度:O(1)
稳定性:不稳定

堆排序:
时间复杂度
平均情况:O(nlogn)       最好情况:O(nlogn)      最坏情况:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定

归并排序:
时间复杂度
平均情况:O(nlogn)        最好情况:O(nlogn)       最坏情况:O(nlogn)
空间复杂度:O(n)
稳定性:稳定


快速排序:
时间复杂度
平均情况:O(nlogn)        最好情况:O(nlogn)       最坏情况:O(n^2)
空间复杂度:O(logn) ~ O(n)
稳定性:不稳定 

其中,冒泡  简单选择  直接插入属于简单算法,希尔  堆  归并  快速属于改进算法。希尔排序相当于直接插入排序的升级,它们同属于插入排序类,堆排序相当于简单选择排序的升级,他们同属于选择排序类。而快速排序其实就是冒泡排序的升级,它们都属于交换排序类。

  查找:
顺序表查找:很简单就是从开头找到最后就行了。一般表都是无序的,所以时间复杂度就是O(1) ~ O(n)
有序表查找:
折半查找:mid = (low + high)/2
插值查找: mid = low + (high - low)*(key - a[low])/(a[high] - a[low])
斐波那契查找:mid = low + F[k - 1] - 1 (利用了斐波那契数组的黄金分割原理来实现的。)
三种有序表的查找本质上是分隔点的选择不同,各有各自的应用场合,在实际开发中要根据实际情况而定,但他们的平均时间复杂度均为O(logn)。
线性索引查找
稠密索引
分块索引(块内无序,块间有序)
倒排索引(根据关键字索引)

平衡二叉树:
平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.
二叉排序树:
二叉排序树,又称为二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树:
     若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;
     若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值;
它的左右子树也分别为二叉排序树。
平衡二叉树的查找 插入 删除的时间复杂度均为O(logn)
B树用于内存和外存之间的存取而专门设计的。
哈系表的方法实质上就是根据一定的方法去最有可能的地方去找人。比如找学生一定去学校啊,找警察要去警局。常用方法是:
直接定址法
数字分析法
平方取中法
折叠法
除留余数法
随机数法

处理哈系冲突的方法:
开放定址法:发生冲突就去寻找下一个空的散列地址。
再哈系法:需要多准备几个哈系函数。
链地址法:将冲突放在单链表中。
公共溢出区法:将冲突的都放在一个公共的地方。

单链表  循环链表   双向链表
栈  队列  循环队列 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值