0

将名称“Lukasieicz”转换为 soundex(字母、数字、数字、数字、数字)时,我想出了 L2222。

但是,我的演讲幻灯片告诉我,实际答案应该是 L2220。

请解释为什么我的答案不正确,或者讲座的答案是否只是一个错字之类的。

我的步骤:

Lukasieicz

remove and keep L

ukasieicz

Remove contiguous duplicate characters

ukasieicz

remove A,E,H,I,O,U,W,Y

KSCZ

convert up to first four remaining letters to soundex (as described in lecture directions)

2222

append beginning letter

L2222
4

1 回答 1

2

如果这是国家档案馆定义的American Soundex,那么你们都错了。American Soundex 包含一个字母和三个数字,你不能有nor 。是。L2222L2220L222

但是,假设他们出于某种原因添加了另一个数字。

基本替换给出L2222. 但是你应该用相同的数字折叠相邻的字母(下面的第 3 步),然后在必要时用零填充(第 4 步)。

  1. 如果原始名称中有两个或多个相同数字的字母相邻(步骤1之前),则只保留第一个字母;由“h”或“w”分隔的具有相同数字的两个字母也被编码为一个数字,而由元音分隔的这些字母被编码两次。此规则也适用于第一个字母。

  2. 如果您的单词中的字母太少而无法分配 [四个] 数字,请追加零,直到有 [四个] 数字。如果您有超过 [4] 个字母,只需保留前 [4] 个数字。

Lukasieicz    # the original word
L_2_2___22    # replace with numbers, leave the gaps in
L_2_2___2     # apply step 3 and squeeze adjacent numbers
L2220         # apply step 4 and pad to four numbers

我们可以检查传统(即三个数字)soundex 实现如何随着较短的Lukaczwhich 变为L_2_22. 按照规则 3 和 4,它应该是L220.

国家档案馆推荐了一个在线 Soundex 计算器,它可以生成L220. PostgreSQLText::Soundex在其原始风格和 NARA 实现中也是如此。

$ perl -wle 'use Text::Soundex; print soundex("Lukacz"); print soundex_nara("Lukacz")'
L220
L220

可以预见的是,MySQL正在做自己的事情并返回L200

这个函数实现了原始的 Soundex 算法,而不是更流行的增强版本(也由 D. Knuth 描述)。不同之处在于原始版本先丢弃元音,然后重复,而增强版先丢弃重复,然后再丢弃元音。


总之,您忘记了挤压步骤。

于 2015-10-16T20:08:37.203 回答