惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
U
Unit 42
W
WeLiveSecurity
博客园 - Franky
Recent Announcements
Recent Announcements
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
月光博客
月光博客
The Cloudflare Blog
Spread Privacy
Spread Privacy
腾讯CDC
P
Privacy International News Feed
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
NISL@THU
NISL@THU
T
Troy Hunt's Blog
小众软件
小众软件
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Microsoft Security Blog
Microsoft Security Blog
L
Lohrmann on Cybersecurity
Webroot Blog
Webroot Blog
Y
Y Combinator Blog
量子位
P
Palo Alto Networks Blog
N
News and Events Feed by Topic
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
IT之家
IT之家
T
Threat Research - Cisco Blogs
Cloudbric
Cloudbric
云风的 BLOG
云风的 BLOG
C
Check Point Blog
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
G
Google Developers Blog
S
Secure Thoughts

博客园 - andy.wu

聊聊除了生产率之外的东西,比如赚钱效率 一些需要解决的问题(Win32) svn howto: svn合并时报错:retrieval of mergeinfo unsupported by 。 Windows Mobile应用开发(1):使用Win32 SDK 开发屏幕手电程序 vs(2005 and 2008)中使用vc++创建智能设备项目失败的正确解决方案 思考:google的opensocial的实现原理 思考:日期类型的数据应该用什么样的具体形式存储到数据库? google got crazy!!! EnableViewState详细分析 - andy.wu - 博客园 NHibernate Tips: 要注意模型与数据库在Null方面的匹配 AjaxPro基础知识 and FAQ 在iis 6中使用共享目录作为虚拟目录 初学wpf感想 Sql Server 2005全文检索中碰到的问题和分析 asp.net faq: 在html文件中,用js获取session? 给博客园首页管理的建议 china-pub,当当,卓越购书经验谈 使用Emacs代替Windows下的Command shell 经验:使用.net 2.0中的TransactionScope碰到的问题
一次思维锻炼,使用拼音模糊匹配中文 - andy.wu - 博客园
andy.wu · 2009-05-31 · via 博客园 - andy.wu

Outlook的联系人查找,不支持用拼音的模糊查找,于是自己想实现一个。需求如下:

要求

允许模糊音,比如(zh,z),(ing, in)

允许每个字的模糊匹配,字之间不能用空格

比如:

字符串"Nokia客户服务中心",先拆开成拼音为:Nokia Ke Hu Fu Wu Zhong Xing ,拼音的总长为22

每个字再拆开后,表示为下表(第一行是标题),注意空也算一个字的组合之一

标题

Nokia

1

n

k

h

f

w

z

x

2

no

ke

hu

fu

wu

zo

xi

3

nok

    

zon

xin

4

noki

    

zong

xing

5

nokia

    

zh

 

6

     

zho

 

7

     

zhon

 

8

     

zhong

 

合计

6

3

3

3

3

9

5

目标:使用所有字的任意组合,都能匹配到字符串Nokia客户服务中心。也就是说有 6 * 3 * 3 * 3 * 3 * 9 * 5 = 21870种组合可以匹配,每一种组合会有相应的权重,计算公式为:

权重(组合串) = 组合串的长度 / 拼音的总长度

可能表达的不是很清楚,以下随意举例可能的匹配(以*间隔是为了说明,实际输入时不应该有*)

组合串

组合串的长度

组合串的权重

n*ke*h*f*wu*zho*xi

12

12 / 22

nok*k*hu*f*w*z*x

10

10 / 22

n*k*h*f*w*z*x

7

7 / 22

本以为不难,但真的做起来发现算法的效率是个大问题,一开始没有仔细想,就是简单的把所有组合作了散列,一运行发现在散列时相当慢,仔细一看才发现有些联系人的组合数量是相当惊人,比如举的例子,达到了21870种。

说来惭愧,对数据结构和算法实在是不济,一时间就想不出复杂度在O(1)或O(log n)的算法。在此抛砖引玉,希望和大家讨论。

========这是无敌的分割线=============

以下是做这个事情过程中的一些工具代码,很简单,与大家分享

  1. 汉字转拼音

程序很简单,就是使用码表,因为只是作为工具,我没有做任何优化。

下载ChineseSpell.cs