速度优化——POJ3697

本文解析了一道ACM竞赛中的图论题目,重点介绍了使用哈希表优化广度优先搜索(BFS)算法的过程及技巧。文章分享了从初始的链表存储到哈希表实现的优化路径,包括如何有效避免重复搜索已访问节点,以及通过选择素数等手段提高哈希效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

这道题是ACM合肥赛的最后一题,题目大概题意如下:

给定一个包含N1 ≤ N ≤ 10,000)个顶点的无向完全图,图中的顶点从1N依次标号。从这个图中去掉M0 ≤ M ≤ 1,000,000)条边,求最后与顶点1联通的顶点的数目。(时限4s

基本算法肯定是BFS或者DFSBFS思想为从顶点1开始不断扩展,广度优先搜索所有的与当前扩展点联通的顶点。开始每次都要判断所有的顶点,因此BFSON^2)的复杂度。

每一次扩展都需要判断该边是否在断开的边的集合中。判断需要的时间取决于M条断开边集的存储方式。初始我是用一个链表存储,索引为该边依附的顶点,然后直接搜索,复杂度为ON^2×N=ON^3),超时。然后我又将每个顶点对应边集进行排序,并且二分搜索,这样也很慢,复杂度为ON^2×logN)。另外一种思路是改变断开边集的存储方式,直接用10000×10000bool型数组存储顶点i是否和j联通,这样虽然时间上达到了ON^2)的复杂度,但是把内存爆掉了。

最终Sempr同学提供了他的解决方法:hash。其实我刚开始也想到了hash,但是想不出如何进行hash存储,看来还是hash用的太少。具体的方法是,通过数组模拟链表,由另外一个数组记录当前hash code对应的节点在数组中的位置。这样的hash让复杂度基本降低到了ON^2)。

在进行BFS的时候为了防止对那些已经扩展的节点重复扩展,通过一个数组保存那些尚未扩展到节点,只对这些点进行扩展。

最后是一些提示:

1、  hash 的时候,选择素数进行相关操作会比和数快很多;

2、  Vectormemory pool的方式,使得它的内存占用比实际申请的多的多,因此最好用数组

3、  少用pair,可以用struct pair{int first,second;}来进行模拟。

以下是代码:

  1. struct node 
  2. {
  3.     int first,second;
  4. };
  5. const int mod = 1000117;
  6. const int smod = 10091;
  7. node edges[mod];
  8. int next[mod],hash[mod],endList,q[10010],lst[10010],m,n;
  9. void insertNode(int a,int b)    //  a<b
  10. {
  11.     int code = (a*smod+b)%mod;
  12.     edges[endList].first=a;
  13.     edges[endList].second=b;
  14.     next[endList]=hash[code];
  15.     hash[code]=endList++;
  16. }
  17. bool search(int a,int b)    //  a<b
  18. {
  19.     if(a>b) swap(a,b);
  20.     int code = (a*smod+b)%mod;
  21.     for (int i=hash[code];i>-1;i=next[i])
  22.         if(edges[i].first==a && edges[i].second==b) return true;
  23.     return false;
  24. }
  25. int main()
  26. {
  27.     int cnt=0,a,b,head,tail,lstSize,cur,temp;
  28.     while (scanf("%d%d",&m,&n))
  29.     {
  30.         if(!m && !n) break;
  31.         endList=0; ++cnt;
  32.         memset(hash,-1,sizeof hash);
  33.         while (n--)
  34.         {
  35.             scanf("%d%d",&a,&b);
  36.             if(a<b) insertNode(a,b);
  37.             else insertNode(b,a);
  38.         }
  39.         lstSize=0;
  40.         for (int i=2;i<=m;++i) lst[lstSize++]=i;
  41.         q[0]=1; head=0; tail=1;
  42.         while (head<tail)
  43.         {   
  44.             cur = q[head++];
  45.             temp = 0;
  46.             for (int i=0;i<lstSize;++i)
  47.             {
  48.                 if (!search(cur,lst[i])) q[tail++]=lst[i];
  49.                 else lst[temp++]=lst[i];
  50.             }
  51.             lstSize=temp;
  52.         }
  53.         printf("Case %d: %d/n",cnt,tail-1);
  54.     }
  55.     return 0;
  56. }

 

标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值