Hackerrank - The Grid Search
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的更多相关文章
- Comparing randomized search and grid search for hyperparameter estimation
Comparing randomized search and grid search for hyperparameter estimation Compare randomized search ...
- 3.2. Grid Search: Searching for estimator parameters
3.2. Grid Search: Searching for estimator parameters Parameters that are not directly learnt within ...
- Grid search in the tidyverse
@drsimonj here to share a tidyverse method of grid search for optimizing a model's hyperparameters. ...
- 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 ...
- Grid Search学习
转自:https://www.cnblogs.com/ysugyl/p/8711205.html Grid Search:一种调参手段:穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性 ...
- grid search 超参数寻优
http://scikit-learn.org/stable/modules/grid_search.html 1. 超参数寻优方法 gridsearchCV 和 RandomizedSearchC ...
- scikit-learn:3.2. Grid Search: Searching for estimator parameters
參考:http://scikit-learn.org/stable/modules/grid_search.html GridSearchCV通过(蛮力)搜索參数空间(參数的全部可能组合).寻找最好的 ...
- [转载]Grid Search
[转载]Grid Search 初学机器学习,之前的模型都是手动调参的,效果一般.同学和我说他用了一个叫grid search的方法.可以实现自动调参,顿时感觉非常高级.吃饭的时候想调参的话最差不过也 ...
- grid search
sklearn.metrics.make_scorer(score_func, greater_is_better=True, needs_proba=False, needs_threshold=F ...
随机推荐
- LG3690 【【模板】Link Cut Tree (动态树)】
题目 终于去写\(LCT\)了 这个大爷讲的挺好的 板子 #include<algorithm> #include<iostream> #include<cstring& ...
- CF873F 【Forbidden Indices】
还有这么板子的题? 和你谷上后缀自动机的板子基本一样,区别就是之后这个位置是\(0\)才计入贡献 代码 #include<iostream> #include<cstdio> ...
- 使用ToDateTime方法转换日期显示格式
实现效果: 知识运用: Convert类的ToDateTime方法:(将字符串转化为DateTime对象) public static DateTime ToDateTime(string value ...
- RPC的应用(The lowest layer of RPC)
server端代码: #include <stdio.h>#include <rpc/rpc.h>#include <rpcsvc/rusers.h> void n ...
- Python 学习笔记(七)Python字符串(三)
常用字符串方法 split() 分割字符串,指定分隔符对字符串进行分割 join() 将序列中的元素以指定的字符连接生成一个新的字符串 str.strip() 用于移除字符串头尾指定的字符(默认 ...
- Question20180106 Java环境变量的配置及为什么要配置环境变量
Question 1 Java环境变量的配置及为什么要配置环境变量 Q1.1为什么要配置环境变量 在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PA ...
- WKWebView进度及title
WKWebView进度及title WKWebView进度及title WKWebView 的estimatedProgress和title 都是KVO模式,所以可以添加监控: [webView ad ...
- React中需要多个倒计时的问题
最近有一个需求是做一个闪购列表,列表中每一个商品都有倒计时,如果每一个倒计时都去生成一个setTimeout的话,一个页面就会有很多定时器,感觉这种做法不是非常好,于是换了一个思路. 思路是这样的,一 ...
- Java程序如何生成Jar 执行文件(1)
一.用Eclipse生产Jar文件 注意:此方法只能打包简单程序,不包含含有第三方jar包的项目 首先,看一下我的项目的目录结构: 1,项目名字上面点右键,选择Export,在选择java\JAR f ...
- Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法
在使用了 RTKLIB开源包自带的 rtkplot.exe后,知道了它所具有的功能,就想着如何模仿它做出一个 demo.一开始看的是之前下载的 2.4.2版本的 RTKLIB,里面是使用 Delphi ...