hash算法的应用
一、单词模式匹配
描述:单词模式字符串为“一二二一”,目标字符串为"苹果 香蕉 香蕉 苹果"则匹配成功
a=[1,2,2,1,1,3]
b=['x','y','y','x','x','z']
def word_pattern(a,b):
#如果a,b长度不一致则直接返回False
if len(a)!=len(b):
return False
#用来存储映射关系
#例如{1:'x',2:'y',3:'z'}
hash={}
#用来存储是否被使用
#如果a=[1,1,2],b=['x','y','z']
#那么1:'y'就重复使用了,就返回False
used={}
for i in range(len(a)):
if a[i] in hash:
#不是第一次出现,检查映射关系是否匹配
if hash[a[i]]!=b[i]:
return False
else:
#检查这个单词是否使用过,使用过则返回False
if b[i] in used:
return False
hash[a[i]]=b[i]
used[b[i]]=True
return True
print(word_pattern(a,b))
二、猜词游戏
比如秘密数字“2018”,猜测数字"8021",我们可以看到0位置猜对了,我们记为A,其余数字虽然猜对了但是位置不对,我们每个记为B,输出则有1A3B;
在比如秘密数字“1123”,猜测数字“9111”,我们发现猜测数字第二个数字与秘密数字相匹配,于是我们有1A,匹配的数字就不会再被使用,由于还有1,所以我们有1B,最终我们返回1A1B;(注意,我们保证的是秘密数字和猜测数字的位数是一致的)
解法:对于A的个数,我们直接判断有多少位是相等的即可,对于B的判断,我们只需要每次取得匹配的最小的数目即可;
a=""
b=""
def gethint(a,b):
A=0
B=0
a_dict={}
b_dict={}
for i in range(len(a)):
if b[i] == a[i]:
A+=1
else:
if b[i] in b_dict:
b_dict[b[i]]=b_dict[b[i]]+1
else:
b_dict[b[i]]=1
if a[i] in a_dict:
a_dict[a[i]] = a_dict[a[i]] + 1
else:
a_dict[a[i]]=1
for digit in b_dict:
if digit in a_dict:
B+=min(a_dict[digit],b_dict[digit])
return str(A)+"A"+str(B)+"B"
print(gethint(a,b))
输出:1A1B
三、神奇的词根
问题描述:给定一个由许多词根组成的字典和一个句子,你需要将句子的所有继承词用词根替换掉,如果继承词中有许多它的词根,则用最短的词根来替换掉它;
方法一:直接暴力法
a=["catt","cat","bat","rat",]
b="the cattle was rattled by the battery"
def replacewords(a,b):
b=b.split(" ")
for i in a:
for j in range(len(b)):
if b[j][:len(i)]==i:
b[j]=i
return " ".join(b)
print(replacewords(a,b))
方法二:利用hash
a=["catt","cat","bat","rat",]
b="the cattle was rattled by the battery"
def replacewords(a,b):
import collections
b=b.split(" ")
a_dict=collections.defaultdict(set)
b_dict=collections.defaultdict(int)
for w in a:
a_dict[w[0]].add(w)
b_dict[w[0]]=max(b_dict[w[0]],len(w))
print(a_dict,b_dict)
for i,w in enumerate(b):
for j in range(b_dict[w[0]]):
if w[:j+1] in a_dict[w[0]]:
b[i]=w[:j+1]
break
return " ".join(b)
a_dict:defaultdict(<class 'set'>, {'c': {'cat', 'catt'}, 'b': {'bat'}, 'r': {'rat'}})
b_dict:defaultdict(<class 'int'>, {'c': 4, 'b': 3, 'r': 3})
输出:the cat was rat by the bat
hash算法的应用的更多相关文章
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 一致性hash算法详解
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...
- 一致性hash算法简介
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...
- 分布式缓存技术memcached学习(四)—— 一致性hash算法原理
分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...
- 一致性 hash 算法( consistent hashing )a
一致性 hash 算法( consistent hashing ) 张亮 consistent hashing 算法早在 1997 年就在论文 Consistent hashing and rando ...
- 暴雪HASH算法(转)
暴雪公司有个经典的字符串的hash公式 先提一个简单的问题,假如有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做? 有一个方法最简单,老老实实 ...
- hash算法总结收集
hash算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,(每一个真实值只能有一个键值,但是一个键值可以对应多个真实值),这样可以快速在数组等条件中里面存取数据. ...
- MurmurHash算法:高运算性能,低碰撞率的hash算法
MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx.libmemcached等开源系统.2011年A ...
- 一致性hash算法简介与代码实现
一.简介: 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance) 2.单调性(Monotonicity) 3.分散性(Spread) 4.负 ...
- hashmap的hash算法( 转)
HashMap 中hash table 定位算法: int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); 其中i ...
随机推荐
- json入门初体验
json是JavaScript对象表示法,也是轻量级的文本数据交互格式,独立于语言,能够自我描述 json文本格式在语法上与创建JavaScript对象代码相同,多以json不需要解析器,js程序能够 ...
- Spring BeanDefinition的加载
前面提到AbstractRefreshableApplicationContext在刷新BeanFactory时,会调用loadBeanDefinitions方法以加载系统中Bean的定义,下面将讲 ...
- JS 取整、取余
一.取整 1. 取整 // 丢弃小数部分,保留整数部分 parseInt(7/2) // 3 2. 向上取整 // 向上取整,有小数就整数部分加1 Math.ceil(7/2) // 4 3. 向下取 ...
- Angular 路由守卫
1. 路由 Angular路由: 可以控制页面跳转:可以在多视图间切换: 2. 路由守卫 Angular路由守卫: 在进入或离开某路由时,用于判断是否可以离开.进入某路由::: return true ...
- bugku—Web_Writeup
Bugku_Web_Writeup Writeup略显粗糙~~ 部分Web题没有得到最后的flag~只是有了一个简单的思路~~ Web1: 如上,打开题目答题网址后就会弹出一张图片,看图片就可以发现是 ...
- Vue躬行记(1)——数据绑定
Vue.js的核心是通过基于HTML的模板语法声明式地将数据绑定到DOM结构中,即通过模板将数据显示在页面上,如下所示. <div id="container">{{c ...
- 【Java】登录验证码
Html: <input id="verifyCode" name="verifyCode" type="text" value=&q ...
- 项目二:企业级java电商网站开发(服务端)
声明:项目源于网络,支持正版教程,学习使用,仅记录在此 项目介绍 企业级java电商网站开发(服务端),模块划分:用户管理,商品管理,商品品类管理,订单管理,订单详情管理,购物车管理,收货地址管理,支 ...
- 继续学习freertos消息队列
写在前面:杰杰这个月很忙~所以并没有时间更新,现在健身房闭馆装修,晚上有空就更新一下!其实在公众号没更新的这段日子,每天都有兄弟在来关注我的公众号,这让我受宠若惊,在这里谢谢大家的支持啦!!谢谢^ 在 ...
- redis相关缓存知识
Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...