简单数据结构总结及常用排序算法
来源:互联网 发布:c语言abs 是什么函数 编辑:程序博客网 时间:2024/06/05 19:21
排序
零、Colletion接口包含(List, Set, Map)
常数时间<O(LogN)<线性时间<大量时间
一、表、栈、队列
一般实现类型:1.数组2.链表
Java常用封装类:
List
ArrayList:插入、删除花费大量时间O(N^2),查找花费常数时间(末端插入的话与链表花费一样时间),搜索慢(花费线性时间)
LinkedList:插入、删除花费常数时间,查找效率不如数组,搜索慢(花费线性时间)
Stack
Queue
(都是Collection接口的,都可以用数组或链表来实现)
二、树
大部分操作的运行时间平均为O(logN)
a. 二叉树
二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。
二叉树的定义:二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2i-1个结点;深度为k的二叉树至多有2k-1个结点;对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
满二叉树和完全二叉树:
满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上。
满二叉树的性质:
1) 一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;
2) 叶子数为2h;
3) 第k层的结点数是:2k-1;
4) 总结点数是:2k-1,且总节点数一定是奇数。
完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。
注:完全二叉树是效率很高的数据结构,堆是一种完全二叉树或者近似完全二叉树,所以效率极高,像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化,二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树。
二叉树的性质:
1) 在非空二叉树中,第i层的结点总数不超过2i-1, i>=1;
2) 深度为h的二叉树最多有2h-1个结点(h>=1),最少有h个结点;
b. 二叉表达式树
c. 二叉查找树
二叉查找树定义:又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
二叉查找树的插入过程如下:
1) 若当前的二叉查找树为空,则插入的元素为根节点;
2) 若插入的元素值小于根节点值,则将元素插入到左子树中;
3) 若插入的元素值不小于根节点值,则将元素插入到右子树中。
二叉查找树的删除,分三种情况进行处理:
1) p为叶子节点,直接删除该节点,再修改其父节点的指针(注意分是根节点和不是根节点),如图a;
2) p为单支节点(即只有左子树或右子树)。让p的子树与p的父亲节点相连,删除p即可(注意分是根节点和不是根节点),如图b;
3) p的左子树和右子树均不空。找到p的后继y,因为y一定没有左子树,所以可以删除y,并让y的父亲节点成为y的右子树的父亲节点,并用y的值代替p的值;或者方法二是找到p的前驱x,x一定没有右子树,所以可以删除x,并让x的父亲节点成为y的左子树的父亲节点。如图c。
1.AVL(Adelson-Velskii and Landis)带平衡条件的二叉查找树
2.伸展树(splay tree),其基本想法是,当一个节点被访问后,它就要经过一系列AVL树的旋转被推到根上。
d. B树,M叉查找树
为节省磁盘访问次数而存在的树。几乎在所有的情况下,磁盘访问次数基本的决定了程序运行时间。于是。如果把磁盘访问次数减少一半,那么运行时间也将减半。
树的深度越深,磁盘访问次数越多,所以尽可能降低树的深度。
e. Java常用封装类
TreeSet, TreeMap(都是平衡二叉查找树<不是AVL,而是自顶向下的红黑树>)
- 简单数据结构总结及常用排序算法
- 数据结构常用排序算法总结
- 数据结构及简单算法的总结----之【排序】
- 数据结构几种常用排序算法总结
- 算法与数据结构-常用排序算法总结1-比较排序
- 算法与数据结构-常用排序算法总结2-计数排序
- 算法与数据结构-常用排序算法总结2-桶排序
- 常用排序算法总结及C源程序
- 常用排序算法总结及源码
- 算法与数据结构-常用排序算法总结2-基数排序
- 数据结构排序算法总结
- 数据结构排序算法总结
- 数据结构排序算法总结
- 数据结构排序算法总结
- 数据结构排序算法总结
- 数据结构:排序算法总结
- 【数据结构】排序算法总结
- 数据结构排序算法总结
- 进程间通信——信号量
- Activity的onStop和onPause的调用时机
- 笔记_递归调用的理解
- 数据结构–基本树
- C++ 数学小点
- 简单数据结构总结及常用排序算法
- LaTeX中的希腊字母输入
- shift+e 栅格捕捉
- 学习C++的一些笔记(四)
- LeetCode题目:Palindrome Number
- 南阳理工2017第三届校赛总结!
- 第十七周:( Sicily1083) Networking(c++)
- Linux CAN说明文档
- kali2.0配置msf连接postgresql数据库