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 的 FileFilter文件过滤,readline读行操作

    package com.cjonline.foundation.evisa; import java.io.BufferedReader; import java.io.File; import ja ...

  2. 我和我的广告前端代码(四):后台系统中,初尝vue、vue-cli

    有一段都在重构之前文章<我和我的广告前端代码(三):一次重来的机会,必要的技术选型>中提到的广告前台展示项目,原有的基于页面的请求,改成了单广告位请求在这个过程中经历了好几次架构变更以及项 ...

  3. windows mysql密码设置与破解

    1.设置密码 mysqladmin -uroot -p password "1234" 查看当前用户: 2.破解密码 关闭 MySQL 服务 执行 mysqld --skip-gr ...

  4. 18年selenium3+python3+unittest自动化测试教程(上)

    第一章 自动化测试课程介绍和课程大纲 1.自动化测试课程介绍 简介:讲解什么是自动化测试和课程大纲讲解,课程需要的基础和学后的水平 python3.7+selenium3 pycharm 第二章自动化 ...

  5. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--A-跳台阶

    链接:https://www.nowcoder.com/acm/contest/90/A 来源:牛客网 1.题目描述 小明在坐景驰科技研发的无人车到达了目的地. 景驰科技(JingChi.ai)是一家 ...

  6. 【例题收藏】◇例题·6◇ 电压机制(voltage)

    ◆例题·6◆ 电压机制 周六日常模拟赛……已经不知道该说什么了(感觉做不出来的都是好题) ▷ 题目 (终于不用自己翻译英文题了╮(╯-╰)╭) [问题描述] 科学家在“无限神机”(Infinity M ...

  7. oracle12c管理作业资源的一种方式

    数据库:12.1.0.2,rac,cdb模式 笔者负责移动两个12.1.0.2的cdb集群,一个在aix上,一个在linux上,不幸的是,它们都是混合型,数据有100多T. 由于其它部门交付的时候,已 ...

  8. 因为之前完全没有接触过Spring,所以准备先把spring实战看完再落实项目

    因为之前完全没有接触过Spring,所以准备先把spring实战看完再落实项目

  9. sql sever 基础 建表

    ---恢复内容开始--- SQL Sever 基础以创建银行数据库bankDB为案例 1.创建数据库 1-1 创建文件夹用以存放数据库 1-2 创建建库bankDB 2.创建数据库 2-1.创建用户信 ...

  10. 2019年第十届蓝桥杯c++A组java/c++组题解

    #include<iostream> #include<vector> using namespace std; vector <int > vec; long l ...