排序

news2024/12/28 19:13:40

章节目录:

    • 一、排序算法
      • 1.1 概述
      • 1.2 分类
      • 1.3 算法复杂度
      • 1.4 时间复杂度
      • 1.5 空间复杂度
    • 二、冒泡排序
      • 2.1 概述
      • 2.2 算法分析
      • 2.3 代码示例
    • 三、选择排序
      • 3.1 概述
      • 3.2 算法分析
      • 3.3 代码示例
    • 四、插入排序
      • 4.1 概述
      • 4.2 算法分析
      • 4.3 代码示例
    • 五、希尔排序
      • 5.1 概述
      • 5.2 算法分析
      • 5.3 代码示例
    • 六、快速排序
      • 6.1 概述
      • 6.2 算法分析
      • 6.3 代码示例
    • 七、归并排序
      • 7.1 概述
      • 7.2 算法分析
      • 7.3 代码示例
    • 八、基数排序
      • 8.1 概述
      • 8.2 算法分析
      • 8.3 代码示例
    • 九、排序总结与对比
    • 十、结束语

一、排序算法

1.1 概述

  • 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程
  • 它是《数据结构与算法》中最基本的算法之一。

1.2 分类

  • 内部排序:指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。

  • 外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。

  • 示意图

排序导图

1.3 算法复杂度

算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间空间复杂度。

  • 时间复杂度是指执行算法所需要的计算工作量
  • 空间复杂度是指执行这个算法所需要的内存空间

1.4 时间复杂度

  • 在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。

  • 一般情况下,算法中的基本操作语句的重复执行次数是问题规模 n 的某个函数,用 T(n)表示,若有某个辅 助函数 f(n),使得当 n 趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称 f(n)是 T(n)的同数量级函数。 记作 T(n)=O( f(n) ),称O( f(n) ) 为算法的渐进时间复杂度,简称时间复杂度。

  • T(n) 不同,但时间复杂度可能相同。 如:T(n)=n²+7n+6 与 T(n)=3n²+2n+2 它们的 T(n) 不同,但时间复杂 度相同,都为 O(n²)

  • 计算方法

    • 常数 1 代替运行时间中的所有加法常数: T(n)=n²+7n+6 => T(n)=n²+7n+1

    • 修改后的运行次数函数中,只保留最高阶项 :T(n)=n²+7n+1 => T(n) = n²

    • 去除最高阶项的系数: T(n) = n² => T(n) = n² => O(n²)

  • 常见的时间复杂度

    • 常数阶 O(1)
    • 对数阶 O(log2n)
    • 线性阶 O(n)
    • 线性对数阶 O(nlog2n)
    • 平方阶 O(n^2)
    • 立方阶 O(n^3)
    • k 次方阶 O(n^k)
    • 指数阶 O(2^n)
  • 示意图

在这里插入图片描述

  • 常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)< Ο(nk) < Ο(2n) ,随着问题规模 n 的不断增大,上述时间复杂度不断增大,算法的执行效率越低
  • 从图中可见,我们应该尽可能避免使用指数阶的算法

1.5 空间复杂度

  • 类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间,它也是问题规模 n 的函数。
  • 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用的临时工作单元数与解决问题的规模 n 有关,它随着 n 的增大而增大,当 n 较大时,将占用较多的存储单元,例如快速排序和归并排序算法, 基数排序就属于这种情况。
  • 在做算法分析时,主要讨论的是时间复杂度。从用户使用体验上看,更看重的程序执行的速度。一些缓存产品(redismemcache)和算法(基数排序)本质就是用空间换时间

二、冒泡排序

2.1 概述

  • 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
  • 这个算法的名字由来是因为越小的元素会经由交换慢慢""到数列的顶端。
  • 示意图

2.2 算法分析

  1. 比较相邻的元素,如果第一个比第二个大,就交换它们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

2.3 代码示例

备注:这里我准备了一个产生随机整数数组的方法,是为了用于测试验证。

public class SortUtil {

    private SortUtil() {

    }

    private static final SecureRandom RANDOM = new SecureRandom();

    /**
     * 得到随机整数数组。
     *
     * @param num   需要多少个随机数
     * @param bound 随机数的边界值
     * @return {@link int[]}
     */
    public static int[] getRandomArray(int num, int bound) {
        int[] array = new int[num];
        for (int i = 0; i < array.length; i++) {
            int r = RANDOM.nextInt(bound);
            array[i] = r;
        }
        return array;
    }
}
  • 冒泡排序实现
public class BubbleSort {

    public static void main(String[] args) {
        // 创建长度为10,由100以内随机整数组成的数组。
        int[] array = SortUtil.getRandomArray(10, 100);
        System.out.println(Arrays.toString(array));
        // [67, 92, 42, 79, 45, 7, 62, 40, 94, 13]
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
        // [7, 13, 40, 42, 45, 62, 67, 79, 92, 94]
    }

    public static void bubbleSort(int[] array) {
        int len = array.length - 1;
        int temp;
        boolean notChange;
        for (int i = 0; i < len; i++) {
            notChange = true;
            for (int j = 0; j < (len - i); j++) {
                // 与后一位数进行比较,如果大于后一位数则向后移动。
                if (array[j] > array[j + 1]) {
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;

                    // 本次循环,位置发生了变化。
                    notChange = false;
                }
            }

            if (notChange) {
                break;
            }
        }
    }
}

三、选择排序

3.1 概述

  • 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。
  • 所以用到它的时候,数据规模越小越好。唯一的好处就是不占用额外的内存空间
  • 示意图

3.2 算法分析

  1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 重复第二步,直到所有元素均排序完毕。

3.3 代码示例

public class SelectionSort {

    public static void main(String[] args) {
        int[] array = SortUtil.getRandomArray(10, 100);
        System.out.println(Arrays.toString(array));
        // [42, 27, 13, 64, 87, 77, 96, 95, 5, 39]
        selectionSort(array);
        System.out.println(Arrays.toString(array));
        // [5, 13, 27, 39, 42, 64, 77, 87, 95, 96]
    }

    public static void selectionSort(int[] array) {
        int minIndex;
        int temp;
        for (int i = 0; i < array.length - 1; i++) {
            // 假设当前为最小索引。
            minIndex = i;
            // 从当前假设的索引开始往后找。
            for (int j = (i + 1); j < array.length; j++) {
                if (array[j] < array[minIndex]) {
                    // 找到最小索引。
                    minIndex = j;
                }
            }
            temp = array[i];
            array[i] = array[minIndex];
            array[minIndex] = temp;
        }
    }
}

四、插入排序

4.1 概述

  • 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。
  • 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
  • 示意图

4.2 算法分析

  • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

4.3 代码示例

public class InsertSort {

    public static void main(String[] args) {
        int[] array = SortUtil.getRandomArray(10, 100);
        System.out.println(Arrays.toString(array));
        // [2, 74, 96, 10, 50, 49, 82, 27, 86, 59]
        insertSort(array);
        System.out.println(Arrays.toString(array));
        // [2, 10, 27, 49, 50, 59, 74, 82, 86, 96]
    }

    public static void insertSort(int[] array) {
        int cur;
        int preIndex;
        // 从第二个元素开始。
        for (int i = 1; i < array.length; i++) {
            cur = array[i];
            preIndex = i - 1;
            // 寻找插入位置。
            while (preIndex >= 0 && cur < array[preIndex]) {
                array[preIndex + 1] = array[preIndex];
                preIndex--;
            }

            if (preIndex + 1 != i) {
                array[preIndex + 1] = cur;
            }
        }
    }
}

五、希尔排序

5.1 概述

  • 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素
  • 希尔排序又叫缩小增量排序。
  • 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
  • 示意图

在这里插入图片描述

5.2 算法分析

  1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列个数k,对序列进行k 趟排序;
  3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

5.3 代码示例

public class ShellSort {

    public static void main(String[] args) {
        int[] array = SortUtil.getRandomArray(10, 100);
        System.out.println(Arrays.toString(array));
        // [9, 4, 20, 20, 84, 94, 74, 15, 31, 46]
        shellSort(array);
        System.out.println(Arrays.toString(array));
        // [4, 9, 15, 20, 20, 31, 46, 74, 84, 94]
    }

    public static void shellSort(int[] array) {
        int temp;
        // 分割。
        for (int gap = (array.length / 2); gap > 0; gap /= 2) {
            // 分好的每组元素。
            for (int i = gap; i < array.length; i++) {
                for (int j = i - gap; j >= 0; j -= gap) {
                    // 换位。
                    if (array[j] > array[j + gap]){
                        temp = array[j];
                        array[j] = array[j + gap];
                        array[j + gap] = temp;
                    }
                }
            }
        }
    }
}

六、快速排序

6.1 概述

  • 快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
  • 示意图

6.2 算法分析

备注:上述示意图演示的基准为最左端黄色高亮标记值,而接下来的代码示例为中间值。

  1. 从数列中挑出一个元素,称为 “基准”(pivot);
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆放在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

6.3 代码示例

public class QuickSort {

    public static void main(String[] args) {
        int[] array = SortUtil.getRandomArray(10, 100);
        System.out.println(Arrays.toString(array));
        // [22, 2, 97, 28, 92, 97, 47, 48, 3, 62]
        quickSort(array, 0, array.length - 1);
        System.out.println(Arrays.toString(array));
        // [2, 3, 22, 28, 47, 48, 62, 92, 97, 97]
    }

    public static void quickSort(int[] array, int left, int right) {
        // 左右下标及中轴值。
        int l = left;
        int r = right;
        int pivot = array[(left + right) / 2];

        int temp;

        // 按照左边小于中轴值,右边大于中轴值进行分区。
        while (l < r) {
            while (array[l] < pivot) {
                l++;
            }
            while (array[r] > pivot) {
                r--;
            }

            // 分区结束,退出循环。
            if (l >= r) {
                break;
            }

            // 交换值。
            temp = array[l];
            array[l] = array[r];
            array[r] = temp;

            // 如果左边值与中轴值相等,则前移;右边值与中轴值相等,则后移。
            if (array[l] == pivot) {
                r--;
            }
            if (array[r] == pivot) {
                l++;
            }
        }

        // 避免栈溢出。
        if (l == r) {
            r--;
            l++;
        }

        // 向左向右进行递归。
        if (left < r) {
            quickSort(array, left, r);
        }
        if (right > l) {
            quickSort(array, l, right);
        }
    }
}

七、归并排序

7.1 概述

  • 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

  • 分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修

    补"在一起,即分而治之。

  • 示意图

在这里插入图片描述

7.2 算法分析

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
  4. 重复步骤 3 直到某一指针达到序列尾;
  5. 将另一序列剩下的所有元素直接复制到合并序列尾。

7.3 代码示例

public class MergeSort {

    public static void main(String[] args) {
        int[] array = SortUtil.getRandomArray(10, 100);
        System.out.println(Arrays.toString(array));
        // [23, 43, 55, 86, 36, 22, 81, 87, 77, 50]
        mergeSort(array, 0, array.length - 1);
        System.out.println(Arrays.toString(array));
        // [22, 23, 36, 43, 50, 55, 77, 81, 86, 87]
    }

    public static void mergeSort(int[] array, int left, int right) {
        if (left < right) {
            int mid = (left + right) / 2;
            // 向左递归。
            mergeSort(array, left, mid);
            // 向右递归。
            mergeSort(array, mid + 1, right);
            // 合并。
            merge(array, left, mid, right);
        }

    }

    public static void merge(int[] array, int left, int mid, int right) {
        // 准备临时数组及索引(用于存放归并过程的元素)。
        int[] temp = new int[array.length];
        int i = 0;

        // 初始化左右起始索引。
        int l = left;
        int r = mid + 1;


        //(一)
        //先把左右两边(有序)的数据按照规则填充到temp数组,直到左右两边的有序序列,有一边处理完毕为止。
        while (l <= mid && r <= right) {
            //如果左边的有序序列的当前元素,小于等于右边有序序列的当前元素,即将左边的当前元素,填充到 temp数组。
            if (array[l] <= array[r]) {
                temp[i] = array[l];
                i++;
                l++;
            } else {
                temp[i] = array[r];
                i++;
                r++;
            }
        }

        //(二)
        //把有剩余数据的一边的数据依次全部填充到temp
        while (l <= mid) {
            temp[i] = array[l];
            i++;
            l++;
        }
        while (r <= right) {
            temp[i] = array[r];
            i++;
            r++;
        }

        //(三)
        // 重置索引,将temp数组的元素拷贝到arr。
        i = 0;
        l = left;
        while (l <= right) {
            array[l] = temp[i];
            i++;
            l++;
        }
    }
}

八、基数排序

8.1 概述

  • 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

  • 示意图

在这里插入图片描述

8.2 算法分析

  • 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。

  • 这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

8.3 代码示例

public class RadixSort {

    public static void main(String[] args) {
        int[] array = SortUtil.getRandomArray(10, 100);
        System.out.println(Arrays.toString(array));
        // [63, 53, 86, 90, 35, 85, 0, 31, 44, 88]
        radixSort(array);
        System.out.println(Arrays.toString(array));
        // [0, 31, 35, 44, 53, 63, 85, 86, 88, 90]
    }

    public static void radixSort(int[] array) {
        // 1.找到数组中最大值是几位数。
        int max = array[0];
        for (int i = 0; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        int maxValueLen = (max + "").length();

        // 2.创建10个桶,每个桶的最大容量为数组长度。
        int[][] bucket = new int[10][array.length];

        // 3.记录桶中数据的个数。
        int[] bucketCounts = new int[10];

        for (int i = 0, n = 1; i < maxValueLen; i++, n *= 10) {
            // 拿到每个每个值。
            for (int j = 0; j < array.length; j++) {
                // 对应位数的值。
                int digit = array[j] / n % 10;
                bucket[digit][bucketCounts[digit]] = array[j];
                bucketCounts[digit]++;
            }

            int index = 0;
            for (int k = 0; k < bucketCounts.length; k++) {
                if (0 != bucketCounts[k]) {
                    //循环该桶即第k个桶(即第k个一维数组), 放入。
                    for (int l = 0; l < bucketCounts[k]; l++) {
                        //取出元素放入到arr。
                        array[index++] = bucket[k][l];
                    }
                }

                bucketCounts[k] = 0;
            }
        }
    }
}

九、排序总结与对比

  • 总结图

  • 稳定:如果 a 原本在 b 前面,而 a=b,排序之后 a 仍然在 b 的前面;
  • 不稳定:如果 a 原本在 b 的前面,而 a=b,排序之后 a 可能会出现在 b 的后面;
  • 内排序:所有排序操作都在内存中完成;
  • 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
  • 时间复杂度: 一个算法执行所耗费的时间。
  • 空间复杂度:运行完一个程序所需内存的大小。
  • n: 数据规模。
  • k: “桶”的个数。
  • In-place: 不占用额外内存。
  • Out-place: 占用额外内存。

十、结束语


“-------怕什么真理无穷,进一寸有一寸的欢喜。”

微信公众号搜索:饺子泡牛奶

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

裸露土堆识别系统 yolov7

裸露土堆识别系统基于yolov7深度学习架构模型&#xff0c;对现场画面实时分析检测&#xff0c;如检测到画面中的土堆有超过40%部分没被绿色防尘网覆盖&#xff0c;则立即抓拍存档告警。我们使用YOLO(你只看一次)算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN)&#xff0…

我靠steam搬砖,日赚几千,投入不到万元

什么做苦力、技能、直播卖货&#xff0c;电商等等对比我这个都是小钱。我这个方法是利用了大部分人的信息差来赚钱。 我就不藏着掖着了&#xff0c;授人以鱼不如授人以渔&#xff0c;反正你赚的又不是我的钱。 什么是“Steam游戏搬砖”呢&#xff1f; 简单来说&#xff0c;就…

Docker网络

网络基础知识 网络相关命令 查看Linux中的网卡 [rootlocalhost ~]# ip link show[rootlocalhost ~]# ls /sys/class/net[rootlocalhost ~]# ip a 状态: UP、DOWN、UNKNOW link/ether&#xff1a;MAC地址 inet&#xff1a;该网卡绑定的IPv4地址 [rootlocalhost ~]# ip link …

Python和MySQL对比(1):用Pandas 实现MySQL语法效果

文章目录一、前言二、语法对比数据表SELECTASWHEREDISTINCTGROUP BYORDER BYHAVINGLIMIT三、小结一、前言 环境&#xff1a; windows11 64位 Python3.9 MySQL8 pandas1.4.2 本文主要介绍 MySQL 中的关键字&#xff1a;SELECT、AS、WHERE、DISTINCT、GROUP BY、ORDER BY、HAVING…

文献检索

文献检索第一篇检索作业总结第一章检索任务1.1检索课题1.2确定选题所属学科1.3中英文检索词第二章检索策略与结果2.1检索中文期刊文献2.1.1 CNKI中国期刊全文数据库2.1.2 维普期刊全文数据库2.1.3 万方期刊数据库2.1.4 超星期刊全文2.2检索中文学位论文2.2.1 CNKI博硕学位论文数…

Java项目:SpringBoot美容院后台管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为美容院后台管理系统&#xff0c; 操作员包含以下功能&#xff1a;操作员登陆,操作员首页,会员列表,添加会员,添加美容产品,购买商品,添…

YOLOV7学习记录之mAP计算

如何评估一个训练好模型的好坏&#xff0c;是目标检测中一个很重要的因素&#xff0c;如常见的TP、FP、AP、PR、map等 TP、FP、TN、FN TP&#xff1a;被正确分类为正样本的数量&#xff1b;实际是正样本&#xff0c;也被模型分类为正样本 FP&#xff1a;被错误分类为正样本的…

Node.js - 数据库与身份认证

文章目录目标一、数据库的基本概念1、什么是数据库2、常见的数据库及分类3、传统型数据库的数据组织结构&#xff08;1&#xff09;Excel 的数据组织结构&#xff08;2&#xff09;传统型数据库的数据组织结构&#xff08;3&#xff09;实际开发中库、表、行、字段的关系二、安…

RV1126笔记十二:实现RTMP多路拉流

若该文为原创文章,转载请注明原文出处。 一、介绍 通过RV1126实现RTMP的多路拉流,并在屏幕上显示出来,这里涉及到ffmpeg几个重要知识点,和RV1126如何在屏幕分屏显示。 二、流程图 流程和单路拉流类似,这里只是涉及拉取后的图像需要解码缩放,在合成分屏显示出来。 具…

阳过→阳康,数据里的时代侧影;谷歌慌了!看各公司如何应对ChatGPT;两份优质AI年报;本周技术高光时刻 | ShowMeAI每周通讯 #003-12.24

这是ShowMeAI每周通讯的第3期。通讯聚焦AI领域本周热点&#xff0c;及其在各圈层泛起的涟漪&#xff1b;关注AI技术进步&#xff0c;并提供我们的商业洞察。欢迎关注与订阅&#xff01; 本周在 CSDN 积极答题一路升到 Top2&#xff0c;被系统误判为 ChatGPT 机器人X﹏X 可见压力…

自动化测试-Cypress快速入门

cypress介绍 一个前端自动化测试工具不同于其他只能测试 UI 层的前端测试工具&#xff0c;Cypress 允许编写所有类型的测试&#xff0c;覆盖了测试金字塔模型的所有测试类型**【界面测试&#xff0c;集成测试&#xff0c;单元测试】**Cypress 测试代码和应用程序均运行在由 Cy…

拦截器与过滤器

什么是过滤器 过滤器 Filter 基于 Servlet 实现&#xff0c;过滤器的主要应用场景是对字符编码、跨域等问题进行过滤。Servlet 的工作原理是拦截配置好的客户端请求&#xff0c;然后对 Request 和 Response 进行处理。Filter 过滤器随着 web 应用的启动而启动&#xff0c;只初…

电商订单对接系列-第1章-整体设计

背景 电商行业在处理订单的业务时&#xff0c;初创一般是直接通过电商后台导出表格&#xff0c;然后根据其来跟进进销存。在单量到了一定规模时&#xff0c;业务场景会变得复杂&#xff0c;如促销套餐&#xff0c;拆单&#xff0c;合单等&#xff0c;一般会购买市面上的…

Android -- 每日一问:介绍一下你经常浏览的 Android 技术网站

经典回答 做为一个合格的 Android 开发者&#xff0c;我想官方的 developer 站点是必上的&#xff0c;有什么网站能比官方更全面和权威呢。而且 Android Developer 站点上还有很多指导性的文章写得很不错&#xff0c;也不用担心英文不好&#xff0c;因为基本上官方都翻译了中文…

一文轻松图解搞懂Elasticsearch原理!

ES 的集群模式和 kafka 很像&#xff0c;kafka 又和 redis 的集群模式很像。总之就是相互借鉴&#xff01; 不管你用没用过 ES&#xff0c;今天我们一起聊聊它。就当扩展大家的知识广度了&#xff01; 认识倒排索引 「正排索引 VS 倒排索引&#xff1a;」 正排索引 VS 倒排索…

【PyTorch深度学习项目实战100例】—— 基于FastText实现情感二分类任务 | 第78例

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

【Pandas入门教程】如何重塑表格布局

如何重塑表格布局 来源&#xff1a;Pandas官网&#xff1a;https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html 笔记托管&#xff1a;https://gitee.com/DingJiaxiong/machine-learning-study 文章目录如何重塑表格布局导包数据准备【1】对表行进行排…

3.11.1、虚拟局域网 VLAN 概述

以太网交换机工作在数据链路层&#xff08;也包括物理层) 使用一个或多个以太网交换机互连起来的交换式以太网&#xff0c;其所有站点都属于同一个广播域。 随着交换式以太网规模的扩大&#xff0c;广播域相应扩大。 巨大的广播域会带来很多弊端: 广播风暴难以管理和维护潜在…

LVGL学习笔记2 - 对象

目录 1. 创建对象 2. 设置大小 3. 设置位置 4. 设置对齐方式 5. 对象的父子关系 6. 其他 前面的例子中&#xff0c;一个矩形创建都是用到obj的函数&#xff0c;obj即是指对象。LVGL的基本要素是对象&#xff0c;实现了屏幕上组件的基本属性&#xff0c;包括大小、坐标、父…

SQLite数据库-学生管理系统(2.0)

SQLite数据库-学生管理系统 1.要求 布局文件 --------View层Activity文件---------Controller层Helper文件&#xff1a;建立数据库和表&#xff0c;版本更新Dao层&#xff1a;对数据库表中数据增删改查操作Entity&#xff1a;数据库在项目中的类&#xff0c;主要用于定义与数据…