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 ...
随机推荐
- Redis数据库之KEY的操作与事务管理
目的 了解并掌握各种数据类型的命令操作方式,以及各种数据类型值的操作方式.同时,主要培养对KEY的操作命令运用的能力.重点掌握对KEY信息的管理.事务常规管理和事务回滚操作. KEYS命令的练习,对K ...
- Spring 梳理-Spring配置文件 -<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:annotation-driven /> 的区别
<context:annotation-config/> 在基于主机方式配置Spring时,Spring配置文件applicationContext.xml,你可能会见<contex ...
- js校验对象是否全部为空
function judgeIsNotBlank(obj) { var bool = true; var arr = Object.keys(obj); ; for(var key in obj){ ...
- wordpress新注册用户或重置密码链接失效
在网上找了好多个博客,一个比一个不要脸,要更改的是两个文件,最后都抄成一个文件了. 原文链接https://www.cnblogs.com/liudecai/p/6474611.html 我是按照这个 ...
- Spring MVC学习 ( RESTful)
是一套规则,不同的系统之间(Vue java Python C# PHP)具体四种不同类型的HTTP 请求分别表示四种基本操作(CRUD) GET :查询(R) POST:添加(C) PUT:修改( ...
- Nepxion Discovery【探索】微服务企业级解决方案
Nepxion Discovery[探索]微服务企业级解决方案] Nepxion Discovery[探索]使用指南,基于Spring Cloud Greenwich版.Finchley版和Hoxto ...
- @ConfigurationProperties、@Value、@PropertySource
@ConfigurationProperties(spring-boot依赖下).@Value(spring-beans依赖下).@PropertySource(spring-context依赖下) ...
- JAVA之类的动手动脑
1.默认构造方法与自定义的构造方法的冲突 package com.xu; class fool { int value; fool(int nowvalue) { value=nowvalue; } ...
- 【CJOJ】为了博多
Description 做了个噩梦,梦见我的 n 把刀到60级会二次变身,变成一个 对推6图有xi点贡献,刷大阪城有yi点贡献 的刀,于是要把刀分成两队一队刷大阪城另一队推6图 . 但是有m对兄弟刀在 ...
- m*n 矩阵中求正方形个数
<?php /** * Notes: * User: liubing17 * DateTime: 2019-10-17 17:10 */ function get($m, $n){ /* * 获 ...