所有常数级的时间复杂度都用O(1)来表达
log2n这种时间复杂度出现在树中,比如一个3层的平衡度比较好的排序二叉树结点数为7,你查找某个数是否在这个树中,最多需要查找3次,大概就是log2n的时间复杂度.
二分查找的前提是序列是有序序列.
散列表
减少冲突的方法:可以把空间取的大一些,比如取余法中把余数设的大一些.
排序
稳定排序:值相等的两个或者多个元素,在排序后仍然保持之前的前后关系,这个就是稳定的.
比如图中的黑色的21在红色的21前面,排序后如果仍然还是这样,则是稳定.之所以要考虑这个,是因为数值相等,可能有别的属性不一致,有时候不想改变这个顺序.
内排序:指的是在内存中排序;
归并排序和基数排序考察概率比较小
直接插入排序
希尔排序
直接选择排序
堆排序:
主要用途:Top N问题.
所有的孩子结点都小于根结点,称为大顶堆.所有的孩子结点都大于根结点,称为小顶堆.
堆排序的原理:
比如建立起来小顶堆,则堆顶就是全局最小的值;把堆顶取走,再去构造堆,得到的就是第二小的值;以此类推,就能够得到排列好的序列.
初建堆的过程比较复杂,之后删掉根结点,再调整就会简单一些.
优势:更高效;
建堆过程:
首先将所有的元素按照完全二叉树的方式进行排列;将所有的非叶子结点选出来;从最后一个非叶子结点开始进行判断,看两个子节点是不是都小于它(比如此时要创建大顶堆),如果不是则进行交换;然后对倒数第二个非叶子结点也进行这样的判断,以此类推,如果调整后下面的结点不满足原则了,就再次调整.
调整堆过程:
当堆顶被取走后,将当前树中最后一个元素放到堆顶位置,然后再用向下比较的方式来依次开展.
归并排序