存储结构:
逻辑结构:
集合:元素之间没有任何逻辑关系
线性结构:
线性表:
功能受限的表:
非线性的结构:
树:
二叉树的性质:
性质1:二叉树的第i层上至多有2^(i-1)(i≥1)个节点。
满二叉树:每层的节点数都是2^(i-1)
完全二叉树:
1、深度为k,有n个节点的二叉树当且仅当齐每一个节点都与深度为k的满二叉树编号从1到n的节点一一对应时。
2、除了最后一层外,其余每一层都是满的,最后一层的节点必须从左到右分布。
3、如果所有的节点都满足从上到下、从左到右分布,就是满二叉树。
性质2:深度为h的二叉树中至多含有(2^h)-1个节点。
性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1。
性质4:具有n个节点的完全二叉树深为log2x+1(其中x表示不大于n的最大整数)。
性质5:若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点:
当i=1时,该节点为根,它无双亲节点。
当i>1时,该节点的双亲节点的编号为i/2。
若2i≤n,则有编号为2i的左节点,否则没有左节点。
若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点。
二叉树的分类:
二叉树的存储:
二叉树的遍历:
二叉树的操作:构建、销毁、插入、遍历、高度、密度、删除、求根、求左右
图:有穷且非空的顶点与顶点之间的边组成的集合
无向图:
边用(A,B)方式表示,点与点之间是互通的
在无向图中任意两个顶点之间都有边,该图称为无向完全图,则含有n个顶点的无向完全图有 n*(n-1)/2 条边
有向图:
边用<A,B>方式表示,仅表示从A点到B点有边,有向图的边也叫做弧,A是弧尾,B是弧头
在有向图中任意两个顶点之间都有两条方向相反的弧,这种图称为有向完全图
含有n个顶点的有向完全图有 n*(n-1) 条边
注意:不讨论顶点到自身的边,而且也不讨论重复出现的边,这种图叫简单图,数据结构中只研究简单图
图中点多边少:叫做稀疏图,反之叫做稠密图。
图中顶点到顶点之间的边如果带上数据,这些数据叫做边的权重,带权重的图称为带权图,也叫网。
各种图的定义:
路径:从顶点到另一个顶点,经过的边叫做路径,边的数量叫做该路径的长度。
环:图中有某个顶点最后能通过边绕回该点
回路:专指有向图,从某点出发,最终又有弧能够回到该点,如果某点只有输出,没有输入时,该点一定没有回路
注意:顶点序列中不重复出现的路径称为简单路径
存储结构和图的遍历:
算法:算法是解决特定问题求解决步骤的描述,再计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
基本定义:输入、输出、又穷性、确定性、可行性
输入:算法具有零个或多个输入
输出:算法至少有一个或多个输出
有穷性:指算法再执行有限的步骤之后,自动结束而不会出现无心循环,并且每一个步骤再可接受的时间内完成
确定性:算法的每一个步骤都具有确定的意义,不会出现二义性
可行性:算法的每一步都必须是可行的,也就是说,每一步都能通过执行有限次数完成
查找算法:
排序算法:
冒泡:
数组左右进行比较,把最大的数据交换到最后。
特点:该算法堆数据的有序性敏感,在排序过程中发现数据有序,可以立即停止,
如果待排序的数据基本有序时,冒泡的效率非常高。
时间复杂度:最优:O(n) 平均(最差):O(n²)
稳定的
选择:
假定最开始的位置是最小值,并记录下标min,然后与后面的数据比较,如果有比min下标的数据更小,
则更新min,最后如果min的值发生变化,则交换min为下标的数据与最开始位置的数据
与冒泡相比:交换次数少,运行速度较快
是冒泡的一种变种,但对数据的有序性不敏感,因此数据较混乱时比冒泡快
时间复杂度:O(n²)
不稳定的 eg. [10 10 1]
插入:
把数据看成两部分,一部分是有序的,把剩余部分的数据逐个插入,知道插完就全部有序了。
适合对已经排序好的数据,新增数据并重新排序
时间复杂度:O(n²)
稳定的
希尔:
是插入排序的升级版,由于插入排序时,数据移动的速度比较慢,所以增加了增量的概念,
以此提高排序的速度,数据量越多,比插入的速度越快。
时间复杂度:O(n²)
不稳定的
快速:
找到一个标杆,备份标杆的值,一面从左边找比标杆大的数,将找到的数据赋值给标杆位置,更新标杆放入位置到左左标杆处,在从右边找比标杆小的数据,如果找到也把数据赋值给标杆位置,更新标杆的位置到右标杆处,多次重复以上过程,直到左右标杆相遇,最后在相遇处还原标杆的值,最终达到标杆左右两边整体有序,然后按照同样的方法去排序左,右部分,最终全部有序。
它的综合性能最优,因此叫做快速排序,笔试中考的比较多的排序算法
时间复杂度:O(nlog)
归并:
先把待排序的数据拆分成单独的个体,然后按照从小到大的顺序合并复制到临时内存中,
最终全部合并结束后再从临时内存赋值给原内存。
由于需要使用额外的内存空间,因此避免了数据交换时的耗时,是一种典型的用空间换时间的算法
时间复杂度:O(nlogn)
稳定的
堆:
把数据当做完全二叉树,然后把树调整成大顶堆,再把根节点的数据交换到最后,然后数量-1,
然后剩余部分重新调整成大顶堆,重复以上步骤,直到数量为1时结束
计数:
先找出数据中的最大值、最小值,创建哈希表,用 最大值-最小值+1 作为哈希表的长度,
使用 数据-最小值 作为哈希表的下标访问哈希表并标记+1;然后遍历哈希表,当表中的值非零时,
把该 下标+最小值 还原会原来的数据依次放回原数组中,最终排序完成。
是一种典型的用空间换时间的算法,该算法理论上速度可以非常快,但是有很大的局限性,适合排序整型数据,
而且数据的差值不宜太大,否则会非常浪费内存,适合数据较为平均,重复数较多的排序
时间复杂度 O(n+k)
稳定的
桶:
把数据根据值的范围,存储到不同范围的桶中,然后调用其它的排序算法,对桶中的数据进行排序,
排序结束后再拷贝回原数组中,以此降低排序规模来降低排序的时间,是一种典型的以空间换时间的算法。
缺点:如何分桶、桶的范围定义多大,这些都需要对数据有一定的了解
时间复杂度 O(n+k)
稳定的
基数:
是桶排序的具体实现,首先创建10个队列,然后逆序计算出数据的个十百千...位,然后按照每位对应的数据
压入到对应的队列中,某位入队结束后,按照队列的顺序出队储存回原数组中