`
hbuxzy
  • 浏览: 24534 次
文章分类
社区版块
存档分类
最新评论

关键字查找算法(转存留用)

 
阅读更多

现在有一批中等数量级(十万级)的数据,格式如下:

ID NameInfo
0 北京市人民政府

1 国家安全局

2 上海市人民政府

3 八达岭长城
....... ................


现在要对此文件建立关键字索引。(例如:输入国家,可以快速的找到国家安全局输入人民可以找到北京市人民政府 和 上海市人民政府);
要求建立的索引结构所占用的空间相对最少,但是关键字查找速度要很快。
现在考虑使用 Trie树,但是Trie树太浪费空间了。
不知大家有没有好的算法。尽情讨论!!!

没理解错的话,应该是类似SQL查询中like子句的功能吧。




1、搞个词典库,把每个关键字编号;
40万关键字+编号,按4个汉字组词算,需要(4*2 + 4) * 40W = 4.8M空间。
搜索方式可以使用简单的二分查找(此时可以省去编号占用的空间);但考虑这个库实际使用压力较大,采用hash较好。
记得哪里说过,hash数据量应该是存储区大小的7x%;以后再靠加大存储区去减少碰撞,效果已经不明显了。
采用悲观点的值,用8M空间吧。

如果内存紧张,可以不使用hash,改成按关键词排序后二分查找;这样查询效率稍微低一些,但可以节约4.8M空间(hash本身额外占用的3.2M,加上可以用关键词本身的数组下标当作编号而节约的每词4字节共1.6M的空间)。


2、把NameInfo切分,然后分析切分出的关键词在不在词典库里;在就把它记为关键字。

类似这样:
a、NameInfo 北京市人民政府
b、分词,分解为 北京 市 人民 政府 或 北京市 人民 政府
c、查词典,确认 北京 人民 政府 为关键字,且编号分别为123456 345667 456667
(根据你的举例,每条记录大概有3~4个关键字;以后都按4个关键字算;这些关键词仅用于建索引,不必实际存储)



3、另开一个指针数组,数组下标对应关键字编号(这需要40W × 4 = 1.6M字节),指针指向包含对应关键字的记录ID列表。

记录ID的列表可以采用动态分配或内存池。因为有10W记录,所以ID最少需要3字节;为以后扩充计,以下按四字节计算。
假设每条记录都有4个关键字,那么将需要4倍于记录数的节点空间(即需要4*4*10W=1.6M字节);如果用单链表实现,则还需要额外的4个字节保存next指针,即一共3.2M空间。
(用数组可以比链表减少一半空间消耗,但插入删除比较慢)。

现在,内存中大概是这样:

词典区(8M):
[关键字1 编号1][关键字2 编号2][关键字3 编号3]……

索引区(1.6M+3.2M=4.8M)
关键字编号=数组下标;

指针指向一个链表,链表保存对应的记录ID(或指向此记录的指针)



记录区(10W × 单条记录大小,假设你的系统还允许占用5M内存,则单条记录不能大于50字节;考虑一个ID要4字节,要求NameInfo不能大于23个汉字)
记录区可以是一个简单数组,此时ID可省略。



所有这些一共需要17.8M空间;若词典改成排序数组,则只需13M空间。
注意记录区ID字段按4字节计,但实际在记录区可以直接用数组下标代替ID,可节约10W×4=0.4M空间;此外,关键字编号只需3字节,前面全部是按4字节算的,也可以压缩一下。

总之,根据自己需要裁剪后,上面这个方案可以压缩到仅占用11M字节甚至更少。



以下按最优性能方案计算

插入效率:
需要若干次O(1)的hash查询(看分词算法的好坏了),以把分词结果对应到关键字编码上;然后建索引需要4次数组访问和4次链表插入操作(复杂度都是O(1))。

查询效率:
需要一次O(1)的hash查询,以把用户输入的关键词对应到编码上;然后拿这个编码当下标访问数组,取得查询结果链表;再根据链表记载把所有合适记录打印出来。

总的来说,插入、查询效率都是O(1);很容易扩充出删除操作(好像没这需求吧),且删除效率也是O(1)。


注意这个算法是个完全内存算法,它的响应速度是微秒甚至纳秒级;所以不必担心用二分法查找代替hash后会导致太大的性能损失。


如果将其改成完全磁盘算法(此时当然就不需要担心空间消耗了),即使考虑干扰因素,速度仍然可以保持在十几到几百毫秒的级别上。
——每秒显示25帧,人眼看起来就是连续动画,此时每帧就要滞留1000/25=40毫秒;200毫秒的延迟也不过是5个动画帧而已,一般用户感觉不到任何延迟。

当然,如果有外存的话,考虑40万关键字肯定不会用全、10W记录也不一定每一条都会访问到;那么最好的做法还是搞个cache,做成半内存算法:这样一方面不需要占用太多内存,同时还可以在大部分情况下保持微秒级响应速度。
(当然,如果用外存,还是直接用一些轻量级数据库更方便)

分享到:
评论

相关推荐

    关键字查找算法

    标题中的“关键字查找算法”指的是在数据结构和算法领域中,用于快速定位和检索特定关键字的方法。这种算法在处理大量文本数据时尤为重要,比如搜索引擎、敏感词过滤等场景。描述中提到的“用多叉树实现”,暗示了...

    文本中关键字匹配算法的实现

    关键字匹配涉及到从大量文本中查找并定位特定词汇或短语,广泛应用于搜索引擎、信息检索、文本分类、数据挖掘等多个场景。本话题将深入探讨关键字匹配算法的实现及其重要性。 关键字匹配的基本目标是从文本集合中找...

    VC++ 关键字查找对文件内容归类

    首先,关键字查找涉及到字符串匹配算法,例如朴素的线性搜索、KMP算法、Boyer-Moore算法或Rabin-Karp算法。这些算法各有优缺点,适用于不同的场景。线性搜索简单但效率较低,适合小规模数据;KMP和Boyer-Moore则在...

    关系模式全部候选关键字的算法

    ### 关系模式全部候选关键字的算法 #### 摘要 本文主要介绍了一种用于求解关系模式中全部候选关键字的新算法。该算法基于属性在函数依赖中的位置来进行分类,并探讨了属性成为主属性(候选关键字)所需满足的条件...

    基于Python实现对图像识别和关键字查找.zip

    同时,搜索算法如二分查找或哈希表查找也可能被应用到关键字查找过程中。 7. **异常处理和调试**:良好的编程实践包括错误处理和调试。项目中可能包含了try-except块来捕获和处理可能出现的异常,以及logging模块来...

    基于Java语言的DFA关键字过滤算法设计源码

    该项目为基于Java语言的DFA关键字过滤算法设计源码,共计33个文件,涵盖13个XML配置文件、6个Java类文件、4个JSP页面文件、4个JAR库文件、3个Java源文件、2个Markdown说明文件以及1个IntelliJ IDEA项目配置文件。...

    CompKey算法Java实现中南大学电子商务大作业

    排序和查找算法(如快速排序、二分查找)可能用于优化性能。 2. 文件读写:由于数据量可能较大,Java的IO流(如FileInputStream、BufferedReader)将用于读取和处理数据文件。 3. 多线程:为了提高处理效率,可能...

    关键字查找工具

    【标题】:“关键字查找工具” 在信息技术领域,关键字查找工具是一种高效、实用的软件应用,专为用户在大量文本数据中快速定位特定关键字而设计。它可以帮助用户在各种类型的文件中,例如文档、代码、邮件等,进行...

    XML流上的关键字查询算法

    ### XML流上的关键字查询算法 #### 概述 随着互联网技术的发展,XML(Extensible Markup Language,可扩展标记语言)已成为一种广泛应用于数据存储和交换的标准格式。在各种基于XML的应用场景中,如股票交易信息...

    关键字过滤多模式匹配算法(支持中文)

    本文将详细探讨这些知识点,并结合“关键字过滤多模式匹配算法(支持中文)”这一主题,深入解析相关技术和应用。 首先,关键字过滤是一种技术,用于从大量文本数据中筛选出包含特定关键字或短语的信息。这种技术...

    查找算法ppt哈工大

    查找算法的时间复杂度是问题规模n和待查关键字在查找集合中的位置k的函数T(n, k)。平均查找长度(ASL)是衡量查找性能的重要指标,代表查找算法在查找成功时的平均比较次数,与查找集合中的记录个数概率分布有关。在...

    基于compKey的关键字推荐算法以及前端页面部分

    标题中的“基于compKey的关键字推荐算法”是一个重要的知识点,它涉及到信息检索、推荐系统和数据挖掘领域。在电子商务环境中,这种算法可以帮助平台为用户提供个性化的产品或服务推荐,提高用户体验和销售效率。...

    tfidf 算法 关键字提取算法(中英文)

    TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和文本挖掘领域广泛使用的关键词提取算法。它通过衡量一个词在文档中出现的频率(Term Frequency, TF)以及在整个文档集合中出现的频率...

    论文研究-一种基于TextRank的单文本关键字提取算法.pdf

    作为一种经典的文本关键字提取和摘要自动生成算法,TextRank将文本看做若干单词组成的集合,并通过对单词节点图的节点权值进行迭代计算,挖掘单词之间的潜在语义关系。在TextRank节点图模型的基础上,将马尔可夫状态...

    Hash查找、二分查找c语言关键字个数

    本项目主要涉及两种查找算法:哈希查找(Hash Search)和二分查找(Binary Search),并且应用在统计C语言源文件中的关键字个数。下面将详细阐述这两种查找算法以及它们在本项目中的具体应用。 哈希查找是一种高效...

    几种常用查找算法的比较

    查找算法的比较 在计算机科学中,查找算法是一种基本且常用的算法,它们的应用非常广泛。本文将对几种常用的查找算法进行比较,包括顺序查找、二分查找、二叉树查找和哈希表查找。 顺序查找是一个最简单的查找算法...

    电信设备-一种基于关键字查找信息的方法及系统.zip

    标题中的“电信设备-一种基于关键字查找信息的方法及系统”暗示了这是一份关于电信行业中信息检索技术的文档。在现代通信系统中,快速、准确地查找和处理信息是至关重要的,尤其是对于处理大量数据的电信设备而言。...

    数据结构查找算法.doc

    数据结构查找算法 ...本实验中我们学习了几种典型的查找算法,包括折半查找算法、二叉排序树查找算法、哈希表查找算法和顺序查找算法。这些算法在实际应用中非常重要,可以提高系统的性能和效率。

    综合查找算法(顺序查找、折半查找、二叉排序树、哈希表)-数据结构课程设计

    本文将详细探讨四种常见的查找算法:顺序查找、折半查找、二叉排序树查找以及哈希表查找,并结合提供的"综合查找算法"课程设计项目,解析其在实际应用中的特点和优势。 **顺序查找**是最基础的查找算法,适用于任何...

Global site tag (gtag.js) - Google Analytics