算法---二分搜索
1.从数组的中间元素开始,如果中间元素正好是x,查找成功.
2.否则我们利用中间位置将数组分为前\后两个子数组
如果x小于中间位置的元素,则进一步查找前一个子数组
否则进一步查找后一个子数组
3.重复以上步骤,直到找到满足条件的元素,或直到子数组不存在为止,代表查找不成功
时间复杂度BigO
算法的渐进时间复杂度
T(n)=O(f(n))
常见时间复杂度
O(1+3N)=O(N)
O(n^2)
O(n+n^2)=O(n^2)
O(1)
O(n)
O(logN)
2^K=n
K=logN
O(nlogN)
O(n^2)
O(nm)
空间复杂度
内存空间增长的趋势
常见空间复杂度
O(1)
O(n)
(还有一种时二维数组的循环,复杂度为O(n^2))
时间空间复杂度=时间和空间增长的趋势
排序
插入排序 Insertion Sort
在插入排序中,我们从前到后一次处理未排好序的元素,对于每个元素,我们将它与之前排好序的元素进行比较,找到对应的位置后并插入.
步骤:
1.从第二个元素(第一个要排序的新元素)开始,从后向前扫描之前的元素序列
2.如果当前扫描的元素大于新元素,将扫描元素移动到下一位
3.重复步骤2,直到找到一个小于或者等于新元素的位置
4.将新元素插入到该位置
5.对于之后的元素重复步骤1-4
function insertion_sort(array[]):
for(i-1;i<array.length;i++):
cur=array[i]
j=i-1
while(j>=0 && array[j]>cur):
array[j+1]=array[j]
j--
array[j+1]=cur
快排 QuickSort
分治特点
步骤:
1.对于当前的数组,取最后一个元素当做基准数
2.将所有比基准数晓得元素排到基准数之前,比基准数大的排在基准数之后
3.当基准数被放到准确的位置之后,根据基准数的位置将元素且分为前后两个子数组
4.对子数组采用步骤1-4的递归操作,直到子数组的长度小于等于1为止
归并排序 MergeSort
在此算法中,我们将一个数组分为两个子数组.通过递归重复将数组切分到只剩下一个元素为止,然后将每个子数组中的元素排序后合并,通过不断合并子数组,最后就会拿到一个排好序的大数组
链表
特点:1.序列性的数据结构 2.数据域+ next指针
链表的类型:
堆栈的概念
堆栈一端固定,一段浮动,所有数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照"先进后出"的原则存取.(队列是按照"先进先出")
堆,一般由程序员分配释放,存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收).
栈,由操作系统自动分配释放,使用一级缓存,通常都是被调用时处于存储空间,调用完后立即释放
哈希表
哈希函数
树的种类
1.二叉树(Binary Tree):每个节点最多含有两个子节点
2.满二叉树(Full Binary Tree):在满二叉树中,每个不是尾节点的节点都有两个子节点
3.完全二叉树(Complete Binary Tree):假设一个二叉树深度(depth)为d(d>1),除了第d层外,其他各层的节点数量均已达到最大值,且第d层所有节点从左向右紧密排列,这样的二叉树就是完全二叉树
4.排序二叉树(BinarySearchTree):在此树中,每个节点的数值比左子树上的每个节点都大,比所有右子树上的节点都小.
5.平衡二叉树(AVL Tree) :任何节点的两颗子树的高度差不大于1的排序二叉树
6.B树(B-tree):B树和平衡二叉树一样,只不过它是一种多叉树(一个节点的子节点数量可以超过二)
7.红黑树(red-black Tree):是一种自平衡二叉寻找树
遍历树的方法
1.pre-order Traversal 先序:先访问节点自己,然后访问左子树,最后再访问右子树
2.in-order Traversal 中序:先访问左子树上的节点,再访问自己,最后再访问右子树上的节点
3.Post-order Traversal 后序:先访问左右子树,最后在访问自己