算法 - 打卡记录 | 前言

最近时间将针对算法进行体系性学习,后续将针对不同类型进行案例和算法心得的分享。本文开篇,聊下算法的几个常用的:

算法 - 打卡记录 | 前言

  • 算法体系
    • 评估算法优劣的核心指标
    • 常数项时间
    • 对数器
  • 常见排序
    • 冒泡
    • 插入排序
  • 本周刷题记录
    • 体系03
    • 体系02
    • 体系01
    • 大厂01

算法体系

算法 - 打卡记录 | 前言_第1张图片

评估算法优劣的核心指标

  1. 时间复杂度

  2. 额外空间复杂度

常数项时间

什么是时间复杂度?时间复杂度怎么估算?
只看表达式最高阶项的部分
当完成了表达式的建立,只要把最高阶项留下即可。低阶项都去掉,高阶项的系数也去掉。
记为: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); //排序完打印,程序员自己观察是否正确
    }
}

常见排序

冒泡

谁大谁往右,即便数据优良,也省不了所有的操作。

插入排序

理解为排好序的牌,然后重新摸到了一张牌,把它从头到尾比一下,放入到对应的位置
算法 - 打卡记录 | 前言_第2张图片算法 - 打卡记录 | 前言_第3张图片

本周刷题记录

进度: 本周应刷 14 道,实刷 14道。目标达成。
效率:用时16小时( 看视频8h+, 代码8h 左右)
本周在摸索适合的内容和方式,实践用时比较久需要提效。
下周试下先看题,然后看代码,个别地方翻视频看下。

体系03


[ 实现最小栈 ] 打卡 2022-04-17

[ 如何用栈结构实现队列结构 ] 打卡 2022-04-17

[ 如何用队列结构实现栈结构 ] 打卡 2022-04-17

[ 用递归方法求数组中的最大值 ] 打卡 2022-04-17

[ 把链表中的给定值都删除 ] 打卡 2022-04-17

[ 数组实现栈和队列 ] 打卡 2022-04-17

体系02


[ 如何不用额外变量交换两个数 ] 打卡 2022-04-13

[ 一个数组中出现了奇数次的数 ]

[ 提取整形数最右侧的1 ]

[ 一个数组中出现奇数次的两个数 ]

[ 一个数组中有一种数出现K次,其他数都出现了M次 ]

体系01


[ 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

大厂01


[ 一根长度为K的绳子,最多能盖住几个点 ] 打卡 2022-04-11

[ 清空所有怪兽需要的AOE技能次数 ]

494.[ 数组中添加加减运算符得到指定值的所有方法 ] [M]

PS: 本文为学习左神-《算法体系学习》记录的学习笔记,有兴趣的可以看左神视频~

你可能感兴趣的:(算法,算法)