持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情 下面是我整理的跟着b站左程云的数据结构与算法学习笔记,欢迎大家一起学习。
时间复杂度
操作与样本的数据量没有关系则为常数操作
时间复杂度是算法流程中,常数操作数量的指标,常用O表示,需要对算法流程熟悉,总结出常数操作数量的表达式并去掉最高项的系数和低阶项。即表达式An² + Bn +C,为O(n²)
评价算法好坏,先看时间复杂度的指标,再分析常数项指标
选择排序
选择排序: 即通过不断比较找到未排序数组的最小值并不断与排好序数组的下一个位置交换数值,即最小值放在数组首位,以此类推,直到整个数组遍历完。
代码实现
public void selectionSort(int[] arr){
if (arr==null||arr.length<2){
return;
}
for (int i = 0; i < arr.length-1; i++) {
int minIndex=i;
for (int j=i+1;j< arr.length;j++){
minIndex=arr[j]<arr[minIndex]?j:minIndex;
}
swap(arr, i, minIndex);
}
}
public static void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
冒泡排序
冒泡排序:最简单的排序,通过不断与后面数值比较并交换数值,数组在尾部排好位置并逐渐扩大向头部延伸,先排好最大值再不断缩小未排序数组的长度直到数组遍历完。
if (arr==null||arr.length<2){
return;
}
for (int i = arr.length-1; i >0 ; i--) {
for (int j = 0; j <i ; j++) {
if (arr[j]>arr[j+1]){
swap(arr, i, j);
}
}
}
}
public void swap(int[] arr,int i,int j){
arr[i]=arr[i]^arr[j];
arr[j]=arr[i]^arr[j];
//此时 arr[j]=arr[i]^arr[j]^arr[j]=arr[i]
arr[i]=arr[i]^arr[j];
//此时 arr[i]=arr[i]^arr[i]^arr[j]=arr[j]
}
补充一个知识点:异或
异或:相同为0,不同为1,为无进位相加 0^N=N N^N=0 满足交换以及结合律 与顺序无关,可以作为判断有奇数个1还是偶数个1 关于异或的练习:
- 只有一个数为奇数次,其余为偶数次,查询这个数,把所有数都异或,偶数个为0,异或结果则为这个数
- 有两个数为奇数,其余为偶数次,求这两个数 解题思路:先把所有数都异或一下,得到a异或b的结果r1,a!=b,在二进制表示上必有一位不相等,设为第n位,把所有第n位上相同的数划分在一起求异或得到a或者b的结果r2,将r1与r2异或得到所有结果
public void printOldNumber2(int[] arrs){
// 假设奇数分别为a或b
int eor=0;
for (int arr: arrs) {
eor^=arr;
}
//此时eor=a^b且不等于0
// eor必然有一位置上为1此位置上a与b不相同 提取出最右侧的1
int rightOne=eor&(~eor+1);
int onlyOne=0;
for (int arr:arrs) {
//可以为0或者1
if ((arr&rightOne)==1){
onlyOne^=arr;
}
}
System.out.println(onlyOne+""+(eor^onlyOne));
}
插入排序
通过不断扩大范围内数字的有序 即从0到0,再到n范围内的有序 数据状况不同,会导致算法的时间复杂度不一样 与选择排序,冒泡排序算法流程和数据状况没关系,不管什么样的数据状况,不影响后面进行固定的常数项操作 举两个例子,从7到1的自然是递增的插入排序时间复杂度为O(N^2) 而1到7插入排序时间复杂度仅为O(N) 时间复杂度按最坏的情况考虑 二分法还可以使用在
- 在一个有序数组中,找某个数是否存在
- 在一个有序数组中,找>=某个数最左侧的位置
- 局部最小值
对数器的概念及其使用
- 有两个办法,想要测的方法a,复杂度不好却很容易实现的方法b
- 实现一个随机样本产生器,把两个方法一起跑,看看结果是否一致,若有随机样本不一致,打印样本进行人工干预,分别对两个方法进行测试
- 当样本数量很多且测试都正确,可以确定a方法正确性
总结
通过学习视频注入自己的理解,加上自己敲代码,可以更高效的了解算法与数据结构之美,不断累积,最终可以达到意想不到的高度哦。