算法稳定性分析。
一般研究算法性能会考虑复杂度问题居多,此外也会有算法的稳定性分析。
稳定性
根据个人研读论文后的浅薄观点归纳得到,【会一直更新】
对于一般的处理算法而言,稳定性主要由以下方面衡量:
1、当随着样本数量增加,或者试验次数的增加,算法的输出结果与精确解(期望解)相差不大,则可以说该算法是稳定的算法。
2、当输入信号不同时,算法如果都可以输出令人满意的解,则可以说该算法是稳定的。
3、如果可以证明该算法能够得到,并且始终得到全局最优解,可以说该算法是稳定的。
有时候稳定性也可以当作是鲁棒性理解。
排序算法
在网络上搜索算法稳定性分析,结果都是排序算法相关,在此也简单记录一下吧。
稳定性是针对数组中两个相等值的元素而言的。若两个相等元素排序前后相对位置没有改变,则说这个排序算法是稳定的。
常见算法的稳定性总结:
- 插入排序:稳定。(在一个已经有序的小序列的基础上,一次插入一个元素。从有序序列的末尾开始比较,把待插入的元素和已经有序的最大者开始比起,比它大则直接插入在其后面。)
- 冒泡排序:稳定。(每次只交换相邻的两个元素,把小的元素往前调,若两个元素相等将不会进行交换)
- 归并排序:稳定。(采用分治法(Divide and Conquer)的典型应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。)
- 基数排序:稳定。(基数排序就是,先按低位排序,逐次按高位排序,那么低位相同的数据元素其先后位置顺序即使在高位也相同时是不会改变的。)
- 选择排序:不稳定。(给每个位置选择待排序元素中当前最小的元素。例:序列3 8 3 2 9,第一遍选择第1个元素3会和2交换,原序列中两个3的相对前后顺序就改变了)
- 快速排序:不稳定。(快速排序有两个方向,左边的i下标一直往右走(当条件a[i] <= a[center_index]时))
- 希尔排序:不稳定。(按照不同步长对元素进行插入排序)
- 堆排序:不稳定。(一个长为n的序列,堆排序的过程是从第n/2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆)。当为n/2-1, n/2-2, ...1这些个父节点选择元素时,就会破坏稳定性。)
堆的结构是节点i的孩子为2*i和2*i+1节点,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父节点小于等于其2个子节点。