最近时间将针对算法进行体系性学习,后续将针对不同类型进行案例和算法心得的分享。本文开篇,聊下算法的几个常用的:
时间复杂度
额外空间复杂度
什么是时间复杂度?时间复杂度怎么估算?
只看表达式最高阶项的部分
当完成了表达式的建立,只要把最高阶项留下即可。低阶项都去掉,高阶项的系数也去掉。
记为:O(忽略掉系数的高阶项)
1,想要测的方法a
2,实现复杂度不好但是容易实现的方法b
3,实现一个随机样本产生器
4,把方法a和方法b跑相同的随机样本,看看得到的结果是否一样
5,如果有一个随机样本使得比对结果不一致,打印样本进行人工干预,改对方法a和方法b
6,当样本数量很多时比对测试依然正确,可以确定方法a已经正确。
场景
用两种方法排序,然后把不一样的结果打出来。这样就选出来不一致的部分,再进行算法调整
代码
我想验证冒泡对不对,我生成一些随机数用 Arrays.sort(arr) 排完的结果来比较,不一致的打印出来再调整。
public class ComparatorTest {
//冒泡排序 方法a
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int end = arr.length-1; end > 0; end--) {
for (int i = 0; i < end; i++) {
if (arr[i] > arr[i+1]) {
swap(arr,i,i+1);
}
}
}
}
public static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] -arr[j];
arr[i] = arr[i] - arr[j];
}
//for test
public static void comparator(int[] arr) {
//方法b
Arrays.sort(arr);
}
//for test
//生成随机数组
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; //长度随机
for (int i = 0; i < arr.length; i++) {
//值随机
arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
}
return arr;
}
//for test
//复制数组
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
//比较两数组是否相同
public static boolean isEqual(int[] arr1, int[] arr2) {
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1 == null || arr2 == null) {
return false;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
//打印数组
public static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
//for test
public static void main(String[] args) {
int testTime = 500000; //测试次数
int maxSize = 100; //最大测试容量
int maxValue = 100; //最大测试数据
boolean succeed = true; //是否对比成功
//开始测试
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
bubbleSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
break;
}
}
System.out.println(succeed ? "Nice" : "Bad");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr); //没排序打印
bubbleSort(arr); //排序
printArray(arr); //排序完打印,程序员自己观察是否正确
}
}
谁大谁往右,即便数据优良,也省不了所有的操作。
理解为排好序的牌,然后重新摸到了一张牌,把它从头到尾比一下,放入到对应的位置
–
进度: 本周应刷 14 道,实刷 14道。目标达成。
效率:用时16小时( 看视频8h+, 代码8h 左右)
本周在摸索适合的内容和方式,实践用时比较久需要提效。
下周试下先看题,然后看代码,个别地方翻视频看下。
[ 实现最小栈 ] 打卡
2022-04-17
[ 如何用栈结构实现队列结构 ] 打卡
2022-04-17
[ 如何用队列结构实现栈结构 ] 打卡
2022-04-17
[ 用递归方法求数组中的最大值 ] 打卡
2022-04-17
[ 把链表中的给定值都删除 ] 打卡
2022-04-17
[ 数组实现栈和队列 ] 打卡
2022-04-17
[ 如何不用额外变量交换两个数 ] 打卡
2022-04-13
[ 一个数组中出现了奇数次的数 ]
[ 提取整形数最右侧的1 ]
[ 一个数组中出现奇数次的两个数 ]
[ 一个数组中有一种数出现K次,其他数都出现了M次 ]
[ class01 移动GB ] 打卡
2022-04-12
[ class01数文件夹1 ] 打卡
2022-04-12
[ class01数文件夹2 ] 打卡
2022-04-12
[ 数组 加减法得到target 1] 打卡
2022-04-15
[ 数组 加减法得到target 2] 打卡
2022-04-15
[ leetCode206:反转链表 ] 打卡
2022-04-11
[ 一根长度为K的绳子,最多能盖住几个点 ] 打卡
2022-04-11
[ 清空所有怪兽需要的AOE技能次数 ]
494.[ 数组中添加加减运算符得到指定值的所有方法 ] [M]
PS: 本文为学习左神-《算法体系学习》记录的学习笔记,有兴趣的可以看左神视频~