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

C++面试:算法的执行效率和资源消耗、时间和空间复杂度分析根据实际场景,选用合适的数据结构和算法进行程序设计

目录

算法的执行效率和资源消耗、时间和空间复杂度分析 

执行效率和资源消耗

时间复杂度分析

空间复杂度分析

实际应用

面试技巧

根据实际场景,选用合适的数据结构和算法进行程序设计

所根据原则

实例

 如何选择数据结构示例

合适的数据结构:哈希表

不合适的数据结构:链表

总结

算法的执行效率和资源消耗

根据实际场景选用合适的数据结构和算法


算法的执行效率和资源消耗、时间和空间复杂度分析 

        对算法的执行效率、资源消耗以及时间和空间复杂度的分析是一个重要的考核点。这里我将为你详细介绍这些概念

执行效率和资源消耗

        假设我们有一个基本的排序任务:给定一个整数数组,我们需要将其排序。我们可以使用不同的排序算法来实现这一点,比如冒泡排序和快速排序。这两种排序方法在执行效率和资源消耗方面有显著的不同。

冒泡排序(低执行效率,低资源消耗):

  • 时间复杂度:O(n^2),对于大数据集效率较低。
  • 空间复杂度:O(1),因为它是在原地排序,不需要额外的存储空间。
void bubbleSort(int arr[], int n) {for (int i = 0; i < n-1; i++)    for (int j = 0; j < n-i-1; j++)if (arr[j] > arr[j+1])std::swap(arr[j], arr[j+1]);
}

快速排序(高执行效率,中等资源消耗):

  • 时间复杂度:平均为O(n log n),在大多数情况下比冒泡排序快得多。
  • 空间复杂度:O(log n),因为它是递归的,需要额外的栈空间。
int partition(int arr[], int low, int high) {int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high- 1; j++) {if (arr[j] < pivot) {i++;std::swap(arr[i], arr[j]);}}std::swap(arr[i + 1], arr[high]);return (i + 1);
}void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}

分析:

  • 冒泡排序很简单,但在处理大量数据时效率不高,因为它需要重复比较和交换元素。
  • 快速排序虽然在处理大型数据集时效率更高,但它使用了递归,这意味着在调用栈上需要额外的空间。

时间复杂度分析

  • 时间复杂度是描述算法执行时间与输入数据规模之间关系的一种度量。
  • 常用的表示方法是大O符号,如O(n), O(log n), O(n^2)等。这些表示法描述了算法在最坏情况或平均情况下的性能。
  • 例如,一个线性搜索算法的时间复杂度是O(n),而快速排序的平均时间复杂度是O(n log n)。

        当然,让我们通过两个代码示例来进一步理解时间复杂度分析:一个是线性搜索算法(O(n)),另一个是快速排序算法(平均O(n log n))。

线性搜索算法(时间复杂度O(n)):

  • 在最坏的情况下,这个算法需要遍历整个数组来找到目标元素,因此时间复杂度是O(n)。
int linearSearch(int arr[], int n, int x) {for (int i = 0; i < n; i++)if (arr[i] == x)return i;return -1;
}

        在这个示例中,假设arr是一个整数数组,n是数组的大小,x是我们要查找的元素。如果找到元素,函数返回其索引;如果没有找到,返回-1。

 

快速排序算法(平均时间复杂度O(n log n)):

  • 快速排序在平均情况下的性能很好。它通过分治策略将数据分为较小的部分,并递归地排序这些部分。
int partition(int arr[], int low, int high) {int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high - 1; j++) {if (arr[j] < pivot) {i++;std::swap(arr[i], arr[j]);}}std::swap(arr[i + 1], arr[high]);return (i + 1);
}void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}

        在这个快速排序的例子中,partition函数是关键,它决定了一个“轴心”点,并围绕这个点来排序。quickSort函数则递归地对轴心点左右两边的数组进行排序。

分析:

  • 线性搜索是一种简单的搜索算法,但其效率在大型数据集上会显著下降。
  • 快速排序通过分而治之的策略在大多数情况下提供了很好的性能,尤其是在数据集很大时。

空间复杂度分析

  • 空间复杂度表示算法在运行过程中需要的存储空间与输入数据规模的关系。
  • 也是用大O符号表示,如O(1), O(n), O(n^2)等。
  • 例如,一个使用固定数量变量的算法具有O(1)空间复杂度,而需要一个与输入大小成比例的数组的算法具有O(n)的空间复杂度。

O(1)空间复杂度(常数空间):

  • 这意味着算法的空间需求不随输入数据的大小而变化,它只需要固定数量的内存空间。
  • 例如,下面是一个计算数组中最大元素的函数,它使用了固定数量的变量,因此它的空间复杂度是O(1)。
int findMax(int arr[], int n) {int max = arr[0];for (int i = 1; i < n; i++) {if (arr[i] > max) {max = arr[i];}}return max;
}

O(n)空间复杂度(线性空间):

  • 当算法需要的空间与输入数据的大小成比例时,它的空间复杂度是O(n)。
  • 例如,下面是一个复制数组的函数,它创建了一个新数组,与原数组大小相同,因此它的空间复杂度是O(n)。
int* copyArray(int arr[], int n) {int* newArr = new int[n];for (int i = 0; i < n; i++) {newArr[i] = arr[i];}return newArr;
}

        在这个示例中,我们根据原数组arr的大小n,分配了一个新的数组newArr。因此,随着输入数组的增长,所需的额外空间也线性增长。

分析:

  • findMax函数中,由于只使用了一个额外的变量,所以它的空间复杂度是O(1)。
  • copyArray函数中,我们创建了一个与输入数组等长的新数组,因此随着输入的增长,所需的额外空间也随之增加,空间复杂度为O(n)。

实际应用

        在面试中,理解和分析算法的时间和空间复杂度是非常重要的。同样,了解各种数据结构及其对算法效率的影响也是关键。下面,我将通过一些代码示例来展示这一点,特别是如何不同的数据结构影响算法的性能。

使用数组的算法:

  • 数组是一种基础的数据结构,支持随机访问,但大小固定。
  • 例如,下面是一个使用数组实现的简单线性搜索算法。
int linearSearch(int arr[], int n, int x) {for (int i = 0; i < n; i++)if (arr[i] == x)return i;return -1;
}

        时间复杂度:O(n),因为可能需要遍历整个数组。 空间复杂度:O(1),没有使用额外的存储空间。 

使用链表的算法:

  • 链表是一种元素集合,每个元素都指向下一个,不支持随机访问,但可以动态增长。
  • 例如,这是一个简单的链表节点结构和一个基于链表的搜索算法。
struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};int searchInLinkedList(ListNode* head, int x) {ListNode* current = head;int index = 0;while (current != NULL) {if (current->val == x) return index;current = current->next;index++;}return -1;
}

         时间复杂度:O(n),可能需要遍历整个链表。 空间复杂度:O(1),没有使用额外的存储空间。

使用树的算法:

  • 树是一种分层数据结构,用于表示具有父子关系的数据集合,常用于表示层次结构。
  • 例如,下面是二叉搜索树的查找算法。
struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};bool searchInBST(TreeNode* root, int x) {if (root == NULL) return false;if (root->val == x) return true;else if (x < root->val) return searchInBST(root->left, x);else return searchInBST(root->right, x);
}

        时间复杂度:平均O(log n),在平衡的二叉搜索树中。 空间复杂度:平均O(log n),由于递归调用。 

面试技巧

  1. 理解问题和要求:

    • 在开始之前,确保你完全理解面试官提出的问题。
    • 如果有疑问,不要犹豫提问以澄清。
  2. 评估不同情况:

    • 分析算法时,考虑不同的输入情况,包括最坏情况、平均情况和最佳情况。
    • 最坏情况给出了性能的下限保证,而平均情况则更接近常见的使用场景。
  3. 时间复杂度分析:

    • 明确指出算法的时间复杂度,并用大O表示法来描述。
    • 解释为什么算法会有这样的时间复杂度,可能涉及到循环次数、递归深度等。
  4. 空间复杂度分析:

    • 类似地,分析并说明算法的空间复杂度。
    • 讨论算法使用的额外存储空间,比如栈空间、递归调用的空间或额外分配的数据结构。
  5. 选择合适的数据结构:

    • 解释为什么选用特定的数据结构。不同的数据结构有不同的性能特点,如数组的随机访问和链表的动态大小调整。
    • 考虑数据结构的选择如何影响整体算法的时间和空间效率。
  6. 清晰、有条理的解释:

    • 在解释时,组织你的思路,清晰、逻辑性强地展示你的分析过程。
    • 使用适当的术语,但同时确保解释对非专业听众也是友好的。
  7. 考虑优化:

    • 如果有机会,讨论如何优化你的算法。这可能包括减少不必要的计算、使用更有效的数据结构或者改变算法的逻辑。
  8. 实际编码:

    • 如果被要求编写代码,写出清晰、结构良好的代码。
    • 注释你的代码,特别是复杂的部分,以帮助面试官理解你的思路。
  9. 准备测试用例:

    • 考虑可能的测试用例,包括边缘情况,来验证你的算法。
    • 展示你是如何考虑全面的,包括可能的错误或特殊输入。
  10. 保持冷静,自信:

    • 即使遇到困难,也要保持冷静和专注。
    • 对你的分析和解决方案保持自信,即使它们不是完美的。

根据实际场景,选用合适的数据结构和算法进行程序设计

        选择合适的数据结构和算法是一个重要的考点。这不仅展现了你的编程技巧,还反映了你对问题的理解和解决问题的能力。以下是一些常见场景,以及如何根据这些场景选择合适的数据结构和算法:

所根据原则

  1. 高效的查找操作

    • 场景:需要快速查找数据,例如数据库索引。
    • 数据结构:哈希表(快速查找,平均时间复杂度O(1)),二叉搜索树(保持元素有序,查找时间复杂度O(log n))。
    • 算法:二分查找(针对有序数组)。
  2. 数据项之间存在关系

    • 场景:需要表示元素间的关系,如社交网络。
    • 数据结构:图(可以表示复杂的网络关系)。
    • 算法:深度优先搜索(DFS)、广度优先搜索(BFS)用于图遍历或搜索。
  3. 需要高效的插入、删除操作

    • 场景:需要频繁插入和删除元素,例如优先队列。
    • 数据结构:二叉堆(用于优先队列实现,提供高效的插入和删除),链表(快速插入和删除)。
    • 算法:堆操作(如堆化、插入、删除)。
  4. 数据需要排序或经常变更

    • 场景:数据集经常变动且需要保持有序。
    • 数据结构:平衡树(如AVL树、红黑树,保持树的平衡,提高操作效率)。
    • 算法:各种排序算法(如快速排序、归并排序等)。
  5. 处理字符串匹配问题

    • 场景:文本编辑器中的查找功能或DNA序列匹配。
    • 数据结构:Trie树(高效的字符串检索)。
    • 算法:KMP算法(字符串匹配算法)。
  6. 动态规划问题

    • 场景:求解最优化问题,如最短路径、最大子序列和等。
    • 算法:动态规划算法。

实例

  1. 场景:实现高效的词频统计

    • 选择的数据结构:哈希表
    • 原因:哈希表提供了快速的插入、查找和更新操作(平均O(1)时间复杂度),适用于统计大量数据的词频。不选择如数组或链表,因为它们在查找和更新操作上效率较低。
  2. 场景:数据库中的数据按照键排序和检索

    • 选择的数据结构:平衡二叉搜索树(如红黑树)
    • 原因:保持元素有序并提供了较高效的搜索性能(O(log n)时间复杂度)。不选择普通数组或链表,因为它们的排序和搜索效率较低。
  3. 场景:网络路由器中快速匹配IP地址

    • 选择的数据结构:Trie树
    • 原因:Trie树在处理字符串匹配问题时非常高效,特别是在IP地址这种固定格式的字符串上。不选择哈希表,因为Trie树可以更快地匹配前缀。
  4. 场景:撤销功能在文本编辑器中的实现

    • 选择的数据结构:栈
    • 原因:栈提供了先进后出的特性,适合实现撤销功能。不选择队列,因为队列是先进先出,不适合撤销操作。
  5. 场景:消息队列系统中消息的管理

    • 选择的数据结构:队列
    • 原因:队列提供了先进先出的特性,适合消息按顺序处理。不选择栈,因为栈是后进先出,不适合按顺序处理消息。
  6. 场景:实现网页浏览器的前进和后退功能

    • 选择的数据结构:两个栈
    • 原因:一个栈用于后退,另一个用于前进,可以有效模拟浏览器的这两个功能。不选择队列或列表,因为它们不能同时高效地支持这两种操作。
  7. 场景:电子商务网站的商品推荐系统

    • 选择的数据结构:图
    • 原因:图可以表示商品之间的复杂关系和用户偏好。不选择数组或哈希表,因为它们不适合表示复杂的关系网络。
  8. 场景:游戏中非玩家角色的路径查找

    • 选择的数据结构:图和堆(用于实现Dijkstra或A*算法)
    • 原因:图适合表示游戏地图上的节点和路径,堆用于快速找到下一个最短路径节点。不选择普通数组或链表,因为它们不适合复杂的路径查找。
  9. 场景:银行系统中的账户管理

    • 选择的数据结构:哈希表或平衡树
    • 原因:哈希表提供快速访问特定账户,平衡树适合维持账户的有序状态。不选择普通链表,因为它在查找方面效率较低。
  10. 场景:操作系统的文件系统管理

    • 选择的数据结构:B树或B+树
    • 原因:B树和B+树非常适合于磁盘存储的大量数据,提供高效的搜索和插入操作。不选择普通的二叉树,因为B树和B+树更适合处理大规模数据的磁盘I/O操作。
  11. 场景:实时股票市场的价格更新和查询

    • 选择的数据结构:哈希表
    • 原因:哈希表能够提供快速的数据插入和检索操作,非常适合频繁更新和查询的场景,如股票市场的实时价格。不选择链表或数组,因为它们在大量数据下的查找效率较低。
  12. 场景:航空公司的航班和预订系统

    • 选择的数据结构:图
    • 原因:图可以有效地表示航班之间的复杂网络,包括各种航线和连接。它有助于实现航班间的最优路径搜索和预订管理。不选择数组或哈希表,因为它们不适合表示复杂的网络关系。
  13. 场景:新闻网站的文章和关键字索引

    • 选择的数据结构:倒排索引(使用哈希表和链表)
    • 原因:倒排索引结构适合于实现高效的关键字搜索,可以快速找到包含特定关键字的文章。不选择普通数组,因为它不适合实现快速的关键字检索。
  14. 场景:游戏中的得分排行榜

    • 选择的数据结构:堆(尤其是最大堆或最小堆)
    • 原因:堆可以有效地维护得分的排行,允许快速更新和检索最高或最低得分。不选择数组或链表,因为它们在维护有序元素时效率较低。
  15. 场景:在线考试系统中的题目随机抽取

    • 选择的数据结构:数组
    • 原因:数组提供了随机访问的能力,适合于随机抽取题目。不选择链表,因为链表不支持高效的随机访问。
  16. 场景:文档编辑软件中的文本存储

    • 选择的数据结构:链表(特别是双向链表)
    • 原因:链表适合于频繁的插入和删除操作,例如文档编辑中的文本更新。不选择数组,因为数组在插入和删除时效率较低。
  17. 场景:音乐播放器的播放列表管理

    • 选择的数据结构:双向链表
    • 原因:双向链表支持在播放列表中向前和向后遍历,适合于播放、暂停、上一曲和下一曲等操作。不选择栈或队列,因为它们不支持双向操作。
  18. 场景:实现一个高效的缓存机制

    • 选择的数据结构:哈希表与双向链表(例如在LRU缓存中的应用)
    • 原因:这种结合提供了快速的数据访问和易于维护的缓存淘汰策略。不选择仅使用数组或单链表,因为它们在更新缓存策略时效率较低。
  19. 场景:多线程程序中的任务调度

    • 选择的数据结构:阻塞队列
    • 原因:阻塞队列适合于多线程环境,能够安全地管理任务的生产和消费。不选择非线程安全的数据结构如普通数组或链表。
  20. 场景:网络服务器的连接管理

    • 选择的数据结构:事件驱动的模型(如使用选择器或轮询)
    • 原因:这种模型适合于处理大量并发连接,有效地分配服务器资源。不选择简单的队列或栈,因为它们不适合复杂的网络事件处理。
  21. 场景:跨平台通讯应用中的消息同步

    • 选择的数据结构:队列
    • 原因:队列提供了先进先出的特性,适合于按顺序处理和同步消息。不选择栈,因为栈的后进先出特性不适合消息的顺序处理。
  22. 场景:电子商务网站的购物车功能

    • 选择的数据结构:链表
    • 原因:链表允许高效的插入和删除操作,适合于购物车中商品的增加和移除。不选择数组,因为数组的插入和删除操作效率较低。
  23. 场景:实现多级菜单的导航系统

    • 选择的数据结构:树
    • 原因:树结构适合于表示层次关系,如多级菜单。不选择线性结构如数组或链表,因为它们不适合表示层次化数据。
  24. 场景:公交或地铁线路的查询系统

    • 选择的数据结构:图
    • 原因:图结构能够表示公交或地铁线路之间的复杂关系,便于查找最短路径或最快路线。不选择树或链表,因为它们不能有效表示多对多的关系。
  25. 场景:汽车导航系统中的最短路径计算

    • 选择的数据结构:图
    • 原因:图是表示道路和交叉点的理想选择,适用于计算最短或最快路径。不选择数组或哈希表,因为它们不适合表示复杂的网络结构。
  26. 场景:编译器中的语法分析

    • 选择的数据结构:栈
    • 原因:栈适用于实现编译器中的语法分析算法,如递归下降解析。不选择队列,因为编译器的语法分析需要后进先出的特性。
  27. 场景:实现大数据集的快速排序

    • 选择的数据结构:数组
    • 原因:数组提供了连续的内存空间和随机访问的特性,适合实现如快速排序等高效排序算法。不选择链表,因为链表的随机访问效率较低。
  28. 场景:在线论坛中帖子的评论功能

    • 选择的数据结构:树(特别是多叉树)
    • 原因:树结构可以表示评论及其回复之间的层次关系,便于组织和显示。不选择线性结构,因为它们不能直观地表示这种层次化的关系。
  29. 场景:游戏中的敌人AI决策

    • 选择的数据结构:决策树
    • 原因:决策树适合于表示和处理基于不同条件和可能性的决策过程。不选择简单的线性结构,因为它们不适合复杂的决策逻辑。
  30. 场景:实现文件系统的目录结构

    • 选择的数据结构:树(特别是多叉树)
    • 原因:树结构能够直观地表示文件和目录之间的层次关系。不选择图,因为文件系统的目录结构通常不涉及复杂的循环或多对多关系。

 如何选择数据结构示例

合适的数据结构:哈希表

        使用哈希表(在C++中通常是std::unordered_map)可以实现快速的数据检索。这对于登录系统非常重要,因为它经常需要检索用户信息来验证登录凭证。

#include <iostream>
#include <unordered_map>
#include <string>class LoginSystem {
private:std::unordered_map<std::string, std::string> userDatabase;public:void addUser(const std::string& username, const std::string& password) {userDatabase[username] = password;}bool authenticate(const std::string& username, const std::string& password) {auto it = userDatabase.find(username);return it != userDatabase.end() && it->second == password;}
};int main() {LoginSystem system;system.addUser("user1", "password123");system.addUser("user2", "mypassword");std::cout << "User1 authentication: " << (system.authenticate("user1", "password123") ? "Success" : "Failure") << std::endl;std::cout << "User2 authentication: " << (system.authenticate("user2", "wrongpassword") ? "Success" : "Failure") << std::endl;return 0;
}

不合适的数据结构:链表

        使用链表(如std::list)来实现用户登录系统会导致效率问题。链表不支持快速的随机访问,因此检索特定用户的信息时,平均需要遍历半个列表,这在用户数量较多时会非常低效。

#include <iostream>
#include <list>
#include <string>class LoginSystem {
private:std::list<std::pair<std::string, std::string>> userDatabase;public:void addUser(const std::string& username, const std::string& password) {userDatabase.push_back({username, password});}bool authenticate(const std::string& username, const std::string& password) {for (const auto& user : userDatabase) {if (user.first == username && user.second == password) {return true;}}return false;}
};int main() {LoginSystem system;system.addUser("user1", "password123");system.addUser("user2", "mypassword");std::cout << "User1 authentication: " << (system.authenticate("user1", "password123") ? "Success" : "Failure") << std::endl;std::cout << "User2 authentication: " << (system.authenticate("user2", "wrongpassword") ? "Success" : "Failure") << std::endl;return 0;
}

        在第一个示例中,哈希表提供了O(1)的平均时间复杂度,而第二个示例中,链表的查找操作需要O(n)的时间复杂度。因此,对于需要快速检索的应用,如用户登录系统,选择合适的数据结构是非常重要的。

总结

        在C++面试中,对算法的执行效率、资源消耗以及时间和空间复杂度的分析是核心组成部分。同时,能够根据实际场景选用合适的数据结构和算法进行程序设计也是评估候选人能力的重要方面。以下是对这两个方面的总结:

算法的执行效率和资源消耗

  1. 时间复杂度:衡量算法执行时间随输入数据规模增长的变化趋势。常见的时间复杂度有O(1)、O(log n)、O(n)、O(n log n)、O(n^2)等。优选时间复杂度低的算法可以提高程序的运行效率。

  2. 空间复杂度:衡量算法在执行过程中消耗的额外内存空间随输入数据规模的变化。例如,递归算法由于递归调用栈的存在,可能有较高的空间复杂度。

  3. 优化策略:包括但不限于减少不必要的计算、使用适当的数据结构、避免深层递归、使用迭代代替递归等。

根据实际场景选用合适的数据结构和算法

  1. 理解需求:根据应用场景的具体需求选择合适的数据结构和算法。例如,需要快速检索时使用哈希表,需要保持数据有序时使用平衡二叉树等。

  2. 权衡考虑:在选择时考虑时间和空间的权衡,以及实现的复杂性。有时需要在速度和内存消耗之间找到平衡点。

  3. 实际应用:例如,在网络应用中使用图来处理复杂关系,在缓存机制中使用哈希表来提高访问效率,在文件系统中使用树来管理文件层级结构等。

  4. 特殊场景考虑:考虑数据的规模、是否涉及并发编程、数据的持久化等因素,这些都会影响数据结构和算法的选择。

        在C++面试中,候选人不仅要展示对算法效率和资源消耗的理解,还要展示能够根据不同场景合理选择数据结构和算法的能力。这需要深入的理论知识和丰富的实际编程经验。掌握这些知识和技能对于准备腾讯等公司的C++开发岗位面试至关重要。

相关文章:

C++面试:算法的执行效率和资源消耗、时间和空间复杂度分析根据实际场景,选用合适的数据结构和算法进行程序设计

目录 算法的执行效率和资源消耗、时间和空间复杂度分析 执行效率和资源消耗 时间复杂度分析 空间复杂度分析 实际应用 面试技巧 根据实际场景&#xff0c;选用合适的数据结构和算法进行程序设计 所根据原则 实例 如何选择数据结构示例 合适的数据结构&#xff1a;哈…...

力扣100215-按键变更的次数

按键变更的次数 题目链接 解题思路 我们发现只要相邻的两个字母不一样(大小写算一样)&#xff0c;那么按键变更次数就要加1 class Solution { public:int countKeyChanges(string s) {int ans 0;for(int i 1;i<s.size();i){if(s[i] - s[i-1] 32 || s[i] - s[i-1] -32 |…...

STM32-GPIO输出(HAL库)

STM32-GPIO 介绍 什么是GPIO&#xff1f; GPIO&#xff08;通用输入/输出&#xff09;是一种用于与外部设备进行数字通信的通用硬件接口。它允许微控制器或其他数字电路的引脚以灵活的方式配置为输入或输出&#xff0c;并在运行时进行动态控制。GPIO可用于连接和控制各种外围…...

倒计时80天

1.J-兔子不会种树_浙江机电职业技术学院第八届新生亮相赛&#xff08;同步赛&#xff09; (nowcoder.com) /****** __----~~~~~~~~~~~------___* . . ~~//...... __--~ ~~…...

PBM模型参数详解

本专栏着重讲解PBM学习所得&#xff0c;学习笔记、心得&#xff0c;并附有视频素材资料&#xff0c;视频详细目录如下&#xff1a; PBM相关参数解释1PBM相关参数解释2PBM相关案例实践1PBM相关案例实践2PBM相关案例实践2PBM相关案例实践3PBM多相流中次相界面设置1PBM多相流中次…...

贪吃蛇/链表实现(C/C++)

本篇使用C语言实现贪吃蛇小游戏&#xff0c;我们将其分为了三个大部分&#xff0c;第一个部分游戏开始GameStart&#xff0c;游戏运行GameRun&#xff0c;以及游戏结束GameRun。对于整体游戏主要思想是基于链表实现&#xff0c;但若仅仅只有C语言的知识还不够&#xff0c;我们还…...

Qlik Sense : IntervalMatch(离散匹配)

什么是IntervalMatch IntervalMatch 前缀用于创建表格以便将离散数值与一个或多个数值间隔进行匹配&#xff0c;并且任选匹配一个或多个额外关键值。 语法&#xff1a; IntervalMatch (matchfield)(loadstatement | selectstatement ) IntervalMatch (matchfield,keyfield…...

MySql45讲-08.事务到底是隔离的还是不隔离的?(结合MVCC视频)

命令的启动时机 begin/start transaction 命令并不是一个事务的起点&#xff0c;在执行到它们之后的第一个操作InnoDB表的语句&#xff0c;事务才真正启动。如果你想要马上启动一个事务&#xff0c;可以使用start transaction with consistent snapshot 这个命令。 事务的版本…...

备战蓝桥杯----数据结构及STL应用(基础2)

上次我们讲了vector的大致内容&#xff0c;接下来让我们讲一下栈&#xff0c;队列吧&#xff01; 什么是栈呢&#xff1f; 很简单&#xff0c;我们用的羽毛球桶就是&#xff0c;我们取的球&#xff0c;是最后放的&#xff0c;栈是一种先进后出的数据结构。 方法函数 s.push(…...

日常学习之:vue + django + docker + heroku 对后端项目 / 前后端整体项目进行部署

文章目录 使用 docker 在 heroku 上单独部署 vue 前端使用 docker 在 heroku 上单独部署 django 后端创建 heroku 项目构建 Dockerfile设置 settings.pydatabase静态文件管理安全设置applicaiton & 中间件配置 设置 requirements.txtheroku container 部署应用 前后端分别部…...

LangGraph:一个基于LangChain构建的AI库,用于创建具有状态、多参与者的应用程序

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

04-Nacos-服务注册基于spring boot实现

官方参考 在不依赖spring cloud 组件基础上&#xff0c;单独的微服务项目&#xff0c;实现nacos接入 1、依赖文件pom.xml <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactId><…...

iOS 闭包和Block的区别

iOS 闭包和Block的区别 原文地址: mob64ca12eb7baf 引言 在iOS开发中&#xff0c;闭包和Block是两个常用的概念。它们都是将一段代码作为变量传递和使用的方式。尽管它们在实现上有一些相似之处&#xff0c;但它们之间还是存在一些重要的区别。本文将会详细介绍闭包和Block的…...

后端学习笔记——后端细碎知识点(每天更新......)

细碎知识点 主要是go后端&#xff0c;也会设计到python、java的知识&#xff0c;懒得分类整理&#xff0c;所以都写在一篇文章里面了&#xff0c;方便自己查看笔记。 context.BindJSON获取POST请求中的json数据gin.H封装了生成json的方式 common.ReturnJSONSuccess(c, gin.H{&…...

二进制中1的个数

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…...

python+matlab text(按图的相对位置显示)

python 用 python 画图时&#xff0c;如果想采用归一化的坐标来指定文本框的位置&#xff0c;则需要用到 transform ax.transAxes 参数&#xff0c;如 ax plt.gca() plt.text(0.1,0.2, "text", fontsize 20, transform ax.transAxes)matlab 方法1 text(___,Name…...

rust 引用/mut 的所有权

在任意给定时间&#xff0c;要么 只能有一个可变引用&#xff0c;要么 只能有多个不可变引用。 不可变引用&#xff08;shared reference&#xff09;实现了Copy trait&#xff0c;不会发生所有权转移可变引用&#xff08;mutable reference&#xff09;未实现&#xff0c;会发…...

油烟净化器科技改革,清新用餐生活

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 随着餐饮业蓬勃发展&#xff0c;人们对用餐环境的要求也与日俱增。本文将深入研讨餐饮油烟净化器技术的改革方向&#xff0c;…...

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch01-1 刚体系统的运动学约束

本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有帮助请引用 本文参考: 《空间机构的分析与综合(上册)》-张启先…...

51单片机智能小车

51单片机智能小车 delay.c #include "intrins.h"void Delay2000ms() //11.0592MHz {unsigned char i, j, k;i 15;j 2;k 235;do{do{while (--k);} while (--j);} while (--i); }void Delay10us() //11.0592MHz {unsigned char i;i 2;while (--i); }void Delay…...

9. 嵌入式系统开发:安全性与可靠性设计模式---引言

在复杂的嵌入式系统设计中&#xff0c;为了提高嵌入式系统安全性并保护嵌入式系统免受各种潜在故障的影响&#xff0c;可以采用不同的设计模式。这些模式各自有优势和适用的场景&#xff1a; 1. 受保护的单通道模式&#xff08;Protected Single Channel Pattern&#xff09; …...

内网安全:Exchange服务

目录 Exchange服务 实验环境 域横向移动-内网服务-Exchange探针 一. 端口扫描 二. SPN扫描 三. 脚本探针(还可以探针是否有安全漏洞) 域横向移动-内网服务-Exchange爆破 一 .BurpSuite Intruder模块爆破 域横向移动-内网服务-Exchange漏洞 CVE-2020-17144 Exchange R…...

Flask介绍和优势

Flask诞生于2010年&#xff0c;是由Armin Ronacher用Python语言编写的一款轻量级Web开发框架。自发布以来&#xff0c;Flask逐渐成为开发人员喜爱的选择&#xff0c;并在2021年5月发布了Flask 2.0版本&#xff0c;引入了一些新增特性&#xff0c;如基本的异步支持。 使用Flask…...

喜报|「云原生数据库PolarDB」、「阿里云瑶池一站式数据管理平台」揽获“2023技术卓越奖”

日前&#xff0c;国内知名IT垂直媒体&技术社区IT168公布2023年“技术卓越奖”评选结果&#xff0c;经由行业CIO/CTO大咖、技术专家及IT媒体三方的联合严格评审&#xff0c;阿里云瑶池数据库揽获两项大奖&#xff1a;云原生数据库PolarDB荣获“2023年度技术卓越奖”&#xf…...

【动态规划】【字符串】【行程码】1531. 压缩字符串

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 LeetCode 1531. 压缩字符串 II 行程长度编码 是一种常用的字符串压缩方法&#xff0c;它将连续的相同字符&#xff08;重复 2 次或更多次&#xff09;替换为字符和表示字符计数的数字&#xff08;行程长度&#xff09;…...

检测头篇 | 原创自研 | YOLOv8 更换 SEResNeXtBottleneck 头 | 附详细结构图

左图:ResNet 的一个模块。右图:复杂度大致相同的 ResNeXt 模块,基数(cardinality)为32。图中的一层表示为(输入通道数,滤波器大小,输出通道数)。 1. 思路 ResNeXt是微软研究院在2017年发表的成果。它的设计灵感来自于经典的ResNet模型,但ResNeXt有个特别之处:它采用…...

PHP语法

#本来是在学命令执行&#xff0c;所以学了学&#xff0c;后来发现&#xff0c;PHP语法和命令执行的关系好像没有那么大&#xff0c;不如直接学php的一些命令执行函数了。# #但是还是更一下&#xff0c;毕竟还是很多地方都要求掌握php作为脚本语言&#xff0c;所以就学了前面的…...

MySQL:三大日志(binlog、redolog、undolog)

再了解三个日志前我们先了解一下MySQL的两层架构&#xff1a; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包括连接器&#xff0c;查询缓存、解析器、预处理器、优化器、执行器等。另外&#xff0c;所有的内置函数和所有跨…...

【QT+QGIS跨平台编译】之十二:【libpng+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文件目录 一、libpng介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libpng介绍 PNG(Portable Network Graphics,便携式网络图形),是一种采用无损压缩算法的位图格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。 PNG使用从LZ77派生的无损数据压缩算…...

Windows 和 Anolis 通过 Docker 安装 Milvus 2.3.4

Windows 10 通过 Docker 安装 Milvus 2.3.4 一.Windows 安装 Docker二.Milvus 下载1.下载2.安装1.Windows 下安装&#xff08;指定好Docker文件目录&#xff09;2.Anolis下安装 三.数据库访问1.ATTU 客户端下载 一.Windows 安装 Docker Docker 下载 双击安装即可&#xff0c;安…...