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. Android NDK r8 Cygwin CDT 在window下开发环境搭建 安装配置与使用 具体图文解说

    版权声明:本博客全部文章均为原创.欢迎交流.欢迎转载:转载请勿篡改内容,而且注明出处,谢谢! https://blog.csdn.net/waldmer/article/details/3272500 ...

  2. Uva 11922 Splay

    Splay(伸展树)实现可分裂与合并的序列 对于BST,除了Treap树之外,还有一种Splay的伸展树,他能快速的分裂与合并. 重要的操作是伸展操作,将一个指定的结点 x 旋转到根的过程. 分三种情 ...

  3. 将psd格式批量转换成jpg或png格式(C#自制软件)

    此项目基于.net framework 4.0 将psd格式批量转换成jpg或png格式. 链接:https://pan.baidu.com/s/16IEjX0sHaY9H3Ah7mv6IPQ 提取码 ...

  4. 使用TextView/EditText应该注意的地方,监听EditText,addTextChangedListener

    http://blog.csdn.net/huichengongzi/article/details/7818676 监听 EditText 控件: addTextChangedListener(ne ...

  5. 【题解】洛谷P2421[NOI2002]荒岛野人 (Exgcd)

    洛谷P2421:https://www.luogu.org/problemnew/show/P2421 思路 从洞的最大编号开始增大枚举答案 对于每一个枚举的ans要满足Ci+k*Pi≡Cj+k*Pj ...

  6. redis的事务、主从复制、持久化

    redis事务 和其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中, MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.Redis中事务 ...

  7. putty 启动 linux 下的oracle

    没搞过linux ,仅作记录: 1 打开putty.exe 程序 ,选择 连接 2 输入linux 的用户名和密码后,按下图操作: 3  启动监听 4 命令总结: 1.  sudo su - orac ...

  8. AngularJS 使用序号的表格

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. Spring知识点总结(四)之SpringAOP基础

        1. Spring aop中的基本概念        • 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候.在Spring AOP中,一个连接 ...

  10. 如何使用Xcode的Targets来管理开发和生产版本的构建

    如何使用Xcode的Targets来管理开发和生产版本的构建 想象一下,你已经完成了应用程序的开发和测试,现在准备提交正式版本.问题是,一些web服务的url指向了测试服务器,同时API密钥被配置用于 ...