一、前言
时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小,一般都用大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) 异或运算满足交换律和结合律
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130202.html