算法学习笔记-暴力搜索和分治法
1.今天学习了一个简单的求最大连续子数组的问题,给定一个数组A[0,…,n-1],求A的连续子数 组,使得该子数组的和最大。例如:数组: 1, -2, 3, 10, -4, 7, 2, -5
Python暴力求解法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | dest_arry = [1,-2,3,10,-4,7,-2,5,12] max_val = dest_arry[0] cuur_val = 0 start = 0 end = 0 print (len(dest_arry)) count = len(dest_arry) #暴力法 for i in range(0, count): for j in range(i, count): cuur_val = 0 for k in range(i, j+1): #这个需要特别注意,在这里这句话的意思相当于是 for ( k=i,k<(j+1),k++),在python中没有 '<=' 这个符号 cuur_val = cuur_val + dest_arry[k] if (cuur_val > max_val): max_val = cuur_val start = i end = k print (max_val, start,end) |
Python分治法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #分治法 dest_arry = [1,-2,3,10,-4,7,-2,5,12] max_val = dest_arry[0] cuur_val = 0 start = 0 end = 0 print (len(dest_arry)) count = len(dest_arry) def max_sub_add(fr, to): global start global end if fr == to: return dest_arry[fr] mid = int ((fr + to)/2) m1 = max_sub_add(fr, mid) m2 = max_sub_add(mid+1, to) left = dest_arry[mid] now = dest_arry[mid] i = mid - 1 while (i>=fr): now = now + dest_arry[i] if (now > left): left = now start = i i = i - 1 right = dest_arry[mid+1] now = dest_arry[mid+1] i = mid+2 while (i <= to): now = now + dest_arry[i] if (now> right): right = now end = i i = i + 1 # for i in range(mid+2, to+1): # now = now + dest_arry[i] # if (now> right): # right = now # end = i m3 = right + left return max(m1, m2, m3) start = 0 end = 0 result = max_sub_add(0, (count)-1) print(result, start, end) |
C/C++暴力法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include "stdio.h" #include "stdlib.h" void baoli() { int dest_arry[] = {1,-2,3,10,-4,7,-2,5,-12}; int max_val = dest_arry[0] , cuur_val = 0, start_nbr = 0, end_nbr = 0; int count = sizeof (dest_arry) / sizeof ( int ); int i = 0, j = 0, k = 0; printf( "count: %d \n" , count); for ( i = 0; i < count; i++) { for (j=i;j<count; j++) { cuur_val = 0; for (k=i; k<=j; k++) { cuur_val = cuur_val + dest_arry[k]; if (cuur_val > max_val) { max_val = cuur_val; start_nbr = i; end_nbr = k; } } } } printf( "start: %d end_nbr: %d max_val: %d\n" , start_nbr, end_nbr, max_val); } int main() { baoli(); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
2017-07-04 如何用几行代码读取目录下所有的图片