博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对
阅读量:4155 次
发布时间:2019-05-25

本文共 611 字,大约阅读时间需要 2 分钟。

一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对,如abc和cba。

当时怎么想的忘记了,现在重新思考一下,文件的大小上限是10G,不可能在内存操作了。考虑设计一种hash使得如果两个字符串维相反串能得出相同的hash值,然后用该hash将文件中的字符串散列到不同的文件中,再在各文件中进行匹配。比如这样的hash函数对字符串上所有字符的ascii求和,因为长度在1K以内,因此范围在int之内。更进一步,可以在上面那个hash后面再加一个字符串长度,可以得到更好的散列效果。(例如,a2b1c5,统计按照每个字母出现的次数进行一步的hash)

在各个单独文件中匹配时,如果采用的是第二种hash函数,那么该文件中的所有字符串都有相同的长度。如果hash效果好,那么这个文件应该小到可以在内存中进行操作了。将文件拷贝为两份,分别按照不同规则hash:第一份按前k位哈希,第二份将字符串的头尾进行颠倒后按前k位哈希(只是对于排序算法颠倒,不必实际颠倒)。这里的按前k位哈希只需要前k位相同能得到相同结果就好,比如第i位的ascii乘以2^i。两份拷贝中hash值相同的就很可能是要求的相反串对了,再进行实际匹配,工作量应该就可以接受了。

第二步,将第一份字符串放入hash_set中,然后将第二份的字符串以颠倒的字符串求hash_set,查看是否在hash_set中,注意字符串中字母完全相同的情况

转载地址:http://gveti.baihongyu.com/

你可能感兴趣的文章
maven jar包冲突解决
查看>>
记一次又一次的被相同问题搞得心力交瘁
查看>>
org.hibernate.exception.GenericJDBCException: could not execute statement
查看>>
当你想放弃技术的时候
查看>>
小确幸
查看>>
支付宝提现至个人账户接口开发
查看>>
脑阔疼
查看>>
springboot学习(一):初识SpringBoot(入门篇)
查看>>
数据库查询优化技术(一):数据库与关系代数
查看>>
数据库查询优化技术(二):子查询优化
查看>>
网站接入第三方登录功能:Java开发QQ登录
查看>>
MyEclipse的debug远程调试
查看>>
java中的日期转换、springmvc接收前台的Date类型参数遇到的坑
查看>>
Ajax使用formData提交带图片上传的表单
查看>>
Linux服务器安装Tomcat、MySQL和一些配置
查看>>
Java开发微信小程序登录接口
查看>>
myeclipse的优化与字体颜色格式的配置
查看>>
使用springmvc的拦截器应用
查看>>
Java通过Poi的开发Excel导入导出和下载功能
查看>>
MathJax的使用
查看>>