当前位置: 首页 > 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…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...