https://www.hackerrank.com/challenges/the-grid-search/forum

今天碰见这题,看见难度是Moderate,觉得应该能半小时内搞定。

读完题目发现是纯粹的一道子矩阵匹配问题,想想自己以前没做过,肯定能学到新算法,于是就开搞了。

于是上网搜到了Rabin-Karp算法,一种基于hashing的模式匹配算法。尽管连一维的我也没写过,但看了思想以后觉得推广到二维应该也不会很难。

于是有了以下代码,原理就是计算子矩阵的hash key。以hash key的比较代替了子矩阵的比较,这样可以首先排除掉hash key不相等的子矩阵。

对于hash key相等的,再用朴素方法判断子矩阵是否相等。

为什么最后还是要判断子矩阵是否相等呢?因为hash key可能存在碰撞,即使概率不大,为了保证正确性也需要进行检查。

学习Rabin-Karp算法的资料在此:

http://blog.sina.com.cn/s/blog_6a09b5a70100nhnr.html

思路虽简单,代码写起来却各种bug,最终我花了不下两个钟头才搞定。Hackerrank果然是给hacker玩的,我这水平在上面真是举步维艰。

不过,这么搞下来,倒是有了实实在在的收获,如果学习算法能一直保持这种节奏就好了。

下面是AC的代码,时空复杂度均为O(N ^ 2):

 # 2D Rabin-Karp Algorithm
import re MOD = 10 ** 9 + 7 def get2DMatrix(n, m):
a = [[0 for j in xrange(m)] for i in xrange(n)]
return a def calcHash(a, nn, mm):
n = len(a)
m = len(a[0]) b = 1
for i in xrange(mm):
b = b * 10 % MOD
b2 = 1
for i in xrange(nn):
b2 = b2 * b % MOD h = get2DMatrix(n, m)
for i in xrange(n):
val = 0
for j in xrange(m):
val = (val * 10 + a[i][j]) % MOD
if j >= mm:
val = (val + a[i][j - mm] * (MOD - b)) % MOD
h[i][j] = val h2 = get2DMatrix(n, m)
h2[0] = h[0][:]
for i in xrange(1, n):
for j in xrange(m):
h2[i][j] = (h2[i - 1][j] * b + h[i][j]) % MOD
if i >= nn:
h2[i][j] = (h2[i][j] + h[i - nn][j] * (MOD - b2)) % MOD
return h, h2 def equal(a, p, ai, aj):
np = len(p)
mp = len(p[0])
for i in xrange(np):
for j in xrange(mp):
if a[ai + i][aj + j] != p[i][j]:
return False
return True def solve():
na, ma = map(int, re.split('\s+', raw_input().strip()))
a = []
for i in xrange(na):
a.append(map(int, list(raw_input().strip())))
np, mp = map(int, re.split('\s+', raw_input().strip()))
p = []
for i in xrange(np):
p.append(map(int, list(raw_input().strip())))
ha, h2a = calcHash(a, np, mp)
hp, h2p = calcHash(p, np, mp) for i in xrange(np - 1, na):
for j in xrange(mp - 1, ma):
if h2a[i][j] != h2p[np - 1][mp - 1]:
continue
if equal(a, p, i - np + 1, j - mp + 1):
print('YES')
return
print('NO') if __name__ == '__main__':
t = int(raw_input())
for ti in xrange(t):
solve()

Hackerrank - The Grid Search的更多相关文章

  1. Comparing randomized search and grid search for hyperparameter estimation

    Comparing randomized search and grid search for hyperparameter estimation Compare randomized search ...

  2. 3.2. Grid Search: Searching for estimator parameters

    3.2. Grid Search: Searching for estimator parameters Parameters that are not directly learnt within ...

  3. Grid search in the tidyverse

    @drsimonj here to share a tidyverse method of grid search for optimizing a model's hyperparameters. ...

  4. How to Grid Search Hyperparameters for Deep Learning Models in Python With Keras

    Hyperparameter optimization is a big part of deep learning. The reason is that neural networks are n ...

  5. Grid Search学习

    转自:https://www.cnblogs.com/ysugyl/p/8711205.html Grid Search:一种调参手段:穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性 ...

  6. grid search 超参数寻优

    http://scikit-learn.org/stable/modules/grid_search.html 1. 超参数寻优方法 gridsearchCV 和  RandomizedSearchC ...

  7. scikit-learn:3.2. Grid Search: Searching for estimator parameters

    參考:http://scikit-learn.org/stable/modules/grid_search.html GridSearchCV通过(蛮力)搜索參数空间(參数的全部可能组合).寻找最好的 ...

  8. [转载]Grid Search

    [转载]Grid Search 初学机器学习,之前的模型都是手动调参的,效果一般.同学和我说他用了一个叫grid search的方法.可以实现自动调参,顿时感觉非常高级.吃饭的时候想调参的话最差不过也 ...

  9. grid search

    sklearn.metrics.make_scorer(score_func, greater_is_better=True, needs_proba=False, needs_threshold=F ...

随机推荐

  1. Java+maven+selenium3+testng 自动化测试环境IDEA

    idea .java环境变量jdk maven安装及环境变量配置这里就不多说了,网上有很多教程 这里我们只检测一下java.maven环境是否安装成功 win+R,运行cmd命令行:mvn -v   ...

  2. 基础算法之Dijkstra最短路径

    核心思想:以起始原点为中心,想外层扩展,知道扩展到重点为止. 设到A点的最短路径上,A点前驱节点为B,则该路径包含到达节点B的最短路径. S集合代表已经探索过的节点,U集合表示未探索过的节点. 时间复 ...

  3. Android学习笔记_19_广播接收者 BroadcastReceiver及其应用_窃听短信_拦截外拨电话

    一.广播接收者类型: 广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”. 普通广播是完全异步的,可以在同一时刻(逻辑上 ...

  4. requireJs sass侧边栏

    koala 下载 将sass编译为css文件 1 嵌套 2 $变量 3 @mixin 函数名(参数) 4 @include 函数    调用 5 @import "xxx"   引 ...

  5. Git命令篇

    前文: Git有三种状态,你的文件可能处于其中之一:已提交(committed),已修改(modiffied)和已暂存(staged) 三个工作区域概念:Git仓库.工作目录以及暂存区 Git保存信息 ...

  6. vue使用v-for循环,动态修改element-ui的el-switch

    在使用element-ui的el-switch中,因为要用v-for循环,一直没有成功,后来仔细查看文档,发现可以这样写 <el-switch v-for="(item, key) i ...

  7. CocoaPods介绍与使用(转)

    一.介绍 (1) CocoaPods是一个用来帮助我们管理第三方依赖库的工具.它可以解决库与库之间的依赖关系,下载库的源代码,同时通过创建一个Xcode的workspace来将这些第三方库和我们的工程 ...

  8. Angularjs基础(四)

    AngularJS过滤器 过滤器可以使用一个管道符(|)添加到表达式和指令中. AngularJS过滤器可用于转换数据: currency 格式化数字为货币格式 filter 从数组中选着应子集. l ...

  9. Delphi 版FindWindow 和 FindWindowEx 的语法和用法

    FindWindow(lpClassName,        {窗口的类名}lpWindowName: PChar {窗口的标题}): HWND;              {返回窗口的句柄; 失败返 ...

  10. bootstrap模态框传值操作

    1.bootstrap模态框之html代码 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"& ...