`

编程之美-最短摘要的生成

阅读更多

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class ShortestAbstract {

	/**
	 * 编程之美 最短摘要的生成
	 * 扫描过程始终保持一个[pBegin,pEnd]的range,初始化确保[pBegin,pEnd]的range里包含所有关键字
	 * 然后每次迭代,尝试调整pBegin和pEnd:
	 * 1.pBegin递增,直到range无法包含所有关键字
	 * 2.pEnd递增,直到range重新包含所有关键字
	 * 计算新的range,与旧的range相比,看是否缩短了,如果是,则更新
	 * 不考虑关键字的先后顺序
	 */
	public static void main(String[] args) {
//		String description = "w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1";
		String description = "w0,w1,w2,q1,w3,q0,w4,w5,q1,q0,w6,w7,w8,,q0,w9,q1";
		String[] keywords = {"q1","q0"};
		String summery = shortestAbstract(description, keywords);
		System.out.println(summery);
	}
	
	public static String shortestAbstract(String description, String[] keywords) {
		if (description == null || description.length() == 0
				|| keywords == null || keywords.length == 0) {
			return null;
		}
		String[] desc = description.split(",");
		return extract(desc, keywords);
	}

	public static String extract(String[] desc, String[] keywords) {
		Map<String, Integer> map = new HashMap<String, Integer>();		//key=关键字 value=关键字出现的次数
		for (String keyword : keywords) {
			if (keyword != null && keyword.length() != 0) {		//忽略null和空字符
				map.put(keyword, 0);
			}
		}
		if (map.isEmpty()) {
			return null;
		}
		
		String summery = null;
		int descLen = desc.length;
		int shortestLen = descLen + 1;
		int pBegin = 0;
		int pEnd = 0;
		int abstractBegin = -1;
		int abstractEnd = -1;
		
		while (true) {
			
			//相当于初始化,从desc[0]开始,找到第一个包含所有关键字的摘要:desc[0]~desc[pEnd],此时pBegin=0
			while (!isAllVisited(map) && pEnd < descLen) {
				if (map.containsKey(desc[pEnd])) {
					setVisited(map, desc[pEnd], 1);		//出现次数加1
				}
				pEnd++;
			}
			
			//pBegin右移,停止条件为:已经无法包含所有关键字;
			//然后回到上面,右移pEnd,重新初始化,使得pBegin~pEnd重新包含所有关键字
			while (isAllVisited(map)) {
				if (pEnd - pBegin < shortestLen) {
					shortestLen = pEnd - pBegin;
					abstractBegin = pBegin;
					abstractEnd = pEnd -1;
				}
				if (map.get(desc[pBegin]) != null) {
					setVisited(map, desc[pBegin], -1);		//出现次数减1
				}
				pBegin++;
			}
			
			if (pEnd >= descLen) {
				break;
			}
			
		}
		
		//返回找到的最短摘要,没找到则返回null
		if (abstractBegin == -1 || abstractEnd == -1) {
			System.out.println("one or more keywords not found.");
		} else {
			StringBuilder sb = new StringBuilder();
			for (int i = abstractBegin; i <= abstractEnd; i++) {
				sb.append("," + desc[i]);
			}
			if (sb.length() > 1) {
				summery = sb.substring(1);
			}
		}
		return summery;
	}
	
	//所有关键字出现次数大于0,则找到了一个摘要
	private static boolean isAllVisited(Map<String, Integer> map) {
		for (Entry<String, Integer> entry : map.entrySet()) {
			int count = entry.getValue();
			if (count == 0) {
				return false;
			}
		}
		return true;
	}
	
	private static void setVisited(Map<String, Integer> map, String key, int add) {
		int count = map.get(key);
		map.put(key, count + add);
	}
	
}
0
3
分享到:
评论

相关推荐

    程序员编程艺术--共二十七章-集锦与总结(教你如何编程)

    - **第二十一~二十二章:出现次数超过一半的数字,最短摘要的生成** - 讨论特殊数据处理问题。 - 提供高效算法的设计思路。 - **第二十三、四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践** - 涉及特定...

    程序员编程艺术第一~二十七章集锦与总结(教你如何编程)

    - **第二十一~二十二章:出现次数超过一半的数字,最短摘要的生成** - **知识点**:Boyer-Moore投票算法、文本摘要算法。 - **应用场景**:文本摘要生成、数据压缩等。 - **第二十三、四章:杨氏矩阵查找,倒排...

    程序员编程艺术第一~二十七章集锦与总结(教你如何编程)(by_July)定稿版.pdf

    - **第二十一至二十二章**:出现次数超过一半的数字、最短摘要的生成 - **第二十三、四章**:杨氏矩阵查找、倒排索引关键词Hash不重复编码实践 - **第二十五章**:二分查找实现 - **第二十六章**:基于给定的...

    程序员编程艺术第一 ~二十七章

    - **第二十一~二十二章:出现次数超过一半的数字,最短摘要的生成** - 探讨了数据统计和摘要生成的技术。 - **第二十三、四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践** - 涉及高级数据结构的应用,如...

    十月百度,阿里巴巴,迅雷搜狗最新面试七十题(第201-270题)

    7. 产品描述与摘要生成 - 文本处理:在产品描述中自动提取摘要,要求编写程序能正确识别关键词,并找到包含所有指定关键词的最短有效子串。 8. 数学知识应用 - 随机数生成:从一个范围较小的随机数生成器,如何...

    程序员编程艺术 第一~二十七章集锦与总结

    14. **出现次数超过一半的数字、最短摘要的生成** - **知识点**:摩尔投票算法、哈希表 - **内容概述**:探讨了如何找出数组中出现次数超过一半的数字,并介绍了摩尔投票算法。此外,还讨论了如何生成最短摘要的...

    程序员编程艺术第一~二十七章集锦与总结(教你如何编程)(by_July)定稿版

    解决了如何找出数据集中出现频率最高的元素,并介绍了文本摘要生成技术。 ##### 第二十三、四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践 讨论了特殊矩阵的搜索算法以及高效的文本索引构建方法。 ##### ...

    程序员编程艺术第一~二十七章集锦与总结

    - **第二十一~二十二章:出现次数超过一半的数字,最短摘要的生成** —— 分析了如何高效地解决这类统计问题。 - **第二十三、四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践** —— 探讨了高级数据结构和...

    计算机编程及常用术语英语词汇大全.pdf

    * 图算法(Graph Algorithms):用于解决图问题的算法,如最短路径、最小生成树等。 计算几何 计算几何是研究计算机科学中几何问题的学科。常见的计算几何问题包括凸包、Triangulation、Voronoi 图等。 * 凸包...

    ACM模板-f_zyj

    STL(Standard Template Library)即标准模板库,是C++编程语言中一个强大的工具包,它提供了大量的模板类和函数,用于简化日常的编程任务,提升开发效率。STL主要包括以下几个部分: 1. **容器**:提供了一系列的...

    Algorithm:CS455-算法和结构化编程-图

    介绍: 最短路径是以下问题:在图中找到两个顶点(或节点)之间的路径,以使其组成边的权重之和最小。 MST是连接的加权无向图的边的子集,该边以最小可能的总边权重连接所有顶点。解决方案: 解决问题1(最短路径)...

    软考中级数据库思维导图

    以上内容覆盖了软考中级数据库思维导图中提到的主要知识点,从计算机硬件到软件编程语言的基础,再到数据结构与算法等方面进行了详细介绍。这些知识点对于理解和掌握数据库管理及应用开发具有重要的意义。

    CMP302-Summary

    CMP302:算法设计和分析摘要 该存储库是本课程的摘要,...动态编程最短路径 Floyd-Warshall算法 全对最短路径上的应用 传递闭包 约翰逊算法 最大流量问题 对流图建模不同的图 流网络定义 残留网络 增强路径 流网削减 最

    2021.6-数据结构与算法设计项目---校园导航.7z

    3. 最小生成树算法(如Prim或Kruskal):如果系统需要计算最短的多点路径,可能会用到最小生成树来优化路线。 4. 二分查找:在处理有序数据(如查找特定地点的坐标)时,二分查找能提高查找效率。 5. 哈希表:用于...

    Way-to-Algorithm-算法之路.pdf

    本资源摘要信息涵盖了算法之路的概览,包括排序、搜索、数据结构、动态规划、图论等领域的重要知识点。 排序 * 插入排序(Insert Sort):一种简单的排序算法,通过将每个元素插入到已排序的数组中实现排序。 * ...

    EXCEL辅助进行C_W节约算法计算研究.docx

    #### 摘要与背景 在物流行业中,车辆路径规划问题(Vehicle Routing Problem, VRP)是非常重要的一个优化问题。它旨在找到一条或多条路径,使得所有客户的货物配送需求得到满足的同时,总运输成本(如行驶距离或...

    java生成海报实例源码-code-transformer:论文“Language-agnosticrepresentationlearnin

    java生成海报实例源码代码转换器 这是CodeTransformer模型的官方 PyTorch 实现: D. Zügner、T. Kirschstein、M. Catasta、J. Leskovec 和 S. Günnemann, “从结构和上下文中学习源代码的语言不可知表示” 出现在...

    java大作业题目

    本资源摘要信息将详细解释 JAVA 大作业题目中的六个课题,包括打飞鸟游戏程序、简单画板程序、简单计算器程序、无向图最短主树生成程序、英汉字典程序和简单网络聊天程序。每个课题都有其特定的要求和功能,学生需要...

Global site tag (gtag.js) - Google Analytics