这对我来说很难(我)我希望人们可以帮助我。我有一些文字,我需要将它转移到一个数字,但它必须是唯一的,就像文本是唯一的一样。
例如: 'kitty'这个词可以产生12432,但只有kitty这个词产生了这个数字。文本可以是任何内容,应该给出适当的数字。
结果整数必须是一个32位无符号整数的一个问题,这意味着最大可能的数字是2147483647.我不介意是否有文本长度限制,但我希望它可以尽可能大。
我的尝试。你有字母A-Z和0-9所以一个字符可以有1-36之间的数字。但是如果A = 1且B = 2并且文本是A(1)B(2)并且你添加它你将得到3的结果,问题是文本BA产生相同的结果,所以这个算法不会工作
有什么想法指出我正确的方向还是不可能做到?
答案 0 :(得分:5)
你的想法通常是理智的,只需要开发一点。
让f(c)
成为将字符c
转换为范围[0..M-1]
中的唯一数字的函数。然后你可以像这样计算整个字符串的结果数。
f(s[0]) + f(s[1])*M + f(s[2])*M^2 + ... + f(s[n])*M^n
您可以轻松证明该号码对于特定字符串是唯一的(您可以从该号码中获取字符串)。
显然,你不能在这里使用很长的字符串(对于你的情况最多6个字符),因为36^n
增长很快。
答案 1 :(得分:0)
用映射到唯一数字的单词构建字典并使用它,这是你能做的最好的。
我怀疑使用的字数超过2 ^ 32,但这不是您面临的问题,问题是您需要将数字映射回字。
如果你只是将单词映射到数字,那么一些散列算法可能会起作用,尽管你需要稍微努力以保证你有一个不会产生冲突。
然而,对于数字回到单词,这是一个非常不同的问题,最简单的解决方案就是建立一个字典并映射两种方式。
换句话说:
AARDUANI = 0
AARDVARK = 1
...
如果您想将数字映射到26个字符,那么您只能存储6个字符(如果我计算错误,则只能存储5个或7个字符),但不能存储12个字符,当然不能存储20个字符。
除非你只计算实际的单词,否则他们不遵循任何好的可数规则。唯一的方法是将所有单词放在长列表中,然后从头开始分配数字。
答案 2 :(得分:0)
想象一下,你试图只在一个数字中存储字符集“0-9”中的字符串(相当于获得一串数字)。你会做什么?
Char 9 8 7 6 5 4 3 2 1 0
Str 0 5 2 1 2 5 4 1 2 6
Num = 6 * 10^0 + 2 * 10^1 + 1 * 10^2...
对你的角色应用相同的东西。
Char 5 4 3 2 1 0
Str A B C D E F
L = 36
C(I): transforms character to number: C(0)=0, C(A)=10, C(B)=11, ...
Num = C(F) * L ^ 0 + C(E) * L ^ 1 + ...
答案 3 :(得分:0)
如果用某种语言拼写正确的文字,你可以为每个单词加上一个数字。但是,您需要考虑所有可能的复数,地点和人名等,这通常是不可能的。我们在谈论什么样的文字?在没有事先了解的情况下,通常会有一些现有的单词无法以任何方式编码为32位。
你可以建立一个单词列表吗?只需给出第一个单词,您可以看到数字1,第二个数字2,并检查单词是否已有数字或者是否需要新单词。然后在某处保存新创建的字典。如果你需要100%可靠的,可逆的映射,从数字回到原始单词给出新的未知文本,这可能是唯一可行的解决方案。
使用64位和足够好的散列(如MD5),它极不可能发生冲突,但对于32位,似乎不太可能存在安全散列。
答案 4 :(得分:0)
只需将每个字符视为基数为36的数字,并计算十进制等值数?
所以:
'A' = 0
'B' = 1
[...]
'Z' = 25
'0' = 26
[...]
'9' = 35
'AA' = 36
'AB' = 37
[...]
'CAB' = 46657