我有一大堆名字(数以百万计)。他们每个人都有一个名字、一个可选的中间名和一个姓氏。我需要将这些名称编码为唯一代表这些名称的数字。编码应该是一对一的,即一个名称只能与一个数字相关联,一个数字只能与一个名称相关联。
对此进行编码的明智方法是什么?我知道根据名字在字母集中的位置(a-> 1、b-> 2.. 等等)来标记名字的每个字母很容易,所以像 Deepa 这样的名字会得到 -> 455161,但同样这里我无法判断“16”是否真的是16或者1和6的组合。
因此,我正在寻找一种对名称进行编码的智能方法。
此外,编码应该使得任何名称的输出数字中的位数应该具有固定的位数,即它应该与长度无关。这可能吗?
谢谢
阿布舍克小号
为了获得相同宽度的数字,难道不能在左边补零吗?
一些选项:
- 对它们进行排序。数一下他们。第 10 个名字是数字 10。
- 将每个字符视为以 26 为基数的数字(不区分大小写,不区分大小写)
数字)或 52(区分大小写,无数字)或 36(不区分大小写)
带数字)或 62(区分大小写,带数字)数字。计算
整数值。 EG,对于名称“abc”,您将有 0 * 26^2 + 1 *
26^1 + 2 * 20^0。有时中文名字可能会使用数字来表示声调。
- 使用“完美哈希”方案:http://en.wikipedia.org/wiki/Perfect_hash_function http://en.wikipedia.org/wiki/Perfect_hash_function
- 这个主要是在 fun 中建议的:使用 goedel 编号:)。所以
“abc”将是 2^0 * 3^1 * 5^2 - 它是素数幂的乘积。
对数字进行因式分解即可得到字符。号码
但可能会变得相当大。
- 如果您尚未使用它,请转换为 ASCII。然后分别对待
以 256 为基数的编号系统中的数字表示字符的序数。
所以“abc”是 0*256^2 + 1*256^1 + 2*256^0。
如果您需要能够不时更新您的姓名和号码列表,#2、#4 和 #5 应该可以。 #1和#3会有问题。 #5 可能是最面向未来的,尽管您可能会发现在某些时候需要 unicode。
我相信你可以将 unicode 作为 #5 的变体,使用 2^32 的幂而不是 2^8 == 256。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)