一、前言
时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小,一般都用大O表示法来表示,记作:T(n)=O(f(n)),都是评估算法的核心指标,评估算法优劣的核心指标除了时间和空间复杂度,还包含常数项时间,其中时间和空间复杂度主要由执行流程决定,常数项时间主要有时间细节决定。下文中我们将一一介绍。
二、评估算法优劣的核心指标
1.常数时间的操作
如果一个操作的执行时间不以具体样本量为转移,每次执行时间都是固定时间,称这样的操作常数时间的操作。
2.时间复杂度
时间复杂度,本质上是统计在整个执行流程中发生了多少次常数操作,最终会忽略低阶项和常数时间,只保留高阶项,并忽略高阶项的系数,当N趋向于无穷大的时候,低阶项和高阶项的系数已经影响极小了 。
3.空间复杂度
三、算法的分析方法
四、常见排序方法分析
1.选择排序
思路分析:
代码实现:
public static void main(String[] args) {
int[] array = new int[]{5,2,6,3,1};
for(int i=0;i<array.length-1;i++){
// 最小值的位置
int min = i;
for(int j=i+1;j<array.length;j++){
if(array[j]<array[min]){
int temp = array[j];
array[j]= array[min];
array[min] = temp;
}
}
}
System.out.println(Arrays.toString(array));
}
2.冒泡排序
思路分析:
代码实现:
public static void main(String[] args) {
int[] array = new int[]{5,2,6,3,1};
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-i-1;j++){
if(array[j]>array[j+1]){
int temp = array[j];
array[j]= array[j+1];
array[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(array));
}
3.插入排序
思路分析:
代码实现:
public static void main(String[] args) {
int[] array = new int[]{5,2,6,3,1,9};
for(int i=1;i<array.length;i++){
for(int j=0;j<i;j++){
if(array[i]<array[j]){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
System.out.println(Arrays.toString(array));
}
五、真题解析
1.题目
一个数组中有两种数出现了奇数次,其他次数都出现了偶数次,怎么找到并打印这两种数。(禁止使用遍历逐个统计的方法)
2.解题代码展示
public static void main(String[] args) {
int[] array = new int[]{5,5,6,1,1,9,9,7};
int eor=0;
for(int i=0;i<array.length;i++){
eor^=array[i];
}
// eor = a^b
// eor!=0;
// eor必然有一个位置上是1。提出最右侧的1
int rightone=eor&(~eor+1);
int onlyone=0;
for(int i=0;i<array.length;i++){
if((array[i]&rightone)==0){
onlyone^=array[i];
}
}
System.out.println(onlyone);
System.out.println(eor^onlyone);
}
3.知识补充
异或运算^
异或运算:相同为0,不同为1
同或运算:相同为1,不同为0
总结一句话:异或运算就是无进位相加
两个重要的性质:
(1) 0^N=N, N^N=0
(2) 异或运算满足交换律和结合律