《程序员》第9期智慧擂台题目——高频词汇提取-阿里云开发者社区

开发者社区> geekori> 正文

《程序员》第9期智慧擂台题目——高频词汇提取

简介: 本文为原创,如需转载,请注明作者和出处,谢谢!     面对浩瀚的信息海洋,找到想要的资源有时真的是不容易。在大量文字中搜索高频词汇是信息搜索和数据压缩的共通课题。
+关注继续查看
本文为原创,如需转载,请注明作者和出处,谢谢!

    面对浩瀚的信息海洋,找到想要的资源有时真的是不容易。在大量文字中搜索高频词汇是信息搜索和数据压缩的共通课题。
这次智慧擂台请大家在一个比较庞大的英文文本中找出M个数量最多的短语(由N个单词组成)。统一处理相同的文本文件,该文本只包含英文单词、空格和回行符,比较谁的程序效率最高。

  程序输入:M,N,文本文件路径(M不超过20,N不超过8)
程序输出:高频短语及其数量清单

擂台规则:提交符合以上要求的可执行程序,语言招式不限,点到为止;
我们将在统一的环境下对每位选手的作品进行公平的测试,
比较出综合用时最少的程序。

源程序


import java.io.*;
import java.util.*;

class tt
{
    
public String phrase;
    
public int count;
}

public class searchphrase
{

    
private static LinkedHashMap phrase = new LinkedHashMap();
    
static tt[] max_phrase;

    
private static Vector SeparateString(String s)
    {
        Vector v 
= new Vector();
        String temp 
= "";
        
for (int i = 0; i < s.length(); i++)
        {
            
if (s.charAt(i) != ' ')
            {
                temp 
+= s.charAt(i);
            }
            
else
            {
                
if (temp != "")
                    v.add(temp);
                temp 
= "";
            }
        }
        
if (temp != "")
            v.add(temp);
        
return v;
    }

    
private static void swap(int pos, int count, String phrase)
    {
        
int i;
        
if (max_phrase[pos - 1].count < count)
        {
            
for (i = pos - 1; i > 0; i--)
            {
                
if (max_phrase[i - 1].count > max_phrase[i].count)
                    
break;
            }
            max_phrase[pos].count 
= max_phrase[i].count;
            max_phrase[pos].phrase 
= max_phrase[i].phrase;
            max_phrase[i].count 
= count;
            max_phrase[i].phrase 
= phrase;
        }

    }

    
private static void adjust_max(int count, String phrase)
    {
        
int i, j;
        
if (count <= max_phrase[max_phrase.length - 1].count)
            
return;
        
for (i = max_phrase.length - 1; i >= 0; i--)
        {
            
if (max_phrase[i].phrase.equals(phrase))
            {
                max_phrase[i].count 
= count;
                
if (i > 0)
                {
                    swap(i, count, phrase);
                }
                
return;
            }
        }
        max_phrase[max_phrase.length 
- 1].count = count;
        max_phrase[max_phrase.length 
- 1].phrase = phrase;
        
if (i > 0)
        {
            swap(max_phrase.length 
- 1, count, phrase);
        }
    }

    
private static void js(Vector v, int n)
    {
        String s;
        
for (int i = 0; i < v.size() - n + 1; i++)
        {
            s 
= "";
            
for (int j = i; j < i + n; j++)
            {
                s 
+= v.get(j) + " ";
            }
            
int count = 1;
            
if (phrase.containsKey(s.hashCode()))
            {
                count 
= Integer.parseInt(phrase.get(s.hashCode()).toString());
                count
++;
            }
            phrase.put(s.hashCode(), count);
            adjust_max(count, s);
        }
    }

    
public static void main(String[] args)
    {
        
try
        {
            
long t;
            
int m, n;
            String path;
            m 
= Integer.parseInt(args[0]);
            n 
= Integer.parseInt(args[1]);
            path 
= args[2];
            max_phrase 
= new tt[m];
            
for (int i = 0; i < m; i++)
            {
                max_phrase[i] 
= new tt();
                max_phrase[i].count 
= 0;
                max_phrase[i].phrase 
= "";
            }
            t 
= (new java.util.Date()).getTime();
            java.io.FileReader fr 
= new java.io.FileReader(path);
            java.io.BufferedReader br 
= new BufferedReader(fr);
            String s;

            Vector v 
= null;

            
while ((s = br.readLine()) != null)
            {
                v 
= SeparateString(s);
                js(v, n);
            }
            
for (int i = 0; i < m; i++)
            {
                System.out.println(max_phrase[i].phrase);
                System.out.println(max_phrase[i].count);
                System.out.println();
            }
            t 
= (new java.util.Date()).getTime() - t;
            System.out.print(t);
            System.out.println(
" ms");
        }
        
catch (Exception e)
        {
            System.out.println(e.getMessage());
        }

    }

}

测试结果1:m = 20 n = 8 

under games played won drawn lost goals for
71

tabulated under games played won drawn lost goals
70

games played won drawn lost goals for against
70

May Xinhua Following are the results from the
69

played won drawn lost goals for against and
59

won drawn lost goals for against and points
59

Jan Xinhua Following are the results from the
48

Chinas economic efficiency indicators of the sector of
39

The industrial statistics include all stateowned enterprises and
39

industrial statistics include all stateowned enterprises and the
39

statistics include all stateowned enterprises and the nonstateowned
39

include all stateowned enterprises and the nonstateowned ones
39

all stateowned enterprises and the nonstateowned ones with
39

stateowned enterprises and the nonstateowned ones with annual
39

enterprises and the nonstateowned ones with annual sales
39

and the nonstateowned ones with annual sales income
39

Xinhua Chinas economic efficiency indicators of the sector
39

the nonstateowned ones with annual sales income over
39

nonstateowned ones with annual sales income over million
39

up percent over the same period last year
35

13594 ms


测试结果2  m = 10 n = 5

Xinhua Following are the results
295

May Xinhua Following are the
209

Following are the results from
183

are the results from the
176

April Xinhua Following are the
141

Jan Xinhua Following are the
122

billion yuan billion US dollars
120

won drawn lost goals for
88

played won drawn lost goals
88

Dec Xinhua Following are the
87

12437 ms

 
以上源程序是采用的是最简单的方法,谁有更好,效率更高的方法,请跟贴!!



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
3958 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9307 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
4964 0
阿里云服务器远程登录用户名和密码的查询方法
阿里云服务器远程连接登录用户名和密码在哪查看?阿里云服务器默认密码是什么?云服务器系统不同默认用户名不同
81 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
2003 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
2901 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
16275 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
723 0
+关注
geekori
欧瑞科技创始人&amp;CEO,东北大学计算机专业硕士,拥有超过20年软件开分经验。欧瑞学院金牌讲师、51CTO学院金牌讲师、CSDN学院特约讲师、畅销书作者,企业内训讲师。曾出版过超过30本IT畅销书,涉猎移动开发、跨平台开发、机器学习、区块链、大数据、编译器等领域。
419
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载