查看: 2500| 回复: 2
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] LeetCode上Word Ladder II目前最快的C++解法

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
比LeetCode上次快的解法快25%左右... 而且与99.9%的“标准答案”的C++/Java解法思路不太一样,考虑到这道题比较有名,还是分享(得瑟)一下 ,也为大家扩展一下思路。

这个问题本质上是求图上两点之间的所有的最短路径,难度在于图不是预先给好的,所以就有两种做法:
(1) 不预先构造图,而是对所有BFS过程中正在访问的点,“测试”其是不是有边通向其他节点,就是几乎所有答案中都会出现的如下循环:
for (char c = 'a';  c <= 'z'; ++c) {
   ...
}
这一类答案这里就不贴了,搜索Word Ladder II找到的都是的。

(2)预先构造图,然后对构造好的图用BFS。
这种方法BFS的过程非常快,hotspot在于构造图的过程 -- 用O(n^2)的嵌套循环两两比较字符串基本上一定会超时。

然而我们仍然可以用HashMap在O(n)时间内构造出图来,具体的实现参见代码里的initEdges()实现。
不过,只用HashMap的实现,速度实际上是比方法(1)要慢的,这与LeetCode的测试数据的性质有关。

所加了另外两个根据数据性质而调用的“fast path“ -- initEdgesCompCode()/initEdgesCompCodePos(),将长度小于8的字符串解释成无符号整数,这样就一定程度上实现了所谓“Bit-level parallelism”,速度也快了好几倍。

代码在这里:
https://github.com/jqdocshare/docs/blob/master/WordLadderII.cpp






评分

参与人数 1大米 +5 收起 理由
咩酱 + 5 给你点个赞!

查看全部评分


上一篇:5个小时写了一hard 三easy 一med 其中一道还是two sum 这效率好想切腹!
下一篇:请问CS的课程那些序号分别代表什么意思
您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表