当前位置: 首页 > news >正文

左神算法基础巩固--1

文章目录

    • 时间复杂度
      • 常数时间的操作
      • 时间复杂度的定义
      • 时间复杂度的作用
      • 剖析递归行为和递归行为时间复杂度的估算
    • 排序
      • 选择排序
      • 冒泡排序
      • 插入排序
      • 归并排序
        • 小和问题
          • 问题描述
          • 解题思路
      • 快速排序
        • 荷兰国旗问题
          • 问题描述
      • 堆排序
        • 堆结构
          • 大根堆
          • 小根堆
      • 桶排序
    • 二分
      • 二分搜索
    • ^的运用
      • 不用额外空间交换两个数的值
      • 数组中存在一个数有奇数次,其他数均出现偶数次,找到那个出现奇数次的数
    • 对数器
      • 对数器的概念和使用

时间复杂度

常数时间的操作

一个操作如果和样本的数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。

下面这段代码就是一个常数操作的代码,他仅仅只是从一个数组中取出一个数,跟数组的规模没有任何关系,无论数组是几亿甚至是几十亿也好,执行这段代码所需的时间都不会发生改变。
在这里插入图片描述
但下面这段代码不同,下面这段代码是从一个链表中取出对应位置的数(List list = newLinkedList();),在这段代码中拿到对应的值需要先遍历一遍链表,这一操作与链表的规模有关,故链表的规模会影响其执行这段代码的时间。
在这里插入图片描述

时间复杂度的定义

时间复杂度为一个算法流程中,常数操作数量的一个指标。常用O(读作big O)来表示。具体来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式。在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果为f(N),那么时间复杂度为O(f(N))。

时间复杂度的作用

评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”。

剖析递归行为和递归行为时间复杂度的估算

用递归方法找一个数组中的最大值,系统上到底是怎么做的?
master公式的使用
T(N) = a*T(N/b) + O(N^d)

  1. log(b,a) > d -> 复杂度为O(N^log(b,a))
  2. log(b,a) = d -> 复杂度为O(N^d * logN)
  3. log(b,a) < d -> 复杂度为O(N^d)
    补充阅读:www.gocalf.com/blog/algorithm-complexity-and-master- theorem.html
    以下列代码为例
public static int getMax(int[] arr) {return process(arr, 0, arr.length - 1);}public static int process(int[] arr, int L, int R) {if (L == R) {return arr[L];}int mid = L + ((R - L) &gt;&gt; 1);int leftMax = process(arr, L, mid);int rightMax = process(arr, mid + 1, R);return Math.max(leftMax, rightMax);}

在这段代码中 a为2,因为在一次递归中调用了两次process函数 ,b为2,因为在一次递归中将问题的规模缩小为原来的1/2,d为0,因为除去一次递归中除去调用过程外的时间复杂度为O(1)算出d为1

排序

选择排序

选择排序的算法思想是指,将在数组中一开始选定一个数将这个数初始定义为这个数组的最小值,然后遍历这个数组让这个数与数组中所有数进行比较找出真正的最小值并将其与第一个位置交换位置。之后再找到次小值将其与第二个数交换位置,不断重复直到将这个数组的每一个位置都重新赋值。

public static 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 tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}

对于其时间复杂度来说 在每找到一个小值时均会进行N-k比较(k表示为已经找到几个小值),这些比较操作均为常数操作则有(n-1)+(n-2)+(n-3)+…1次比较常数操作,n次交换操作,n次赋值操作,由等差数列求和公式可得an^2 +bn+c 次常数操作,则由上文的时间复杂度公式可得:其时间复杂度为 O(n^2)。
注意当两个算法的时间复杂度相同但想要得到这两个算法在运行时间上的优劣时最好采用直接用大数据量跑一遍的方法进行比较而不是用他们进行了多少次常数操作进行比较,因为不同的常数操作虽然每一次所需的时间是相同的但是不同的常数操作之间所需的时间是不同的故最好还是用大数据量跑一遍

冒泡排序

冒泡排序通过重复遍历要排序的数列,比较每对相邻元素的大小,并在必要时交换它们的位置。这个过程会重复进行,直到没有再需要交换的元素为止,这意味着数列已经排序完成。

public static void bubbleSort(int[] arr) {//数组过滤(如果数组不存在或数组数组只有一个元素便不需要排序)if (arr == null || arr.length < 2) {return;}for (int e = arr.length - 1; e > 0; e--) {for (int i = 0; i < e; 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];}

插入排序

插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因此它对于小数据量的排序效率很高。
将第一个元素视为已排序序列,从第二个元素开始进行排序。先取出一个待排序的元素,将其与已排序序列中的元素从后向前比较。如果待插入的元素比已排序序列中的某个元素小,则将那个元素向后移动一个位置。
重复这个过程,直到找到一个合适的位置,或者到达已排序序列的开始。后将待排序元素插入到找到的合适位置。
对每一个待排序元素重复步骤,直到所有元素都被插入到已排序序列中。

public static void insertionSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int i = 1; i < arr.length; i++) {for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {swap(arr, j, j + 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];}

归并排序

归并排序采用分治法(Divide and Conquer)的思想。归并排序将数组分成两半,分别对这两半进行排序,然后将排序好的两部分合并在一起。以下是归并排序的基本思想和步骤:
将数组分成两半,直到每个子数组只有一个元素。一个元素的数组是有序的。
递归地对每个子数组进行归并排序。
将两个有序的子数组合并成一个有序的数组。

合并两个有序数组的基本思想如下:
比较两个子数组的首元素,选择较小的元素放入合并后的数组。
移动选择的元素到下一个位置,继续比较两个子数组的首元素。
重复上述过程,直到一个子数组的所有元素都被合并。
将另一个子数组的剩余元素直接复制到合并后的数组

public static void mergeSort(int[] arr, int[] arrSorted, int left, int right) {if (left < right) {// 找到中间索引int middle = (left + right) / 2;// 分别对左右两部分进行归并排序mergeSort(arr, arrSorted, left, middle);mergeSort(arr, arrSorted, middle + 1, right);// 合并两个有序数组merge(arr, arrSorted, left, middle, right);}}// 合并两个有序数组的函数public static void merge(int[] arr, int[] arrSorted, int left, int middle, int right) {int i, j, k;i = left;    // 左数组的起始索引j = middle + 1;  // 右数组的起始索引k = left;    // 合并后数组的起始索引// 合并过程while (i <= middle && j <= right) {if (arr[i] < arr[j]) {arrSorted[k++] = arr[i++];} else {arrSorted[k++] = arr[j++];}}// 复制剩余的元素while (i <= middle) {arrSorted[k++] = arr[i++];}while (j <= right) {arrSorted[k++] = arr[j++];}// 将合并后的数组复制回原数组for (i = left; i <= right; i++) {arr[i] = arrSorted[i];}}
小和问题
问题描述

小和问题
在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组
的小和。求一个数组 的小和。
例子:[1,3,4,2,5] 1左边比1小的数,没有; 3左边比3小的数,1; 4左
边比4小的数,1、3; 2左边比2小的数,1; 5左边比5小的数,1、3、4、
2; 所以小和为1+1+3+1+1+3+4+2=16

解题思路

小和问题可以看成求一个数右边有多少个数比他大如果比他大便将其自身加入到求小和的过程中,因此这个问题可以用归并排序的算法进行求解,在归并排序的merge阶段对左边界的数进行遍历得到每个数与右边界的数的大小关系,得到右边界的数中有多少数大于左边界对应的数,并将这些数乘积后加入到最后的结果中,并在最后得到结果。

public static int smallSum(int[] arr) {if (arr == null || arr.length < 2) {return 0;}return mergeSort(arr, 0, arr.length - 1);}public static int mergeSort(int[] arr, int l, int r) {if (l == r) {return 0;}int mid = l + ((r - l) >> 1);return mergeSort(arr, l, mid) + mergeSort(arr, mid + 1, r) + merge(arr, l, mid, r);}public static int merge(int[] arr, int l, int m, int r) {int[] help = new int[r - l + 1];int i = 0;int p1 = l;int p2 = m + 1;int res = 0;while (p1 <= m && p2 <= r) {res += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p1] : 0;help[i++] = arr[p1] < arr[p2] ?000000000000 arr[p1++] : arr[p2++];}while (p1 <= m) {help[i++] = arr[p1++];}while (p2 <= r) {help[i++] = arr[p2++];}for (i = 0; i < help.length; i++) {arr[l + i] = help[i];}return res;}

快速排序

荷兰国旗问题
问题描述

将一个数根据一个特定的数划分为小于该数、等于该数、大于该数这三部分

public static int[] partition(int[] arr, int l, int r) {int less = l - 1;int more = r;while (l < more) {if (arr[l] <; arr[r]) {swap(arr, ++less, l++);} else if (arr[l] > arr[r]) {swap(arr, --more, l);} else {l++;}}swap(arr, more, r);return new int[] { less + 1, more };}

快速排序便是将这个进行递归 便能排好序

public static void quickSort(int[] arr) {if (arr == null || arr.length &lt; 2) {return;}quickSort(arr, 0, arr.length - 1);}public static void quickSort(int[] arr, int l, int r) {if (l &lt; r) {swap(arr, l + (int) (Math.random() * (r - l + 1)), r);int[] p = partition(arr, l, r);quickSort(arr, l, p[0] - 1);quickSort(arr, p[1] + 1, r);}}public static int[] partition(int[] arr, int l, int r) {int less = l - 1;int more = r;while (l &lt; more) {if (arr[l] &lt; arr[r]) {swap(arr, ++less, l++);} else if (arr[l] &gt; arr[r]) {swap(arr, --more, l);} else {l++;}}swap(arr, more, r);return new int[] { less + 1, more };}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}

堆排序

堆排序算法基于大根堆(最大堆)或小根堆(最小堆)的数据结构。堆排序的基本思想是将无序序列构建成一个堆,然后逐个从堆中取出元素,将其放在序列的末尾,同时重新调整堆,直到堆中只剩下一个元素,此时整个序列就成为了有序序列。
构建最大堆:将无序序列构建成一个最大堆(大根堆)。
交换并重建堆:将堆顶元素(最大值)与序列末尾元素进行交换,然后将序列末尾的元素移除(即缩小堆的大小),并重新调整堆以保持最大堆的性质。
重复交换:重复步骤2,直到堆中只剩下一个元素。

堆结构
大根堆

对于任意一个非叶子节点i(其子节点为2i+1和2i+2,其中索引从0开始),其值总是大于或等于其子节点的值,即:

A[i] >= A[2i+1]
A[i] >= A[2
i+2]
其中A是存储堆的数组,且A[0]是根节点。

小根堆

对于任意一个非叶子节点i(其子节点为2i+1和2i+2,其中索引从0开始),其值总是小于或等于其子节点的值,即:

A[i] <= A[2i+1]
A[i] <= A[2
i+2]
其中A是存储堆的数组,且A[0]是根节点。

public class HeapSort {// 堆调整函数,用于调整节点i,确保子树满足最大堆的性质private static void heapify(int[] arr, int n, int i) {int largest = i; // 初始化最大值为根节点int left = 2 * i + 1; // 左子节点int right = 2 * i + 2; // 右子节点// 如果左子节点大于根节点,则更新最大值if (left < n && arr[left] > arr[largest]) {largest = left;}// 如果右子节点大于当前最大值,则更新最大值if (right < n && arr[right] > arr[largest]) {largest = right;}// 如果最大值不是根节点,交换它们,并继续调整堆if (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;// 递归调整被交换节点的子树heapify(arr, n, largest);}}// 堆排序函数public static void heapSort(int[] arr) {int n = arr.length;// 构建最大堆for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// 一个个从堆中取出元素并放到数组末尾for (int i = n - 1; i >= 0; i--) {// 交换堆顶元素和数组末尾元素int temp = arr[0];arr[0] = arr[i];arr[i] = temp;// 调整堆heapify(arr, i, 0);}}
}

桶排序

桶排序(Bucket Sort)是一种分布式排序算法,它将数组分为多个桶,每个桶负责排序数组中的一部分数据。桶排序的基本思想是将数据分散到有限数量的桶里,每个桶再分别对各自范围内的数据进行排序,最后依次取出每个桶排序后的数据,从而得到有序的序列。
先根据数据的范围和数据的分布,确定桶的数量。再遍历待排序的数组,将每个元素放入其对应的桶中。通常使用一个函数映射数据到桶的索引。之后对每个桶内的数据使用其他排序算法(如插入排序、快速排序等)进行排序。
最后依次从各个桶中取出数据,并将它们拼接起来,形成有序序列。

public static void radixSort(int[] arr) {if (arr == null || arr.length &lt; 2) {return;}radixSort(arr, 0, arr.length - 1, maxbits(arr));}public static int maxbits(int[] arr) {int max = Integer.MIN_VALUE;for (int i = 0; i &lt; arr.length; i++) {max = Math.max(max, arr[i]);}int res = 0;while (max != 0) {res++;max /= 10;}return res;}public static void radixSort(int[] arr, int begin, int end, int digit) {final int radix = 10;int i = 0, j = 0;int[] bucket = new int[end - begin + 1];for (int d = 1; d &lt;= digit; d++) {int[] count = new int[radix];for (i = begin; i &lt;= end; i++) {j = getDigit(arr[i], d);count[j]++;}for (i = 1; i &lt; radix; i++) {count[i] = count[i] + count[i - 1];}for (i = end; i &gt;= begin; i--) {j = getDigit(arr[i], d);bucket[count[j] - 1] = arr[i];count[j]--;}for (i = begin, j = 0; i &lt;= end; i++, j++) {arr[i] = bucket[j];}}}public static int getDigit(int x, int d) {return ((x / ((int) Math.pow(10, d - 1))) % 10);}

二分

二分搜索

二分搜索它通过反复将搜索区间一分为二来缩小搜索范围,直到找到目标值或搜索区间为空。
首先,确定要搜索的有序数组的起始索引(通常为0)和结束索引(通常是数组长度减1)。
计算当前搜索区间的中间索引mid,公式为mid = (low + high) / 2。
将中间索引处的元素与目标值进行比较。
如果中间元素等于目标值,则搜索成功,返回中间索引。
如果中间元素大于目标值,则在数组的左半部分继续搜索。
如果中间元素小于目标值,则在数组的右半部分继续搜索。
根据比较结果,更新搜索区间的起始索引或结束索引。
如果中间元素大于目标值,更新high为mid - 1。
如果中间元素小于目标值,更新low为mid + 1。
重复步骤,直到找到目标值或搜索区间为空(即low大于high)。
如果搜索区间为空,说明数组中不存在目标值,返回一个表示失败的标志(通常是-1或其他特定的值)。

public static int binarySearch(int[] arr, int target) {int low = 0;int high = arr.length - 1;while (low <= high) {// 计算中间索引,防止溢出int mid = low + (high - low) / 2;// 检查中间元素是否是目标值if (arr[mid] == target) {return mid; // 找到目标值,返回索引}// 如果中间元素大于目标值,调整搜索区间的高索引if (arr[mid] > target) {high = mid - 1;} else {// 如果中间元素小于目标值,调整搜索区间的低索引low = mid + 1;}}// 未找到目标值,返回-1return -1;}

^的运用

不用额外空间交换两个数的值

在这里插入图片描述

int a=a^b;
int b=a^b;
int a=a^b;

数组中存在一个数有奇数次,其他数均出现偶数次,找到那个出现奇数次的数

以此数组为例
在这里插入图片描述
该数组中1出现4次 ,2出现两次,3出现三次
则可用下列这种方法解决。其原理为同一个数异或偶数次后得到的结果一定为0,0异或一个数结果一定为该数,
在这里插入图片描述
由于异或操作的结果与顺序无关则上述代码可改成
在这里插入图片描述
则两个1异或后为0… 两个2异或后为0 , 两个3异或后为0,最后结果为0异或3为3,即为数组中出现奇数次的元素。

对数器

对数器的概念和使用

1,有一个你想要测的方法a
2,实现复杂度不好但是容易实现的方法b
3,实现一个随机样本产生器
4,把方法a和方法b跑相同的随机样本,看看得到的结果是否一样。
5,如果有一个随机样本使得比对结果不一致,打印样本进行人工干预,改对方法a或者
方法b
6,当样本数量很多时比对测试依然正确,可以确定方法a已经正确。

// for testpublic static void comparator(int[] arr) {Arrays.sort(arr);}// for testpublic static int[] generateRandomArray(int maxSize, int maxValue) {int[] arr = new int[(int) ((maxSize + 1) * Math.random())];for (int i = 0; i &lt; arr.length; i++) {arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());}return arr;}// for testpublic static int[] copyArray(int[] arr) {if (arr == null) {return null;}int[] res = new int[arr.length];for (int i = 0; i &lt; arr.length; i++) {res[i] = arr[i];}return res;}// for testpublic static boolean isEqual(int[] arr1, int[] arr2) {if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {return false;}if (arr1 == null && arr2 == null) {return true;}if (arr1.length != arr2.length) {return false;}for (int i = 0; i &lt; arr1.length; i++) {if (arr1[i] != arr2[i]) {return false;}}return true;}// for testpublic static void printArray(int[] arr) {if (arr == null) {return;}for (int i = 0; i &lt; arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}// for testpublic static void main(String[] args) {int testTime = 500000;int maxSize = 100;int maxValue = 100;boolean succeed = true;for (int i = 0; i &lt; testTime; i++) {int[] arr1 = generateRandomArray(maxSize, maxValue);int[] arr2 = copyArray(arr1);selectionSort(arr1);comparator(arr2);if (!isEqual(arr1, arr2)) {succeed = false;printArray(arr1);printArray(arr2);break;}}System.out.println(succeed ? "Nice!" : "Fucking fucked!");int[] arr = generateRandomArray(maxSize, maxValue);printArray(arr);selectionSort(arr);printArray(arr);}

相关文章:

左神算法基础巩固--1

文章目录 时间复杂度常数时间的操作时间复杂度的定义时间复杂度的作用剖析递归行为和递归行为时间复杂度的估算 排序选择排序冒泡排序插入排序归并排序小和问题问题描述解题思路 快速排序荷兰国旗问题问题描述 堆排序堆结构大根堆小根堆 桶排序 二分二分搜索 ^的运用不用额外空…...

基于鲲鹏服务器的打砖块小游戏部署

案例介绍 鲲鹏服务器是基于鲲鹏处理器的新一代数据中心服务器&#xff0c;适用于大数据、分布式存储、高性能计算和数据库等应用。鲲鹏服务器具有高性能、低功耗、灵活的扩展能力&#xff0c;适合大数据分析、软件定义存储、Web等应用场景。 本案例将指导开发者如何在鲲鹏服务…...

STM32F407寄存器点灯

背景描述&#xff1a; 最近用32开发遇到问题不得不看寄存器了&#xff0c;就回顾了一下寄存器手册的查看方式和寄存器的使用方法&#xff1b; 上一次这么细致的记录还是在刚学习STM32的时候&#xff0c;之前觉得看寄存器手册以及配置寄存器是有点难度的事情&#xff0c;现在回头…...

电子电气架构 --- 队列刷写场景及刷写上位机浅析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

kubernates实战

使用k8s来部署tomcat 1、创建一个部署&#xff0c;并指定镜像地址 kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre82、查看部署pod状态 kubectl get pods # 获取default名称空间下的pods kubectl get pods --all-namespaces # 获取所有名称空间下的pods kubect…...

换工作,如何退出微软账户???(删除注册表数据)

1.Winr 进入 输入. 2.删除 注意路径. 3.删除 注意路径. 4.效果如下&#xff0c;清空成功...

vscode+编程AI配置、使用说明

文章目录 [toc]1、概述2、github copilot2.1 配置2.2 使用文档2.3 使用说明 3、文心快码&#xff08;Baidu Comate&#xff09;3.1 配置3.2 使用文档3.3 使用说明 4、豆包&#xff08;MarsCode&#xff09;4.1 配置4.2 使用文档4.3 使用说明 5、通义灵码&#xff08;TONGYI Lin…...

60.基于SSM的个人网站的设计与实现(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;个人网站是在MySQL中建立数据表保存信息&#xff0c;运用SSMVue框架和Java语言编写。并按照软件设计开发流程进行设计实现充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SSM的网…...

myexcel的使用

参考&#xff1a; &#xff08;1&#xff09;api文档&#xff1a;https://www.bookstack.cn/read/MyExcel-2.x/624d8ce73162300b.md &#xff08;2&#xff09;源代码&#xff1a; https://github.com/liaochong/myexcel/issues 我&#xff1a; &#xff08;1&#xff09;m…...

CSDN外链失效3:

参考我之前的博客&#xff1a; 外链失效博客1&#xff1a;随想笔记1&#xff1a;CSDN写博客经常崩溃&#xff0c;遇到外链图片转存失败怎么办_csdn外链图片转存失败-CSDN博客 外链失效博客2&#xff1a;网络随想2&#xff1a;转语雀_md格式转语雀lake格式-CSDN博客 markdown…...

SSM 医院预约挂号系统:Vue 技术驱动下的设计与实现飞跃

3系统分析 3.1可行性分析 通过对本医院预约挂号系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本医院预约挂号系统采用SSM框架&#xff0c;JAVA作为开发语…...

如何在centos系统上挂载U盘

在CentOS上挂载NTFS格式的U盘,需要执行一系列步骤,包括识别U盘设备、安装必要的软件、创建挂载点,并最终挂载U盘。以下是在CentOS上挂载NTFS格式U盘的详细步骤: 一、准备工作 确认CentOS版本: 确保你的CentOS系统已经安装并正常运行。不同版本的CentOS在命令和工具方面可能…...

lshw学习——简单介绍

文章目录 简介核心结构扫描设备原理scan_abiscan_burnerscan_cdromscan_cpufreqscan_cpuidscan_cpuinfoscan_device_treescan_diskscan_displayscan_dmiscan_fatscan_fbscan_graphicsscan_idescan_ideraidscan_inputscan_isapnpscan_lvmscan_memoryscan_mmcscan_mountsscan_net…...

UI自动化概念+Web自动化测试框架

1.UI自动化测试概念:我们先明确什么是UI UI&#xff0c;即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试:Web自动化测试和移动自动化测试都属于UI自动化测试&#xff0c;UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 …...

java: 无效的目标发行版: xx

java: 无效的目标发行版: xx 背景java: 无效的目标发行版: xx 在 Intellij 的修复 背景 这里单独针对Intellij开发工具对 “java: 无效的目标发行版: xx”错误的修复。 java: 无效的目标发行版: xx 在 Intellij 的修复 同一台电脑使用多个JDK的时候容易出现在运行程序时容易…...

【QSS样式表 - ③】:QSS常用属性

文章目录 QSS常用属性字体样式QSS示例 边框样式QSS示例 盒子模型背景颜色、背景图片background-QSS示例 border-imageQSS示例1QSS示例2 QObject属性QSS示例 QSS常用属性 字体样式 以上也可以直接写成一行&#xff1a; font: 字体风格 字体粗细 字体大小 字体名称;QSS示例 新…...

WPF Binding 绑定

绑定是 wpf 开发中的精髓&#xff0c;有绑定才有所谓的数据驱动。 1 . 背景 目前 wpf 界面可视化的控件&#xff0c;继承关系如下&#xff0c; 控件的数据绑定&#xff0c;基本上都要借助于 FrameworkElement 的 DataContext 属性。 只有先设置了控件的 DataContext 属性&…...

掌握Java分支结构:if和switch详解

在编程中&#xff0c;顺序结构确实只能按照代码的书写顺序依次执行&#xff0c;而无法根据条件进行判断和选择。为了实现程序根据不同情况执行不同代码块的功能&#xff0c;我们需要使用分支结构。Java提供了两种主要的分支结构来帮助开发者实现这一目标&#xff1a; if 语句&…...

ES学习Promise对象(九)

这里写目录标题 一、概念二、示例基本使用使用 Promise 对象封装Ajaxthen() 方法catch() 方法 一、概念 简单说就是一个容器&#xff0c;里面保存着某个未来才会结束的事件&#xff08;通常是一个异步操作&#xff09;的结果。Promise 是一个对象&#xff0c;Promise 提供统一…...

ssh 密钥对文件登录

首先提供我生成的密钥对【test-241222.pem】: -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAkrx1O 【.....】 -----END RSA PRIVATE KEY----- 1. 验证私钥格式 首先,确认test-241222.pem确实是有效的RSA私钥。你可以通过以下命令来验证(在Linux/Mac上): openssl …...

电流、电压,串联电路中,电流为什么处处相等?

电流是什么&#xff1f;串、并联中&#xff0c;电流的关系 飞书链接&#xff0c;看这个&#xff0c;格式更好&#xff0c;提供书籍下载 电流的本质定义&#xff1a; 电流 (I) 是 单位时间内&#xff0c;通过导体截面的电荷量。它的数学定义是&#xff1a; I Δ Q Δ t I \f…...

Python生成学生管理系统,使用qt组件,MySQL 数据库,-1

创建一个基于 Python 的学生管理系统&#xff0c;使用 Qt 组件&#xff08;通过 PyQt5 或 PySide2&#xff09;和 MySQL 数据库&#xff0c;是一个综合性的项目。以下是一个详细的指南&#xff0c;包括环境设置、数据库设计、Python 代码示例以及如何使用 Qt 设计用户界面。 #…...

接口测试Day03-postman断言关联

postman常用断言 注意&#xff1a;不需要手敲&#xff0c;点击自动生成 断言响应状态码 Status code&#xff1a;Code is 200 //断言响应状态码为 200 pm.test("Status code is 200", function () {pm.response.to.have.status(200); });pm: postman的实例 test() …...

微服务分布式(二、注册中心Consul)

首先我们需要安装consul,到官网下载Consul Install | Consul | HashiCorp Developer 在解压的consul目录下 执行启动命令 consul agent -dev 启动服务 -dev表示开发模式 -server表示服务模式 启动后在浏览器访问8500端口http://localhost:8500/可以看到服务管理界面 项目…...

sh cmake-linux.sh -- --skip-license --prefix = $MY_INSTALL_DIR

本文来自天工AI --------- 命令用于安装CMake的脚本&#xff0c;其中--skip-license参数表示跳过许可协议的显示&#xff0c;--prefix参数指定了CMake的安装目录。$MYINSTALLDIR是一个环境变量&#xff0c;应该在运行命令之前设置为您想要安装CMake的目录。 -------- sh xx…...

信创技术栈发展现状与展望:机遇与挑战并存

一、引言 在信息技术应用创新&#xff08;信创&#xff09;战略稳步推进的大背景下&#xff0c;我国信创技术栈已然在诸多关键层面收获了亮眼成果&#xff0c;不过也无可避免地遭遇了一系列亟待攻克的挑战。信创产业作为我国达成信息技术自主可控这一目标的关键一招&#xff0c…...

文本图像多模态基础-clip的细节解读

目录 一、我写的目的 二、原文出处 三、方法和benchmark 3.1 方法原理 3.2 值得注意的代码细节 实际的损失函数计算&#xff1a; evaluation的计算&#xff1a; backbone的类型&#xff1a; 3.3 benchamrk 推理时的细节-benchmark比较&#xff1a; 经典benchmark对…...

c4d动画怎么导出mp4视频,c4d动画视频格式设置

宝子们&#xff0c;今天来给大家讲讲 C4D 咋导出mp4视频的方法。通过用图文教程的形式给大家展示得明明白白的&#xff0c;让你能轻松理解和掌握&#xff0c;不管是理论基础&#xff0c;还是实际操作和技能技巧&#xff0c;都能学到&#xff0c;快速入门然后提升自己哦。 c4d动…...

Mysql复习(二)

一、 DBMS&#xff1a;是管理数据库的软件的集合&#xff0c;是用户访问数据库的接口。主要功能&#xff1a;数据定义、数据操纵、数据库运行管理、数据库建立与维护等 二、 关系模式的完整性规则包括&#xff08;实体完整性、参照完整性和用户自定义完整性&#xff09; 实体…...

【芯片设计- RTL 数字逻辑设计入门 番外篇 13 -- FAB厂中PE工程师和PIE工程师的区别】

文章目录 Overview岗位职责的核心区别PE工程师:岗位要求的差异PE工程师接触面和协作关系后期职业发展方量产与研发的区别转自: 老虎说芯 老虎说芯 2024年12月20日 12:30 广东 Overview 在导体制造行业中,PE工程师(Process Engineer,工艺工程师)和PIE工程师(Process Int…...

java中的输入输出

目录 1.基本概念1.标准输入流&#xff08;System.in&#xff09;&#xff1a;2.标准输出流&#xff08;System.out&#xff09;&#xff1a;3.Scanner 类&#xff1a;4.File 类&#xff1a;&#xff16;.BufferedReader 和 BufferedWriter&#xff1a;7.PrintWriter&#xff1a…...

java抽奖系统(八)

9. 抽奖模块 9.1 抽奖设计 抽奖过程是抽奖系统中最重要的核⼼环节&#xff0c;它需要确保公平、透明且⾼效。以下是详细的抽奖过程设计&#xff1a; 对于前端来说&#xff0c;负责控制抽奖的流程&#xff0c;确定中奖的人员 对于后端来说&#xff1a; 接口1&#xff1a;查询完…...

在技术文档中多使用各种图

有些事情在文档中掰扯十几页&#xff0c;不如一幅图讲的明白&#xff01;举个例子下面这幅图就是一个EDI 835电子报文&#xff08;就是医保了&#xff0c;美国加州的&#xff09;的业务流程。如果纯靠文字来描述&#xff0c;写很多文字不一定能说清楚。所以俺画了这幅图&#x…...

GB28181学习总结

GB28181学习总结 前言 我认为&#xff0c;学习一个新东西可以分成两步&#xff1a; 作用是什么&#xff1f; 原理是什么&#xff1f; 所以本文将从两个问题出发&#xff0c;对GB28181进行总结&#xff1a; GB28181是什么&#xff1f; GB28181原理是什么&#xff1f; GB…...

矩阵论:Vector-Valued Linear and Affine Functions介绍:中英双语

最近在翻看 这本书&#xff0c;对其中的一些英文概念做一些记录。 Link&#xff1a;https://web.stanford.edu/~boyd/books.html 中文版 向量值线性函数和仿射函数的详解 在机器学习、数据科学和工程应用中&#xff0c;向量值线性函数和仿射函数是非常重要的数学工具。本…...

网络七层杀伤链

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&…...

某狐畅游24校招-C++开发岗笔试(单选题)

某狐畅游24校招-C开发岗笔试 目录 某狐畅游24校招-C开发岗笔试一、单选题二、单选题解析 本文题目源来自&#xff1a;[PTA程序设计类实验辅助教学平台](PTA | 程序设计类实验辅助教学平台) 一、单选题 1-1 若有说明 int a[2][3]; 则对 a 数组元素的正确引用是 A. a[0][11]B. …...

spring mvc | servlet :serviceImpl无法自动装配 UserMapper

纯注解SSM整合 解决办法&#xff1a; 在MybatisConfig添加 Configuration MapperScan("mapper")...

在 CentOS 上安装 MySQL 8

在 CentOS 上安装 MySQL 8 您可以按照以下步骤操作&#xff1a; 1. 更新系统 首先&#xff0c;更新系统软件包以确保安装的最新版本。 sudo yum update -y 2. 安装 MySQL 8 安装 MySQL 存储库 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.r…...

EMC VMAX/DMX 健康检查方法

近期连续遇到2个由于对VMAX存储系统没有做及时的健康检查&#xff0c;出现SPS电池故障没有及时处理&#xff0c;然后同一pair就是同一对的另外一个SPS电池再次出现故障&#xff0c;然后存储系统保护性宕机vault&#xff0c;然后业务系统挂掉的案例。 开始之前&#xff0c;先纠…...

深入理解Kafka:核心设计与实践原理读书笔记

目录 初识Kafka基本概念安装与配置ZooKeeper安装与配置Kafka的安装与配置 生产与消费服务端参数配置 生产者客户端开发消息对象 ProducerRecord必要的参数配置发送消息序列化分区器生产者拦截器 原理分析整体架构元数据的更新 重要的生产者参数acksmax.request.sizeretries和re…...

Ubuntu命令行网络配置

临时连接 为什么需要临时连接&#xff0c;你最好测试你的网络适配器驱动能够连接到网络&#xff0c;然后再进行进一步的配置自动连接&#xff0c;否则也许会一直处在“折腾”中。 查看网络状态 ip addr show激活网络接口&#xff1a; sudo ip link set <适配器名称> up使…...

Wireshark软件下载安装及基础

前言 本次学习的是在b站up主泷羽sec课程有感而发&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 &#xff01;&#xff01;…...

16asm - 宏汇编语法

文章目录 前言宏汇编表达式算术表达式逻辑运算关系运算符 标号匿名标号调整偏移量指令ORG当前地址指令$ 结构体宏equ语句语句macro语句 多文件编译源文件头文件函数使用全局变量编译 选择结构循环结构 总结 前言 各位师傅大家好&#xff0c;我是qmx_07,今天讲解 宏汇编的相关内…...

5.C语言内存分区-堆-栈

目录 内存分区 运行之前 代码区 全局初始化数据区 、静态数据区 (data) 未初始化数据区(bss&#xff08;Block Started by Symbol&#xff09;区) 总结 运行之后 代码区 &#xff08;text segment&#xff09; 未初始化数据区(bss) 全局初始化数据区&#xff0c;静态…...

【模拟】饮料促销

题目描述 暑期到了&#xff0c;各大商场都开始举办饮料促销优惠活动&#xff0c;卡卡维他命水凭3个瓶盖可以再换一瓶并且可以一直循环下去(但不允许暂借或赊账)。请你计算一下&#xff0c;如果小明不浪费瓶盖&#xff0c;尽量地参加活动&#xff0c;那么对于他初始买入的 n 瓶…...

RFdiffusion get_torsions函数解读

函数功能 get_torsions 函数根据输入的原子坐标(xyz_in)和氨基酸序列(seq),计算一组主链和侧链的扭转角(torsions)。同时生成备用扭转角(torsions_alt),用于表示可以镜像翻转的几何结构,并返回掩码(tors_mask)和是否平面化(tors_planar)的信息。 输入参数 xyz…...

重拾设计模式--组合模式

文章目录 1 、组合模式&#xff08;Composite Pattern&#xff09;概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式&#xff08;Composite Pattern&#xff09;概述 定义&#xff1a;组合模式是一种结构型设计模式&#xff0c;它允许你将对象组合成…...

IntelliJ IDEA Docker集成

一、概述 Docker是一种用于在隔离和可复制环境中部署和运行可执行文件的工具。这可能很有用&#xff0c;例如&#xff0c;在与生产相同的环境中测试代码。 IntelliJ IDEA集成了Docker功能&#xff0c;并为创建Docker映像、运行Docker容器、管理Docker Compose应用程序、使用公…...

【Blender】【源码详解】BLI_mesh_boolean 实现详解

1. 背景&#xff1a; 最近因为项目需要&#xff0c;需要阅读 Blender 中关于 mesh boolean 的源码&#xff1b;因此&#xff0c;对 blender 中的 mesh boolean 源码进行解读&#xff1b; Github 上源码下载很慢&#xff0c;一般使用 Gitee: gitee Blender 源码 2. Mesh Boole…...