最长的组合词 Trie -- 谁能改写此算法?或者有更好的算法?

问题描述

找出txt文件中最长和第二长的组合词,文件有10万条记录,样本如下:以下样本中,最长的组合词是ratcatdogcatwordsforproblem.txt———————catcatscatsdogcatscatxdogcatsratdogdogcatsdoghippopotamusesratratcatdogcat————————————————————有Main.java和Trie.java两个文件,能通过编译并执行。哪位大牛能有更好的算法?或者修改一下此代码,令其有所改变?要注意以下几点:1。效率2。内存溢出Main.java————————importjava.io.BufferedReader;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;importjava.util.ArrayList;publicclassMain{publicstaticfinalStringFILENAME="wordsforproblem.txt";publicstaticvoidmain(String[]args){Trietrie=newTrie();intcount=0;Stringfirst="";Stringsecond="";loadFileToTrie(trie,FILENAME);try{BufferedReaderbr=newBufferedReader(newFileReader(FILENAME));Stringline;while((line=br.readLine())!=null){//Foreachwordinthefile,findallitsprefix.//Foreachprefix,ifthecorrespondingsuffixisvalid(i.e.contained//inthetrieorconstructedfromthewordsintrie),compareitwith//thelongestcompoundandmakecorrespondingoperations.ArrayList<String>prefix=trie.getAllPrefix(line);for(Stringp:prefix){Stringsuffix=line.substring(p.length());if(trie.isValidWord(suffix)){count++;if(line.length()>first.length())first=line;elseif(line.length()>second.length())second=line;}}}br.close();}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}System.out.println("Numberofwordsthatcanbeconstructedusingotherwords:"+count);System.out.println("1stlongest:""+first+""");System.out.println("2ndlongest:""+second+""");}/***loadthewordscontainedinthefiletotheTrie.**@paramtrie*@paramfilename*/publicstaticvoidloadFileToTrie(Trietrie,Stringfilename){intcount=0;try{BufferedReaderbr=newBufferedReader(newFileReader(filename));Stringline;while((line=br.readLine())!=null){trie.insert(line);count++;}br.close();System.out.println("Totalnumberofwordsinthefile:"+count);}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}————————————————————————————Trie.java——————————importjava.util.ArrayList;/***Trie-theknownprefixtreeordictionarytree.**@authorXuan*@version:Jun/3/2014*/publicclassTrie{privateNoderoot;publicTrie(){root=newNode('',false);}/***insertawordtothetrie*/publicvoidinsert(Stringword){intlen=word.length();char[]letters=word.toCharArray();Nodecur=root;for(inti=0;i<len;i++){if(cur.children[letters[i]-'a']==null)cur.children[letters[i]-'a']=newNode(letters[i],i==len-1?true:false);cur=cur.children[letters[i]-'a'];}}/****@paramword*@returntrueifthetriecontainstheinputword*/publicbooleancontains(Stringword){intlen=word.length();char[]letters=word.toCharArray();Nodecur=root;inti;for(i=0;i<len;i++){if(cur.children[letters[i]-'a']==null)returnfalse;elsecur=cur.children[letters[i]-'a'];}if(cur==null||!cur.terminal)returnfalse;returntrue;}/***@paramword*@returnallthevalidprefixofthewordwithinthetrie*/publicArrayList<String>getAllPrefix(Stringword){ArrayList<String>ret=newArrayList<String>();intlen=word.length();char[]letters=word.toCharArray();Nodecur=root;for(inti=0;i<len;i++){if(cur.children[letters[i]-'a']==null)returnret;else{cur=cur.children[letters[i]-'a'];if(cur.terminal&&i<len-1)ret.add(word.substring(0,i+1));}}returnret;}/***isValidWordreturnstrueeitherwhentheinputwordiscontainedinthetrie*orwhenthewordisacompoundofwordsinthetrie.*/publicbooleanisValidWord(Stringword){if(this.contains(word))returntrue;ArrayList<String>prefix=this.getAllPrefix(word);for(Stringp:prefix){if(isValidWord(word.substring(p.length())))returntrue;}returnfalse;}}classNode{charval;Node[]children;booleanterminal;Node(charvalue,booleanisTerminal){this.val=value;this.terminal=isTerminal;children=newNode[26];}}

解决方案

解决方案二:
自己顶,有大神吗?
解决方案三:
先声明一点,并没有看源代码因为你需要的更好的算法,而不是优化代码有以下思路:对数据记录进行拆分,并行处理这些记录疑问:——组合词是否实际存在?——最长组合词是指单词个数最多?
解决方案四:
疑问:——组合词是否实际存在?——最长组合词是指单词个数最多?_______________回答:1。组合词存在。2。字母个数最多。
解决方案五:
就是酱紫的啊
解决方案六:
先声明,并没有看源码。疑问:你的这么多字符之间,有","分割么?在读取过程中不会变成一整个字符串么?
解决方案七:
txt文件,换行的。这样是样板wordsforproblem.txt———————catcatscatsdogcatscatxdogcatsratdogdogcatsdoghippopotamusesratratcatdogcat

时间: 2024-07-31 08:07:56

最长的组合词 Trie -- 谁能改写此算法?或者有更好的算法?的相关文章

通过哪几种方式可以扩展出更多的关键词

中介交易 SEO诊断 淘宝客 云主机 技术大厅 网站确定好核心关键词之后,接下来的工作就是针对主关键词进行扩展,相对一个稍有规模的网站而言,研究几个或者几十个核心关键词是不够的,还需要进行扩展出比核心关键词搜索次数少一些的更多关键词,分布到分类或者相关频道首页.通过一系列的挖掘扩展,得到几百甚至几千个长尾关键词都是很常见的.下面就由小编跟大家一起分享扩展关键词常用的几种方式. 一. 关键词工具 如果仅仅通过手动去扩展的话,精力会过渡浪费不说,扩展出来的词不一定有效.所以在进行扩展关键词时,需要借

深度学习性能提升的诀窍

你是如何提升深度学习模型的效果? 这是我经常被问到的一个问题.有时候也会换一种问法:我该如何提高模型的准确率呢? --或者反过来问:如果我的网络模型效果不好,我该怎么办?通常我的回答是"具体原因我不清楚,但我有一些想法可以试试".然后我会列举一些我认为能够提升性能的方法.为了避免重复罗列这些内容,我打算在本文中把它们都写出来. 这些想法不仅可以用于深度学习,事实上可以用在任何机器学习的算法上.那么如何提升深度学习的性能? 提升算法性能的想法 这个列表并不完整,却是很好的出发点.我的目的

如何准确选择长尾词

目前中国的站长上百万,可以说竞争十分激烈,要在其中占领一席之地,选择对的长尾关键词无疑是一把好的利器,因为长尾关键词精准性高,竞争稍小,积少成多,潜在流量大,而一个网站的主关键词最多也就几个,并且竞争激烈,流量有限,这点大家应该都明白狼多肉少.关于选择长尾关键词,建伟认为需要把握一个前提和一个原则,那就是相关流量稳定.什么是流量稳定呢? 比如我们可以查看一段较长时间里面的流量情况,如果没有流量做上去了也是徒然的.它的相关性就是长尾词的流量要和网站本身的内容或者产品相关联,不要驴唇不对马嘴.另外一

大众点评:长三角地区的消费幸福感相对较高

青年报记者 吴恺 摄"在生活便利度上,上海紧随广州之后,屈居亚军;但得益于各项商业水平的均衡化,上海的消费幸福感排名领跑全国."近日大众点评公布的2014年度31个省会城市"吃喝玩乐指数"显示,长三角地区的消费幸福感相对较高.业内认为,由于这些海量的吃喝玩乐数据基本凝聚在市民1公里生活圈内,因而"较为精确地勾勒出了沪上市民的消费需求和心理".青年报王霞1公里内的"大天地"数据往往能反映真实的生活.当你走出家门,方圆1公里的范围

长尾关键字多长更能吸引用户点击

通过长尾关键词能给站点带来流量,提升网站转换率,这是seo业界公认的事实,那么在具体的实行过程中应当如何定义长尾?长尾到底多长才能更符合用户的心理?才能给站点带来更多的利益?三个词,四个词还是五个词? 最近在网络上看到一组信息图表信息,感触挺深刻的,如图所示:       这组信息图表表述的是关于长尾关键词长度对网站点击率的影响,对比之下很显然,当用户查询时使用更长关键词,得到的结果就越来越精确,4个字和5个字的查询能见度更高. 为了能得到更为精确的数据结论,我做了一项大胆的尝试,使用10个长尾

如何选择易出效果的长尾词

许多有经验的优化者都找到,当今用长尾词来优化更能出结果长尾核心词该怎样选择核心词呢?实际上,笔者在一最先也没有什么偏向,但颠末连续串的,可是研究,也得出一些结论,找到几个好方法,一起分享给各人. 1:去竞争竞争者的网站中找. 可以去看对方的核心词是什么,然后察看对方网站的导出链接,就会很轻易的看出对方用过哪些词,把词统计出来,做一些比拟,获得本身的长尾核心词. 2:给网站摆设统计工具,用数字剖析. 当今险些所有的统计工具有一项功效,就是看清来路,让你清晰的获悉每一个ip从那里来,从哪个词来,这个

B2C网站通过长尾词让流量飞涨

我们把字数较多,由几个词组成的类似于短语的关键词称为长尾词,这种关键词的特点是搜索量不高,而且很不稳定,会随着时间和市场的变化百度指数会有较大的变动.由于这样的特点,做长尾词的优化,会给人一种鸡肋的感觉.关于长尾词,笔者的建议是,如果是新站或者小型的网站,确实是没有太多的必要去做,去挖掘,而如果你的网站发展到一定的程度,特别是B2C的电商网站,长尾词一定要挖掘出来,因为一个成功的B2C网站,会有大量的流量来自于长尾词. 笔者做了一个统计,取我站某一天的数据,百度自然流量为425,其中有287是来

关于长尾词优化分析

企业网站长尾关键词与大型网站长尾关键词作用区别: 众所周知一个大型的网站的主要流量都是来自网站庞大的长尾关键词,如果一个大型的网站主要流量是来自几个主要目标关键词的话,那么这个网站肯定是不合格的.但是企业网站的流量情况呢?基本上企业网站的流量都是来自于目标关键词,这个比例可能达到50-60%左右.所以长尾理论在企业网站中未必适用. 企业网站目标关键词的重要作用: 任何一种网站的目标性关键词是最重要的,因为它是被搜索次数最多的,比较流行的词语,对于企业网站的目标关键词更是如此,客户在寻找.购买.采

怎么比较两个字符串中相同的词?

问题描述 比如说三个字符串1.传土豆网CEO王微为获融资签1年上市对赌协议2.所以土豆们开发了飞速土豆帮你解决问题3.通过土豆网站转交版权报酬现在随便找出两个来,找到他们当中有相同的词,比如说:1,2之间有相同的词土豆,1,3之间有相同的词土豆这个用什么方法来找好一些呢? 解决方案 这个用最长公共子串算法.最长公共子串算法,简称LCS算法.或者用编辑距离算法也可以.简称LD算法