程序员必备:时间复杂度与空间复杂度分析实战指南
1. 从“跑得快”到“装得下”为什么程序员必须懂复杂度分析刚入行那会儿我写代码只关心一个事儿能不能跑出结果。只要程序不报错输出正确就觉得万事大吉。直到有一次我写了一个处理几万条数据的脚本在自己的电脑上测试时一切正常结果部署到服务器上直接卡死CPU占用率飙升到100%内存也瞬间吃满。那次线上事故让我被导师狠狠批了一顿也让我第一次深刻认识到代码“能跑”和“跑得好”之间隔着一条叫做“复杂度”的鸿沟。后来我才明白时间复杂度和空间复杂度这两个听起来有点学术的词其实是每个程序员手里最基础、也最强大的“性能标尺”。它们不关心你的代码在酷睿i9上跑还是在树莓派上跑也不关心你用的是Python还是C它们只关心你的算法逻辑本身随着数据规模我们通常用n来表示的增大它的执行时间和占用内存会以什么样的趋势增长。这就像你网购时不关心快递员开的是三轮车还是卡车只关心包裹送达时间时间和包裹大小空间与商品数量的关系。掌握复杂度分析你就能在动手写代码之前对算法的“性价比”有一个清晰的预判。面对一个需求你脑子里会立刻浮现几种可能的解法并快速估算出“哦方案A虽然逻辑简单但数据量大了可能会慢如蜗牛时间复杂度高方案B虽然快但可能特别吃内存空间复杂度高方案C可能是个不错的折中选择。” 这种能力是区分一个只会写功能代码的程序员和一个能设计高效、健壮系统的工程师的关键。无论是面试大厂还是在实际工作中做技术选型、性能优化复杂度分析都是你绕不开的基本功。这篇文章我就结合自己踩过的坑和总结的经验把时间复杂度和空间复杂度给你掰开揉碎了讲明白。2. 大O表示法衡量算法增长的“标尺”在深入时间与空间复杂度之前我们必须先统一度量衡。这个度量衡就是大O表示法。它并不是一个精确的计算公式不会告诉你算法具体运行了3.5秒还是占用了512MB内存。它的核心作用是描述增长趋势。2.1 大O表示法的核心思想抓大放小想象一下你要评估北京到上海不同交通方式的时间成本。步行、骑车、开车、高铁、飞机时间差异巨大。大O表示法关注的是当距离类比数据规模n变得非常非常大时哪种交通方式的“时间增长特性”占主导地位。忽略常数项如果算法A需要2n 5步操作算法B需要n 100步。当n很大时比如1亿5和100以及前面的系数2都变得微不足道。它们的时间增长趋势都与n成正比所以我们都记作O(n)。大O表示法不关心细枝末节只关心最主要的那个“增长级”。忽略低阶项如果算法C需要n² 10n 1000步操作。当n很大时n²平方项的增长速度会远远超过10n一次项和1000常数项。就像一场比赛当n足够大冠军n²的优势会大到让亚军10n和季军1000的存在感消失。因此算法C的复杂度我们只取最高阶项记作O(n²)。注意大O表示法描述的是最坏情况下的增长趋势上界。这是一种保守的、保证性的估计。在实际工程中我们有时也会关心平均情况但大O最坏情况是分析和交流时最通用的语言。2.2 常见复杂度层级与直观感受光说趋势可能有点抽象我们来点直观的。假设你的计算机每秒能处理1亿次10^8基本操作看看不同复杂度算法处理不同规模数据所需的大致时间复杂度名称n10 时n1000 时n100,000 时直观感受O(1)常数阶瞬间瞬间瞬间完美与数据量无关O(log n)对数阶瞬间瞬间瞬间优秀增长极其缓慢O(n)线性阶瞬间0.01毫秒1毫秒良好和数据量成正比O(n log n)线性对数阶瞬间0.1毫秒20毫秒不错很多高效算法的复杂度O(n²)平方阶瞬间10毫秒2.7小时一般小数据尚可大数据灾难O(2^n)指数阶0.1微秒宇宙年龄的N倍无法想象可怕基本不可用O(n!)阶乘阶3.6毫秒…………恐怖只能用于极小规模从上表可以清晰地看到O(n²)是一个重要的分水岭。当数据量n达到10万时O(n)的算法只需1毫秒而O(n²)的算法需要近3个小时这在实际业务中是完全不可接受的。而指数阶和阶乘阶的算法除了在极小规模如n20的学术或特殊场景下在工程中基本意味着“此路不通”。实操心得养成习惯在设计和评审算法时心里先默算一下它的复杂度。如果发现是O(n²)或更高一定要问自己有没有可能优化到O(n log n)或O(n)这个简单的习惯能帮你避免未来90%的性能瓶颈。3. 时间复杂度详解你的算法到底“慢”在哪时间复杂度衡量的是算法执行时间随数据规模增长的变化趋势。分析的关键是找出执行次数与n之间的函数关系。3.1 如何分析一段代码的时间复杂度核心原则关注循环和递归忽略单条语句。1. 常数阶 O(1)def constant_time_operation(data): first_element data[0] # O(1) size len(data) # O(1) return first_element, size # O(1)无论数组data有多大只要索引有效获取第一个元素、获取长度、返回结果这些操作的执行时间都是固定的与n无关。所以总时间复杂度是 O(1)。2. 线性阶 O(n)def linear_search(arr, target): for i in range(len(arr)): # 循环 n 次 if arr[i] target: # 循环体内的操作是 O(1) return i return -1这是最典型的单层循环。循环的次数直接与输入数组的长度n成正比。循环体内的操作比较、返回是常数时间 O(1)。所以总时间复杂度是 n * O(1) O(n)。3. 对数阶 O(log n)def binary_search(sorted_arr, target): left, right 0, len(sorted_arr) - 1 while left right: # 循环条件 mid (left right) // 2 # O(1) if sorted_arr[mid] target: # O(1) return mid elif sorted_arr[mid] target: left mid 1 # 搜索范围减半 else: right mid - 1 # 搜索范围减半 return -1二分查找是O(log n)的经典例子。为什么是log n因为每次比较后搜索范围都会减半。假设最坏情况下需要一直分割到只剩一个元素。那么有n, n/2, n/4, ..., 1。设循环次数为 k则 n / (2^k) 1解得 k log₂n。在大O表示法中我们忽略对数的底数统一记为 O(log n)。4. 线性对数阶 O(n log n)# 以归并排序的合并过程为例简化 def merge_sort(arr): if len(arr) 1: return arr mid len(arr) // 2 left merge_sort(arr[:mid]) # T(n/2) right merge_sort(arr[mid:]) # T(n/2) return merge(left, right) # O(n) 的合并操作 # merge函数需要遍历两个子数组的所有元素时间复杂度为O(n)O(n log n) 常见于高效的排序算法如归并排序、快速排序平均情况和一些分治算法。它的产生通常是一个 O(log n) 的分治层数乘以每一层需要处理的 O(n) 的工作量。5. 平方阶 O(n²)def bubble_sort(arr): n len(arr) for i in range(n): # 外循环 n 次 for j in range(0, n-i-1): # 内循环约 n-i 次平均约 n/2 次 if arr[j] arr[j1]: arr[j], arr[j1] arr[j1], arr[j]冒泡排序是O(n²)的教科书案例。外层循环执行n次内层循环平均执行n/2次。总的操作次数约为 n * (n/2) n²/2忽略常数和系数就是 O(n²)。常见的双重循环遍历二维数组、选择排序、插入排序最坏情况都是这个复杂度。6. 指数阶 O(2^n)def fibonacci_recursive_naive(n): if n 1: return n return fibonacci_recursive_naive(n-1) fibonacci_recursive_naive(n-2)这是计算斐波那契数列最直观但最低效的递归方法。它的递归树是一个二叉树每个节点分裂成两个子节点计算f(n-1)和f(n-2)。总节点数即函数调用次数大约是 2^n 量级因此时间复杂度为 O(2^n)。当 n40 时调用次数已超过万亿完全不可行。避坑技巧遇到指数级复杂度的算法一定要警惕。通常意味着需要寻找动态规划、记忆化搜索等优化手段将复杂度降为多项式时间如O(n)或O(n²)。3.2 时间复杂度分析的进阶场景1. 多个复杂度并列取最大值def complex_operation(arr): # 第一部分O(n) for num in arr: print(num) # 第二部分O(n²) for i in range(len(arr)): for j in range(len(arr)): print(arr[i], arr[j]) # 第三部分O(log n) result 1 while result len(arr): result * 2总时间复杂度不是相加而是取最高阶的那一个。即 T(n) O(n) O(n²) O(log n) O(n²)。因为当 n 趋于无穷大时O(n²) 的增长速度远超其他两项占绝对主导地位。2. 嵌套循环的复杂度不是简单的相乘def tricky_loop(n): i 1 while i n: # 这个循环执行多少次 j i while j n: # 内层循环次数与 i 相关 print(i, j) j * 2 i 1这里不能直接说外层循环O(n)内层循环O(log n)所以总的是O(n log n)。因为内层循环的j起始值是i且每次翻倍。需要更精确的分析外层循环i从1到n-1。对于每个固定的i内层循环j从i开始每次乘2直到大于等于n。执行次数约为 log₂(n/i)。总操作次数近似为 Σ_{i1}^{n-1} log₂(n/i)。这个求和式的结果经推导约为 O(n)而不是 O(n log n)。关键在于内层循环的规模在随着外层循环变量变化。3. 递归算法的时间复杂度分析递归复杂度通常需要建立递归方程来求解。示例归并排序T(n) 2T(n/2) O(n)。通过主定理或递归树法可解得 T(n) O(n log n)。示例斐波那契低效递归T(n) T(n-1) T(n-2) O(1)。可证明 T(n) 近似于 O(2^n)。对于递归画出一个递归树是很好的分析方法直观地看有多少层每层的工作量是多少。4. 空间复杂度详解你的算法到底“吃”多少内存空间复杂度衡量的是算法运行过程中临时占用的存储空间大小随数据规模增长的变化趋势。这里指的是除了输入数据本身所占空间外算法运行所需的“额外”空间。4.1 如何分析空间复杂度核心是看算法运行过程中显式声明的变量、数组、容器以及递归调用栈所开辟的空间。1. 常数空间 O(1)def find_max(arr): max_val arr[0] # 一个变量 for num in arr: if num max_val: max_val num # 只是更新变量没有新开辟与n相关的空间 return max_val无论输入数组arr多大算法只使用了固定数量的额外变量max_val, 循环索引i等。这些变量的数量与n无关因此空间复杂度是 O(1)。原地排序算法如冒泡、选择、插入、堆排序通常也是 O(1)。2. 线性空间 O(n)def copy_and_double(arr): new_arr [] # 开辟了一个新的列表 for num in arr: new_arr.append(num * 2) # 新列表的大小与输入arr成正比 return new_arr这里创建了一个新的列表new_arr其最终长度与输入列表arr的长度n相等。因此额外空间复杂度是 O(n)。很多需要返回新数据结构的操作如 map, filter都属于此类。3. 递归调用带来的空间复杂度def sum_recursive(arr, index0): if index len(arr): return 0 return arr[index] sum_recursive(arr, index 1) # 递归调用这是一个线性递归。每次递归调用都会在调用栈上压入一个新的栈帧保存参数、返回地址、局部变量等。递归深度等于数组长度n因此需要的栈空间是 O(n)。这是递归算法需要特别注意的地方深度过大的递归可能导致栈溢出。4. 二维空间 O(n²)def generate_matrix(n): matrix [] for i in range(n): # 外层循环 n 次 row [] for j in range(n): # 内层循环 n 次创建长度为 n 的行 row.append(i * j) matrix.append(row) # 最终得到一个 n x n 的矩阵 return matrix算法显式地创建了一个n * n的二维列表矩阵。这个数据结构所占用的额外空间与n²成正比因此空间复杂度是 O(n²)。4.2 时间与空间的权衡在算法设计中时间和空间往往像天平的两端此消彼长。这就是经典的“时空权衡”。以空间换时间这是最常用的优化策略。查表法/记忆化比如计算斐波那契数列低效递归是 O(2^n) 时间O(n) 空间递归栈。如果用一个数组dp把计算过的f(i)存起来那么时间可以优化到 O(n)但空间也变成了 O(n)。实际上由于只需要前两个值可以优化到 O(1) 空间这是更优解。缓存将频繁访问或计算代价高的结果存储起来下次直接读取。CPU缓存、数据库缓存、Redis都是这个思想的体现。预处理在数据初始化阶段就构建好一些辅助数据结构如索引、哈希表使得后续的查询操作极快O(1)但付出了额外的存储空间。以时间换空间在存储资源极度紧张如嵌入式设备的场景下使用。流式处理不一次性加载全部数据而是分块读取处理这样只需要常数的内存但可能需要多次I/O时间变长。压缩存储将数据压缩后存储使用时再解压节省了存储空间但增加了编解码的时间。实操心得在当今绝大多数应用场景下“空间换时间”是更主流的选择。因为内存、存储的价格持续下降而用户体验对响应速度的要求却在不断提高。一个让用户等待2秒的算法远比一个多占用10MB内存的算法更不可接受。当然这个原则也有例外比如在处理超大规模数据TB/PB级时内存可能成为瓶颈就需要精心设计数据结构和算法来减少内存占用。5. 实战演练从暴力到优化复杂度分析如何指导编码我们通过一个具体的LeetCode风格问题来看复杂度分析如何一步步引导我们设计出更好的算法。问题给定一个整数数组nums和一个目标值target请你在该数组中找出和为目标值的那两个整数并返回它们的数组下标。你可以假设每种输入只会对应一个答案并且你不能重复利用这个数组中同样的元素。5.1 方案一暴力枚举法这是最直观的想法遍历每个元素x并查找是否存在一个值等于target - x。def two_sum_brute_force(nums, target): n len(nums) for i in range(n): # 外层循环 O(n) for j in range(i 1, n): # 内层循环 O(n-i)平均约 O(n/2) if nums[i] nums[j] target: return [i, j] return []时间复杂度分析外层循环执行n次内层循环平均执行n/2次。总操作次数约为 n * (n/2) n²/2因此时间复杂度为O(n²)。空间复杂度分析只使用了常数个额外变量i,j因此空间复杂度为O(1)。评价思路简单空间效率高但时间效率太低。当数组长度达到10^4或10^5时运行时间将无法接受。5.2 方案二排序 双指针法先对数组排序然后用两个指针分别指向头和尾根据和与target的比较来移动指针。def two_sum_two_pointers(nums, target): sorted_nums sorted(nums) # 排序O(n log n) 时间O(n) 空间创建了新数组 left, right 0, len(sorted_nums) - 1 while left right: # O(n) 时间 current_sum sorted_nums[left] sorted_nums[right] if current_sum target: # 需要在原数组中找到对应的下标这里略去查找逻辑O(n) return [find_index(nums, sorted_nums[left]), find_index(nums, sorted_nums[right])] elif current_sum target: left 1 else: right - 1 return []时间复杂度分析排序是主要开销为 O(n log n)。双指针遍历是 O(n)。查找原下标最坏需要 O(n)。总时间可视为O(n log n)。空间复杂度分析sorted函数通常返回一个新列表需要 O(n) 的额外空间。因此空间复杂度为O(n)。评价时间上比暴力法提升了一个数量级从O(n²)到O(n log n)但需要额外空间且因为排序打乱了索引需要额外步骤找回原索引代码稍复杂。5.3 方案三哈希表法最优解利用哈希表在Python中是字典实现O(1)时间复杂度的查找。def two_sum_hash_map(nums, target): hash_map {} # 值 - 索引 的映射 for i, num in enumerate(nums): # 一次遍历O(n) complement target - num if complement in hash_map: # 哈希表查找平均 O(1) return [hash_map[complement], i] hash_map[num] i # 将当前数字及其索引存入哈希表 return []时间复杂度分析只进行了一次遍历共n次。每次遍历中向哈希表插入和查找的操作在平均情况下时间复杂度都是 O(1)。因此总时间复杂度为O(n)。空间复杂度分析我们使用了一个哈希表来存储元素及其索引。在最坏情况下没有找到答案需要存储所有n个元素哈希表需要 O(n) 的额外空间。因此空间复杂度为O(n)。评价这是该问题的经典最优解。用 O(n) 的额外空间换来了 O(n) 的线性时间相比 O(n²) 是质的飞跃。在实际工程中这种“以空间换时间”的策略非常普遍且高效。对比总结方案时间复杂度空间复杂度优点缺点暴力枚举O(n²)O(1)思路简单不占额外空间时间效率极低无法处理大数据排序双指针O(n log n)O(n)时间效率尚可思路清晰需要额外空间且索引处理麻烦哈希表法O(n)O(n)时间效率最优代码简洁需要额外空间这个案例清晰地展示了复杂度分析如何帮助我们做出理性的选择。从 O(n²) 到 O(n log n) 再到 O(n)每一次优化都是对问题更深层次理解的体现。在面对新问题时先尝试设计一个暴力解法理清逻辑然后分析其复杂度瓶颈最后思考是否有更高效的数据结构如哈希表、堆、二叉树或算法思想如双指针、滑动窗口、动态规划可以突破这个瓶颈。6. 常见误区与深度辨析在实际分析和面试中关于复杂度有几个容易混淆和出错的地方。6.1 误区一把时间复杂度当成精确的运行时间“我的算法是O(n)的所以处理100万数据就一定比O(n log n)的快。” 这是一个常见误解。 大O表示法描述的是渐近增长趋势它隐藏了常数因子和低阶项。也就是说算法A: T_A(n) 10000n 1000000 O(n)算法B: T_B(n) 2n log₂n 100 O(n log n)当 n 比较小比如 n10时算法A可能更慢因为它的常数项太大。只有当 n 足够大时O(n)的增长速度才会最终低于 O(n log n)。所以大O复杂度用于判断算法的“ scalability ”可扩展性而不是直接比较两个算法在特定小规模数据下的绝对快慢。6.2 误区二认为递归的空间复杂度一定高不一定。递归的空间复杂度取决于递归深度和每层栈帧的大小。# 尾递归示例但Python并不优化尾递归 def tail_recursive_sum(n, accumulator0): if n 0: return accumulator return tail_recursive_sum(n-1, accumulator n)这个函数是尾递归形式递归调用是函数体最后一步操作。在支持尾递归优化的语言如Scheme中编译器会将其优化为循环从而将空间复杂度从 O(n) 降为 O(1)。但在Python、Java等大多数语言中尾递归优化不是标准特性所以空间复杂度仍然是 O(n)。6.3 误区三忽略输入数据的特点复杂度分析通常考虑的是最坏情况或平均情况。但实际数据可能具有特殊性质使得算法表现远好于理论分析。快速排序平均时间复杂度是 O(n log n)但最坏情况输入已排序或逆序且枢轴选择不当下会退化为 O(n²)。但如果我们知道数据是随机分布的或者采用随机选择枢轴、三数取中等策略就可以有效避免最坏情况让平均情况成为实际表现。哈希表查找/插入的平均时间复杂度是 O(1)但最坏情况所有键都哈希到同一个桶即哈希冲突极端严重下会退化为 O(n)。因此设计一个好的哈希函数和冲突解决机制至关重要。实操心得理论复杂度是指导实际性能是王道。在完成复杂度分析后对于关键路径的代码一定要结合真实或模拟的数据集进行性能剖析。使用 Profiling 工具如Python的cProfileJava的VisualVM找到真正的热点再进行优化。有时候一个理论复杂度低的算法可能因为常数项过大、缓存不友好、内存访问模式差等原因在实际运行中反而不如一个理论复杂度稍高但更“朴实”的算法。7. 复杂度分析在工程与面试中的应用7.1 在系统设计中的应用复杂度分析不仅是算法题的专利在宏观系统设计中同样重要。数据库索引为什么用B树因为它的查找、插入、删除操作的时间复杂度都是 O(log n)保证了在海量数据下的高效性。如果没有索引查找就是 O(n) 的全表扫描。缓存设计缓存之所以能提升系统性能本质上是将原本需要高复杂度计算或远程获取的操作如O(n)的数据库查询、O(1)但网络延迟高的RPC调用替换为 O(1) 复杂度的内存访问。API设计设计一个查询用户订单列表的接口。如果接口支持复杂的过滤和排序后端处理这些条件的复杂度可能是 O(n log n) 甚至更高。如果数据量巨大就必须考虑分页、异步查询、或使用搜索引擎如Elasticsearch来承载复杂的查询逻辑保证接口响应时间可控。7.2 在技术面试中的应对策略复杂度分析是技术面试的必考环节。回答时要有条理先给出结论“这个算法的时间复杂度是 O(XX)空间复杂度是 O(XX)。”解释推导过程“因为这里有一个双重循环外层执行n次内层平均执行n/2次所以是 O(n²)。” 或者说“我们使用了一个哈希表遍历数组一次每次查找是O(1)所以总时间是O(n)哈希表最多存储n个元素所以空间是O(n)。”分析优劣“这个解法时间上是最优的因为至少需要遍历一次数组O(n)是下界。空间上用了O(n)的哈希表这是一种典型的以空间换时间的策略。”探讨优化可能如果被问到“如果要求空间复杂度为 O(1)那么可以尝试排序后双指针法但时间会变成 O(n log n)并且会修改原数组或需要额外处理索引。”避坑技巧面试中如果被问到“有没有更好的方法”你的思考路径应该是先想暴力法理清问题 - 分析暴力法的复杂度瓶颈通常是过高的时间复杂度 - 思考哪种数据结构或算法思想可以突破这个瓶颈哈希表降查找时间、排序双指针降遍历次数、动态规划消重复计算等。复杂度分析是一种思维习惯更是一种工程素养。它强迫你在动手实现之前先思考方案的可行性和效率边界。刚开始可能会觉得有点枯燥但一旦养成习惯它就会成为你技术工具箱里最趁手、最可靠的武器之一。下次当你面对一段代码或一个设计时不妨先问自己一句“它的复杂度是多少” 这个简单的提问往往就是通向更优解的第一步。

相关新闻

LLM推理性能优化:从KV Cache原理到Prompt Cache实战

LLM推理性能优化:从KV Cache原理到Prompt Cache实战

1. 项目概述:为什么LLM缓存是性能的命门?最近在优化一个线上大语言模型服务时,我又一次被推理延迟和成本问题“教育”了。用户抱怨响应慢,账单上的GPU费用却节节攀升。一通排查下来,问题核心直指一个老生常谈却又常被忽…

2026/8/14 3:50:57 阅读更多 →
标题:深度解析:如何在浏览有关小城镇建设的网站时获取真实有价值的信息

标题:深度解析:如何在浏览有关小城镇建设的网站时获取真实有价值的信息

最近这段时间,我花了不少精力去琢磨一个问题。为什么现在大家聊起“乡村振兴”、“城乡融合”这些宏大的概念时,总觉得隔着层雾?我想,很大程度上是因为我们缺乏一种对细节的敏锐感知,以及对真实基层情况的深入理解。在这个过程中,我发现了一个非常关键的路径,那就是浏览…

2026/8/14 3:50:57 阅读更多 →
多Agent系统路由与定义机制:从概念到TypeScript工程实践

多Agent系统路由与定义机制:从概念到TypeScript工程实践

1. 项目概述:从“单兵作战”到“团队协作”的Agent进化最近在折腾AI应用开发,尤其是Agent(智能体)框架时,发现一个挺普遍的问题:单个Agent能力再强,面对复杂任务也容易捉襟见肘。这就好比一个全…

2026/8/14 3:50:57 阅读更多 →

最新新闻

如何选择福建的压片糖果代工工厂?

如何选择福建的压片糖果代工工厂?

如何选择福建的压片糖果代工工厂?大家好,我是周夫人,深耕压片糖果领域已经五年了。今天想和大家聊聊如何在福建选择一家靠谱的压片糖果代工工厂。毕竟,选择一个好的合作伙伴对品牌的发展至关重要。行业深度观察压片糖果市场近年来…

2026/8/14 5:56:59 阅读更多 →
广东省城乡建设厅网站一站式服务指南与政策解读,助力大湾区绿色建筑高质量发展

广东省城乡建设厅网站一站式服务指南与政策解读,助力大湾区绿色建筑高质量发展

在这个信息飞速迭代的数字化时代,我们普通人生活中最离不开的那张“网”,其实并不是互联网,而是那张笼罩在我们头顶、关乎衣食住行、生老病死的民生服务网。对于生活在广东这片热土上的我们来说,无论是准备装修新房、申请公租房、关注建筑安全,还是想了解最新的绿色补贴政…

2026/8/14 5:56:59 阅读更多 →
Java基础 | (三)关键字:abstract(抽象)

Java基础 | (三)关键字:abstract(抽象)

关键字:abstract(抽象) 参考:java关键字abstract(抽象)详解_abstractjava-CSDN博客 举例 : 车可以跑,但具体几个轮子,怎么跑,不同的车(自行车、汽车)不同配置&#xff0…

2026/8/14 5:56:59 阅读更多 →
YOLOv8模型训练和推理

YOLOv8模型训练和推理

环境搭建模型训练推理参考我的另一篇文章(https://blog.csdn.net/qq_47540436/article/details/137524454) 一. 下载源码 https://github.com/ultralytics/ultralytics Pycharm打开下载的源码,进入虚拟环境安装模型训练所需的包 pip install ultralytics 二、预训练…

2026/8/14 5:56:59 阅读更多 →
如何用 OpCore-Simplify 在 30 分钟内生成可用的 OpenCore EFI

如何用 OpCore-Simplify 在 30 分钟内生成可用的 OpenCore EFI

如何用 OpCore-Simplify 在 30 分钟内生成可用的 OpenCore EFI 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在 Hackintosh 领域,OpenCo…

2026/8/14 5:56:59 阅读更多 →
矩阵神经网络(MNN)实战评估:替代CNN的潜力与验证指南

矩阵神经网络(MNN)实战评估:替代CNN的潜力与验证指南

这次我们来看一个来自越南Sunflower Soft公司的技术项目,核心是Loc Nguyen博士提出的矩阵神经网络(Matrix Neural Network, MNN)。这个项目探讨了一个在深度学习和计算机视觉领域颇具挑战性的问题:矩阵神经网络能否成为传统卷积神…

2026/8/14 5:55:59 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →