java算法性能调优:详尽探讨时间复杂度与空间复杂度的分析与优化“
接下来我将带领大家进入Java数据结构的深入学习,让我们一同享受Java数据结构中的奥秘。
一、引言
二、时间复杂度
三、空间复杂度
四、Java中的时间复杂度和空间复杂度
五、优化时间复杂度和空间复杂度
七、时间复杂度和空间复杂度的重要性
一:时间复杂度:
分析时间复杂度和空间复杂度是计算机科学和软件开发中的重要任务,原因如下:
1. 性能优化
- 时间复杂度:衡量算法在不同输入规模下的执行时间。低时间复杂度的算法在处理大规模数据时更高效。
- 空间复杂度:衡量算法在执行过程中所需的存储空间。低空间复杂度的算法可以减少内存消耗,避免内存溢出等问题。
2. 资源利用
- 计算资源:时间复杂度影响CPU的利用率。高效的算法可以减少CPU时间,提高系统吞吐量。
- 存储资源:空间复杂度影响内存和存储设备的利用。在资源受限的环境(如嵌入式系统)中,低空间复杂度尤为重要。
3. 可扩展性
- 随着数据规模的增长,时间复杂度和空间复杂度决定了算法的可扩展性。高效的算法能够处理更大规模的数据,而不会显著增加资源消耗。
4. 用户体验
- 高效的算法可以缩短用户等待时间,提高应用程序的响应速度和用户体验。
5. 成本效益
- 在云计算、大数据等场景中,计算资源和存储资源通常需要付费。低复杂度的算法可以降低成本,提高经济效益。
6. 算法选择
- 在面对多种算法选择时,通过分析时间复杂度和空间复杂度,可以选择最适合特定应用场景的算法。
7. 算法设计
- 在设计新算法时,时间复杂度和空间复杂度是评估算法优劣的重要指标。设计高效的算法需要对这两个复杂度有深入的理解。
8. 比较和评估
- 在学术研究、工程实践和竞赛中,时间复杂度和空间复杂度是评估算法性能、比较不同算法优劣的重要标准。
9. 调试和优化
- 在调试和优化现有代码时,分析时间复杂度和空间复杂度可以帮助识别性能瓶颈,指导优化方向。
10. 理论指导
- 时间复杂度和空间复杂度的分析是计算机科学理论的重要组成部分,有助于深入理解算法和数据结构的本质。
示例
- 排序算法:不同的排序算法(如快速排序、归并排序、冒泡排序)具有不同的时间复杂度。在实际应用中,选择时间复杂度较低的算法可以显著提高性能。
- 递归算法:递归算法的空间复杂度通常较高,因为需要额外的栈空间来存储递归调用。了解这一点有助于设计更高效的递归算法或使用迭代替代递归。
所以分析时间复杂度和空间复杂度对于理解、设计、优化和评估算法至关重要,是计算机科学和软件开发中的核心任务。
二:时间复杂度
1. O(1) - 常数时间复杂度:
这种复杂度表示算法的执行时间不受输入规模的影响。
public class ConstantTime {public static int getFirstElement(int[] array) {return array[0]; // 访问数组的第一个元素,时间复杂度为O(1)}public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5};System.out.println("First element: " + getFirstElement(array));}
}
2. O(log n) - 对数时间复杂度
这种复杂度通常出现在采用分治策略的算法中,如二分查找。
public class BinarySearch {public static int binarySearch(int[] array, int target) {int left = 0;int right = array.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (array[mid] == target) {return mid; // 找到目标元素,返回索引} else if (array[mid] < target) {left = mid + 1; // 目标在右半部分} else {right = mid - 1; // 目标在左半部分}}return -1; // 未找到目标元素}public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};int target = 5;int result = binarySearch(array, target);System.out.println("Element found at index: " + result);}
}
3. O(n) - 线性时间复杂度
这种复杂度表示算法的执行时间与输入规模成正比。
public class LinearTime {public static int sumArray(int[] array) {int sum = 0;for (int i = 0; i < array.length; i++) {sum += array[i]; // 遍历数组,时间复杂度为O(n)}return sum;}public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5};System.out.println("Sum of array elements: " + sumArray(array));}
}
4. O(n^2) - 二次时间复杂度
这种复杂度通常出现在嵌套循环中。
public class QuadraticTime {public static int findPairSum(int[] array, int target) {for (int i = 0; i < array.length; i++) {for (int j = i + 1; j < array.length; j++) {if (array[i] + array[j] == target) {return i + "," + j; // 找到满足条件的元素对,返回索引对}}}return "-1"; // 未找到满足条件的元素对}public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5, 6};int target = 7;String result = findPairSum(array, target);System.out.println("Pair indices: " + result);}
}
三:空间复杂度
1. O(1) - 常数空间复杂度
这种复杂度意味着算法在执行过程中使用的空间是固定的,不会随着输入规模的增大而增加。
public class ConstantSpace {public static int add(int a, int b) {return a + b; // 使用固定数量的变量,空间复杂度为O(1)}public static void main(String[] args) {int result = add(3, 4);System.out.println("Result: " + result);}
}
2. O(n) - 线性空间复杂度
这种复杂度意味着算法使用的空间与输入规模成正比。
public class LinearSpace {public static int[] copyArray(int[] array) {int[] newArray = new int[array.length]; // 创建与输入数组相同大小的新数组,空间复杂度为O(n)for (int i = 0; i < array.length; i++) {newArray[i] = array[i];}return newArray;}public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5};int[] newArray = copyArray(array);for (int num : newArray) {System.out.print(num + " ");}}
}
3. O(n^2) - 二次空间复杂度
这种复杂度通常出现在需要存储二维数组或矩阵的算法中。
public class QuadraticSpace {public static int[][] createMatrix(int n) {int[][] matrix = new int[n][n]; // 创建n*n的二维数组,空间复杂度为O(n^2)for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {matrix[i][j] = i * j; // 示例初始化}}return matrix;}public static void main(String[] args) {int n = 3;int[][] matrix = createMatrix(n);for (int[] row : matrix) {for (int num : row) {System.out.print(num + " ");}System.out.println();}}
}
4. O(log n) - 对数空间复杂度
这种复杂度通常出现在使用递归和分治策略的算法中,其中递归栈的深度与输入规模的对数成正比。
public class LogSpace {public static int binarySearch(int[] array, int target, int left, int right) {if (left > right) {return -1; // 未找到目标元素}int mid = left + (right - left) / 2;if (array[mid] == target) {return mid; // 找到目标元素,返回索引} else if (array[mid] < target) {return binarySearch(array, target, mid + 1, right); // 递归搜索右半部分} else {return binarySearch(array, target, left, mid - 1); // 递归搜索左半部分}}public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};int target = 5;int result = binarySearch(array, target, 0, array.length - 1);System.out.println("Element found at index: " + result);}
}
注意:
- 在分析空间复杂度时,我们通常只关注算法在执行过程中所使用的额外空间(不包括输入数据本身所占用的空间)。
- 递归算法的空间复杂度可能包括递归调用栈的深度。
- 在某些情况下,我们可以通过使用迭代而不是递归来减少空间复杂度。
四、Java中的时间复杂度和空间复杂度
在Java中,基本数据结构的时间复杂度和空间复杂度是评估其性能的重要指标。以下是一些常见Java数据结构的时间复杂度和空间复杂度的概述:
1. 数组(Array)
- 时间复杂度:
- 访问(Access):O(1)
- 搜索(Search,线性搜索):O(n)
- 插入(Insert):O(n)(在末尾插入为O(1),但通常需要移动元素)
- 删除(Delete):O(n)(删除特定元素需要移动元素)
- 空间复杂度:O(n),其中n是数组的元素数量。数组在创建时需要固定大小的连续内存空间。
2. 链表(Linked List)
- 时间复杂度:
- 访问(Access):O(n)(需要从头节点遍历到目标节点)
- 搜索(Search):O(n)(线性搜索)
- 插入(Insert):O(1)(在已知位置插入,如头部或尾部)或O(n)(在未知位置插入)
- 删除(Delete):O(1)(在已知位置删除,如头部或尾部,且知道前驱节点)或O(n)(在未知位置删除)
- 空间复杂度:O(n),其中n是链表的节点数量。每个节点通常需要额外的空间来存储指向下一个节点的引用。
3. 栈(Stack)
- 时间复杂度(基于链表或数组实现):
- 入栈(Push):O(1)
- 出栈(Pop):O(1)
- 访问栈顶(Peek/Top):O(1)
- 空间复杂度:O(n),其中n是栈中的元素数量。
4. 队列(Queue)
- 时间复杂度(基于链表或数组实现,如ArrayList或LinkedList):
- 入队(Enqueue):O(1)(对于链表)或O(n)(对于数组,如果需要扩展容量)
- 出队(Dequeue):O(1)(对于链表)或O(n)(对于数组,需要移动元素)
- 访问队首(Peek/Front):O(1)
- 空间复杂度:O(n),其中n是队列中的元素数量。
5. 哈希表/散列表(Hash Table/Hash Map)
- 时间复杂度(平均情况):
- 插入(Insert):O(1)
- 搜索(Search):O(1)
- 删除(Delete):O(1)
- 时间复杂度(最坏情况,当哈希函数导致大量冲突时):
- 插入:O(n)
- 搜索:O(n)
- 删除:O(n)
- 空间复杂度:O(n),其中n是哈希表中的键值对数量,加上一些额外的空间用于哈希表的内部数据结构(如链表数组用于处理冲突)。
6. 树(Tree)
- 二叉搜索树(Binary Search Tree, BST):
- 时间复杂度(平均情况):O(log n)(对于平衡树)
- 时间复杂度(最坏情况,当树退化为链表时):O(n)
- 空间复杂度:O(n)
- 平衡二叉树(如AVL树、红黑树):
- 时间复杂度:O(log n)(插入、搜索、删除)
- 空间复杂度:O(n)
7. 图(Graph)
- 表示方式:邻接矩阵或邻接表
- 时间复杂度(搜索、遍历等):
- 邻接矩阵:O(n^2)(n是顶点数量)
- 邻接表:O(n + m)(n是顶点数量,m是边数量)
- 空间复杂度:
- 邻接矩阵:O(n^2)
- 邻接表:O(n + m)
注意:
这些时间复杂度和空间复杂度是基于常见操作和数据结构的一般特性。在实际应用中,性能可能会受到实现细节、输入数据的特性和硬件环境的影响。此外,对于某些数据结构(如哈希表),性能还取决于哈希函数的质量和冲突解决策略。
Java常用算法的时间复杂度和空间复杂度:
1. 排序算法
- 冒泡排序(Bubble Sort)
- 时间复杂度:O(n^2)(最好、最坏、平均情况)
- 空间复杂度:O(1)(原地排序)
- 选择排序(Selection Sort)
- 时间复杂度:O(n^2)(最好、最坏、平均情况)
- 空间复杂度:O(1)(原地排序)
- 插入排序(Insertion Sort)
- 时间复杂度:O(n)(最好情况,即数组已排序)、O(n^2)(最坏、平均情况)
- 空间复杂度:O(1)(原地排序)
- 归并排序(Merge Sort)
- 时间复杂度:O(n log n)(最好、最坏、平均情况)
- 空间复杂度:O(n)(需要额外的存储空间来合并数组)
- 快速排序(Quick Sort)
- 时间复杂度:O(n log n)(最好、平均情况),O(n^2)(最坏情况,但可以通过随机化选择枢轴来避免)
- 空间复杂度:O(log n)(由于递归调用栈,最坏情况下为O(n))
- 堆排序(Heap Sort)
- 时间复杂度:O(n log n)(最好、最坏、平均情况)
- 空间复杂度:O(1)(原地排序,但需要额外的空间来维护堆结构,这通常可以忽略不计)
2. 搜索算法
- 线性搜索(Linear Search)
- 时间复杂度:O(n)(最好、最坏、平均情况)
- 空间复杂度:O(1)(不需要额外的存储空间)
- 二分搜索(Binary Search)
- 时间复杂度:O(log n)(最好、最坏、平均情况,前提是数组已排序)
- 空间复杂度:O(1)(不需要额外的存储空间,除了递归调用栈,但在迭代实现中不存在这个问题)
3. 图算法
- 深度优先搜索(DFS)
- 时间复杂度:O(V + E)(V是顶点数量,E是边数量)
- 空间复杂度:O(V)(递归调用栈的深度,最坏情况下为V)
- 广度优先搜索(BFS)
- 时间复杂度:O(V + E)
- 空间复杂度:O(V)(队列存储待访问的顶点)
- Dijkstra算法(用于单源最短路径)
- 时间复杂度:O(V^2)(使用邻接矩阵),O((V + E) log V)(使用优先队列和邻接表)
- 空间复杂度:O(V)(存储最短路径树)
- Floyd-Warshall算法(用于所有顶点对之间的最短路径)
- 时间复杂度:O(V^3)
- 空间复杂度:O(V^2)(存储距离矩阵)
4. 动态规划算法
- 斐波那契数列(使用递归和记忆化搜索)
- 时间复杂度:O(n)(记忆化搜索),O(2^n)(简单递归)
- 空间复杂度:O(n)(记忆化搜索),O(n)(递归调用栈深度,最坏情况下为记忆化搜索的存储空间加上递归栈)
- 背包问题(0/1背包)
- 时间复杂度:O(nW)(n是物品数量,W是背包容量)
- 空间复杂度:O(nW)(存储动态规划表)
注意事项
- 时间复杂度和空间复杂度通常用于评估算法在大数据集上的性能。
- 对于某些算法,可以通过优化来降低时间复杂度和/或空间复杂度。
- 在实际应用中,算法的性能还可能受到输入数据的特性和硬件环境的影响。
- 在选择算法时,需要根据具体问题的需求和约束来权衡时间复杂度和空间复杂度。
五:优化时间复杂度和空间复杂度
优化时间复杂度的策略是提升算法执行效率的重要手段,以下是一些具体的策略:
1. 选择合适的算法
- 分析时间复杂度:在选择算法时,首先要分析并了解其时间复杂度。对于同样的问题,可能存在多种算法,选择时间复杂度更低的算法可以显著提高性能。
- 比较不同算法:对于特定的问题,可以通过比较不同算法的时间复杂度来做出选择。例如,对于排序问题,快速排序和归并排序的时间复杂度通常为O(n log n),而冒泡排序和选择排序的时间复杂度为O(n^2)。
2. 优化现有算法
- 降低算法的时间复杂度:通过改进算法或使用更高效的算法,来降低程序的时间复杂度。例如,使用二分查找来代替线性查找,可以提高查找的效率。
- 减少不必要的计算:在算法中,要避免执行与问题不直接相关的计算。可以通过逻辑判断或数学推导来减少计算量。
- 利用空间换时间:在某些情况下,可以通过增加额外的存储空间来减少计算时间。例如,使用哈希表来加速查找操作。
3. 优化数据结构
- 选择合适的数据结构:根据具体的问题需求,选择合适的数据结构进行存储和操作。例如,使用HashSet代替ArrayList可以提高查找效率。
- 优化数据结构的使用:在使用数据结构时,要注意其内部实现和性能特点。例如,在使用HashMap时,要合理设置初始容量和负载因子,以减少扩容和重新哈希的次数。
4. 循环优化
- 减少循环次数:通过合理的逻辑判断或算法优化来减少循环的次数。例如,使用增强for循环或迭代器来避免使用传统的for循环。
- 避免重复计算:在循环中,要避免重复的计算操作。可以将计算结果保存在变量中,避免每次循环都重新计算。
- 合并相邻的循环:如果存在相邻的循环,可以考虑将其合并成一个循环,以减少循环的次数和循环体操作。
5. 并行处理
- 利用多核处理器的优势:通过并行处理来减少总体执行时间。Java 8引入的Stream API允许开发者轻松地将算法转换为并行执行,从而利用多核处理器的优势。
- 合理划分任务:在进行并行处理时,要合理划分任务,确保每个任务都能充分利用处理器资源。同时,要注意任务之间的依赖关系和同步问题。
6. 使用高效的库和框架
- 借助优秀工具和框架:可以借助一些优秀的工具和框架来帮助我们发现和解决代码优化问题。例如,JProfiler、VisualVM等性能分析工具可以帮助我们找出程序中的性能瓶颈。
- 利用高效的数据处理库:在处理大数据时,可以使用高效的数据处理库来加速计算。例如,Apache Spark、Hadoop等大数据处理框架可以显著提高数据处理效率。
优化时间复杂度的策略包括选择合适的算法、优化现有算法、优化数据结构、循环优化、并行处理以及使用高效的库和框架等方面。在实际应用中,需要根据具体问题的需求和约束来权衡这些因素,以达到最佳的性能优化效果。
优化空间复杂度的策略是提升算法或数据结构在执行过程中内存使用效率的重要手段。以下是一些具体的策略:
1. 选择合适的数据结构
- 评估空间复杂度:在选择数据结构时,要评估其空间复杂度,并根据具体问题的需求来选择合适的数据结构。例如,对于需要频繁查找的场景,可以选择哈希表来减少空间开销。
- 使用紧凑的数据结构:选择内存占用较小的数据结构,如使用
int[]
数组代替ArrayList<Integer>
,因为ArrayList
需要额外的空间来存储对象引用和元数据。
2. 优化算法实现
- 减少临时变量:在算法实现中,尽量减少不必要的临时变量的使用,可以通过逻辑判断或数学推导来减少变量数量。
- 原地算法:尽量使用原地算法,即在不使用额外空间(或仅使用常量额外空间)的情况下进行算法操作。例如,快速排序的原地分区算法。
3. 重复利用空间
- 空间复用:在算法执行过程中,如果某些空间在后续步骤中不再使用,可以将其用于其他目的。例如,在动态规划算法中,可以使用滚动数组来减少空间开销。
- 内存池:使用预分配的内存池来管理内存,避免频繁的分配和释放操作。这可以减少内存碎片和分配开销。
4. 避免不必要的复制
- 传递引用:在算法中传递对象时,尽量传递引用而不是复制对象。这可以减少内存开销,并提高算法效率。
- 使用生成器:在处理大量数据时,可以使用生成器来逐步生成数据,而不是一次性将所有数据加载到内存中。
5. 压缩数据
- 数据压缩算法:对于需要存储或传输的大量数据,可以使用数据压缩算法来减少空间占用。例如,使用霍夫曼编码、LZ77等压缩算法。
- 高效编码:使用更高效的编码方式来存储数据。例如,对于整数数组,可以使用位操作来减少每个整数的存储空间。
6. 并行与分布式处理
- 分布式存储:在处理大规模数据时,可以考虑将数据分布到多个节点上进行存储和处理。这可以分散内存压力,提高整体效率。
- 内存映射文件:对于无法全部加载到内存中的大文件,可以使用内存映射文件技术来将文件的一部分映射到内存中,从而实现按需加载和处理。
7. 使用高效的数据处理库
- 利用高效库:在处理特定类型的数据时,可以使用高效的数据处理库来减少内存开销。例如,在处理图像数据时,可以使用OpenCV等图像处理库;在处理文本数据时,可以使用Apache Lucene等文本处理库。
优化空间复杂度的策略包括选择合适的数据结构、优化算法实现、重复利用空间、避免不必要的复制、压缩数据、并行与分布式处理以及使用高效的数据处理库等方面。在实际应用中,需要根据具体问题的需求和约束来权衡这些因素,以达到最佳的空间优化效果。
7:时间复杂度和空间复杂度的重要性:
时间复杂度和空间复杂度在算法设计和分析中扮演着至关重要的角色。它们不仅决定了算法在不同规模问题上的执行效率,还影响着算法在实际应用中的可行性和性能。
时间复杂度的重要性
-
性能评估:时间复杂度是衡量算法执行时间随输入规模增长而变化的指标。通过比较不同算法的时间复杂度,我们可以评估它们在处理大规模数据时的性能表现。
-
优化方向:了解算法的时间复杂度有助于确定优化的方向。对于时间复杂度较高的算法,我们可以尝试寻找更高效的算法或改进现有算法以降低时间复杂度。
-
算法选择:在实际应用中,我们需要根据问题的具体需求和约束条件来选择最合适的算法。时间复杂度是选择算法时的重要考虑因素之一。
-
硬件限制:随着输入规模的增大,时间复杂度较高的算法可能需要更长的执行时间,这可能会受到硬件资源的限制。因此,在选择和设计算法时,需要考虑硬件资源的限制。
空间复杂度的重要性
-
内存使用:空间复杂度是衡量算法在执行过程中所需内存空间大小的指标。通过评估空间复杂度,我们可以了解算法在内存使用方面的性能表现。
-
资源优化:对于内存资源有限的环境(如嵌入式系统或移动设备),我们需要选择空间复杂度较低的算法来减少内存占用。
-
算法实现:在算法实现过程中,空间复杂度的考虑有助于优化内存使用。例如,我们可以使用原地算法来减少额外的内存开销。
-
并行与分布式处理:在并行和分布式处理环境中,空间复杂度也是重要的考虑因素。因为每个节点或处理器都需要一定的内存空间来存储和处理数据。
在实际应用中,我们需要综合考虑时间复杂度和空间复杂度来评估算法的性能。有时,降低时间复杂度可能会以增加空间复杂度为代价,反之亦然。因此,在选择和设计算法时,我们需要根据具体问题的需求和约束条件来权衡时间复杂度和空间复杂度之间的关系。
总之,时间复杂度和空间复杂度是算法设计和分析中不可或缺的重要指标。它们不仅有助于我们评估算法的性能表现,还为我们提供了优化算法的方向和依据。
时间复杂度和空间复杂度作为衡量算法性能的关键指标,在未来的发展趋势与挑战中将继续占据重要地位。以下是对其未来发展趋势与挑战的详细分析:
未来发展趋势
- 智能化优化:
- 随着自适应算法和智能优化技术的发展,未来的算法将能够根据实时数据自动调整参数,实现自我优化。
- 机器学习和人工智能技术将被广泛应用于算法优化中,以提高算法在不同场景下的性能。
- 高效数据结构:
- 新的高效数据结构将被不断开发出来,以应对日益复杂的问题和大规模的数据处理需求。
- 这些数据结构将具有更低的时间复杂度和空间复杂度,从而提供更高的执行效率和更低的资源消耗。
- 并行与分布式计算:
- 随着多核处理器和分布式计算技术的普及,未来的算法将更加注重并行和分布式处理。
- 通过将问题分解为多个子任务并在多个处理器或节点上并行执行,可以显著降低算法的时间复杂度。
- 量子计算:
- 量子计算的兴起为算法优化带来了新的机遇。
- 量子算法在某些问题上的表现优于经典算法,未来的研究将探索如何将量子计算与传统优化方法结合,以进一步提高算法的性能。
面临的挑战
- 大数据处理:
- 随着数据量的激增,如何高效地处理和分析这些数据成为了一个重要挑战。
- 需要开发新的算法和优化技术,以应对大数据环境下的性能瓶颈和资源限制。
- 动态环境优化:
- 在动态环境中,数据和需求可能随时变化。
- 如何快速适应这些变化并进行实时优化是一个重要的研究方向。
- 算法复杂度分析:
- 随着算法的不断发展和复杂化,如何准确估计算法的时间复杂度和空间复杂度成为了一个技术难点。
- 需要对算法的执行过程有深入的理解,并能够分析出算法中哪些操作是主要的、耗时的。
- 资源限制:
- 在某些应用场景中,如嵌入式系统或移动设备,资源限制非常严格。
- 需要在保证算法性能的同时,尽量降低其时间复杂度和空间复杂度,以适应有限的资源环境。
综上时间复杂度和空间复杂度在未来的发展趋势中将继续受到重视,并将面临新的挑战和机遇。通过不断探索新的优化方法和技术,我们能够在各个领域中实现更高效的计算和更优质的服务。
相关文章:

java算法性能调优:详尽探讨时间复杂度与空间复杂度的分析与优化“
接下来我将带领大家进入Java数据结构的深入学习,让我们一同享受Java数据结构中的奥秘。 一、引言 二、时间复杂度 三、空间复杂度 四、Java中的时间复杂度和空间复杂度 五、优化时间复杂度和空间复杂度 七、时间复杂度和空间复杂度的重要性 一:时间…...

人工智能:塑造未来的工作与生活
目录 人工智能技术的应用前景与影响 人工智能的历史与现状 人工智能的应用领域 人工智能的前景与挑战 个人视角:人工智能的应用前景与未来 人工智能在生活中的潜力 面对人工智能带来的挑战 我的观点与建议 结语 人工智能技术的应用前景与影响 随着人工智能…...

RK3568笔记六十九: 事件回调处理之Libevent 简单使用
若该文为原创文章,转载请注明原文出处。 一、前言 在项目开发过程中,事件处理使用相当多,特别是在UI处理的过程中,UI不能在非UI程里直接操作,否则会出现内存等异常,即不能在子线程里操作UI,所以用事件消息的方式通知UI线程刷新UI界面,在这一细节上掉了好多次坑。 Lib…...

MySQL如何解决幻读?
目录 一、什么是幻读? 1.1 幻读的定义 1.2 幻读的示例 1.3 幻读产生的原因? 1.4 读已提交(Read Committed) 1.4.1 确定事务等级 1.4.2 非锁定读取 准备 示例 结论 1.4.3 锁定读取 准备 示例 分析 结论 1.5 可重复读…...

Javascript_设计模式(二)
什么是迭代器模式?一般用在什么场景? 迭代器模式是一种行为型设计模式,它用于提供一种顺序访问聚合对象中各个元素的方法,而又不暴露该对象的内部表示。通过使用迭代器模式,可以遍历一个聚合对象,而无需关心该对象的内部结构和…...

时间同步服务器
1、时间同步服务:在多台主机协作时,确保时间同步,防止时间不一致造成的故障。 2、时间按同步实现: ntp 、chrony 3、命令:timedatectl timedatectl set-time "2024-02-13 10:41:55" timedatect…...

react+hook+vite项目使用eletron打包成桌面应用+可以热更新
使用Hooks-Admin的架构 Hooks-Admin: 🚀🚀🚀 Hooks Admin,基于 React18、React-Router V6、React-Hooks、Redux、TypeScript、Vite2、Ant-Design 开源的一套后台管理框架。https://gitee.com/HalseySpicy/Hooks-Adminexe桌面应用…...

STM32 ADC --- DMA乒乓缓存
STM32 ADC — DMA乒乓缓存 文章目录 STM32 ADC --- DMA乒乓缓存软件切换实现乒乓利用DMA双缓冲实现乒乓 通过cubeMX配置生成HAL工程这里使用的是上篇文章(STM32 ADC — DMA采样)中生成的工程配置 软件切换实现乒乓 cubeMX默认生成的工程中是打开DMA中断…...

SpringCloud基础 入门级 学习SpringCloud 超详细(简单通俗易懂)
Spring Cloud 基础入门级学习 超详细(简单通俗易懂) 一、SpringCloud核心组件第一代:SpringCloud Netflix组件第二代:SpringCloud Alibaba组件SpringCloud原生组件 二、SpringCloud体系架构图三、理解分布式与集群分布式集群 四、…...

【Windows 常用工具系列 20 -- MobaXterm 登录 WSL】
文章目录 MobaXterm 登录 WSL MobaXterm 登录 WSL 在 WSL 启动之后,打开 MobaXterm: 在 Distribution 中选择自己本地安装的 ubuntu 版本,我这里使用的是ubuntu-20.4,然后在 runmethod 中选择 Localhost connection. 连接成功之…...

【vmware+ubuntu16.04】ROS学习_博物馆仿真克隆ROS-Academy-for-Beginners软件包处理依赖报错问题
首先安装git 进入终端,输入sudo apt-get install git 安装后,创建一个工作空间名为tutorial_ws, 输入 mkdir tutorial_ws#创建工作空间 cd tutorial_ws#进入 mkdir src cd src git clone https://github.com/DroidAITech/ROS-Academy-for-Be…...

UniApp的Vue3版本中H5配置代理的最佳方法
UniApp的Vue3版本中H5项目在本地开发时需要配置跨域请求调试 最开始在 manifest.json中配置 总是报404,无法通过代理请求远程的接口并返回404错误。 经过验证在项目根目录创建 vite.config.js文件 vite.config.js内容: // vite.config.js import {defineConfig }…...

深入了解Pod
Pod是Kubernetes中最小的单元,它由一组、一个或多个容器组成,每个Pod还包含了一个Pause容器,Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC等。 1、Pod 是由一组紧耦合的容器组成的容器组,当然…...

基于Spider异步爬虫框架+JS动态参数逆向+隧道代理+自定义中间件的猎聘招聘数据爬取
在本篇博客中,我们将介绍如何使用 Scrapy 框架结合 JS 逆向技术、代理服务器和自定义中间件,来爬取猎聘网站的招聘数据。猎聘是一个国内知名的招聘平台,提供了大量的企业招聘信息和职位信息。本项目的目标是抓取指定城市的招聘信息࿰…...

Spring 中的 BeanDefinitionParserDelegate 和 NamespaceHandler
一、BeanDefinitionParserDelegate Spring在解析xml文件的时候,在遇到<bean>标签的时候,我们会使用BeanDefinitionParserDelegate对象类解析<bean>标签的内容,包括<bean>标签的多个属性,例如 id name class in…...

BERT模型核心组件详解及其实现
摘要 BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练模型,在自然语言处理领域取得了显著的成果。本文详细介绍了BERT模型中的几个关键组件及其实现,包括激活函数、变量初始化…...

图论-代码随想录刷题记录[JAVA]
文章目录 前言深度优先搜索理论基础所有可达路径岛屿数量岛屿最大面积孤岛的总面积沉默孤岛Floyd 算法dijkstra(朴素版)最小生成树之primkruskal算法 前言 新手小白记录第一次刷代码随想录 1.自用 抽取精简的解题思路 方便复盘 2.代码尽量多加注释 3.记录…...

c#加载shellcode
本地加载bin文件 SharpPELoader项目如下: using System; using System.IO; using System.Runtime.InteropServices;namespace TestShellCode {internal class Program{private const uint MEM_COMMIT 0x1000;private const uint PAGE_EXECUTE_READWRITE 0x40;pr…...

HarmonyOS 开发环境搭建
HarmonyOS(鸿蒙操作系统)作为一种面向全场景多设备的智能操作系统,正逐渐在市场上崭露头角。为了进入HarmonyOS生态,开发者需要搭建一个高效的开发环境。本文将详细介绍如何搭建HarmonyOS开发环境,特别是如何安装和配置…...

【网络云计算】2024第46周周考-磁盘管理的基础知识-RAID篇
文章目录 1、画出各个RAID的结构图,6句话说明优点和缺点,以及磁盘可用率和坏盘数量,磁盘总的数量2、写出TCP五层模型以及对应的常用协议 【网络云计算】2024第46周周考-磁盘管理的基础知识-RAID篇 1、画出各个RAID的结构图,6句话说…...

深入理解 SQL_MODE 之 ANSI_QUOTES
引言 在 MySQL 数据库中,sql_mode 是一个重要的配置参数,它定义了 MySQL 应该遵循的 SQL 语法标准以及数据验证规则。其中,ANSI_QUOTES 是 sql_mode 中的一个重要选项,它改变了 MySQL 对于字符串和标识符的识别方式,使…...

容器技术在持续集成与持续交付中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 容器技术在持续集成与持续交付中的应用 容器技术在持续集成与持续交付中的应用 容器技术在持续集成与持续交付中的应用 引言 容器…...

【嵌入式软件-STM32】OLED显示屏+调试方法
目录 一、调试方式 1)串口调试 优势 弊端 2)显示屏调试 优势 弊端 3)Keil调试模式 4)点灯调试法 5)注释调试法 6)对照法 二、OLED简介 OLED组件 OLED显示屏 0.96寸OLED模块 OLED外观和种类…...

kubernetes简单入门实战
本章将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其访问 Namespace Namespace是k8s系统中一个非常重要的资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下,k8s集群中的所有的Pod都是可以相…...

Python连接Mysql、Postgre、ClickHouse、Redis常用库及封装方法
博主在这里分享一些常见的python连接数据库或中间件的库和封装方案,希望对大家有用。 Mysql封装 #!/usr/bin/python # -*- coding: utf-8 -*- import sys import pymysql from settings import MYSQL_DB, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, EN…...

如何修改npm包
前言 开发中遇到一个问题,配置 Element Plus 自定义主题时,添加了 ElementPlusResolver({ importStyle: "sass" }) 后,控制台出现报错,这是因为 Dart Sass 2.0 不再支持使用 !global 来声明新变量,虽然当前…...

Django 2024全栈开发指南(三):数据库模型与ORM操作(上篇)
目录 一、模型的定义二、数据迁移三、数据表关系四、数据表操作4.1 Shell工具4.2 数据新增4.3 数据修改4.4 数据删除4.5 数据查询 Django 对各种数据库提供了很好的支持,包括 PostgreSQL、MySQL、SQLite 和 Oracle,而且为这些数据库提供了统一的 API 方法…...

低代码可视化-uniapp开关选择组件-低码生成器
开关(Switch)选择组件是一种用户界面元素,允许用户在两种状态(通常是开/关、是/否、启用/禁用等)之间进行切换。这种组件在移动应用、桌面软件、网页以及物联网设备中广泛应用。以下是对开关Switch选择组件的详细介绍&…...

【arxiv‘24】Vision-Language Navigation with Continual Learning
论文信息 题目:Vision-Language Navigation with Continual Learning 视觉-语言导航与持续学习 作者:Zhiyuan Li, Yanfeng Lv, Ziqin Tu, Di Shang, Hong Qiao 论文创新点 VLNCL范式:这是一个新颖的框架,它使得智能体能够在适…...

如何在 Ubuntu 上安装 Jupyter Notebook
本篇文章将教你在 Ubuntu 服务器上安装 Jupyter Notebook,并使用 Nginx 和 SSL 证书进行安全配置。 我将带你一步步在云服务器上搭建 Jupyter Notebook 服务器。Jupyter Notebook 在数据科学和机器学习领域被广泛用于交互式编码、可视化和实验。在远程服务器上运行…...