将字符串映射到唯一的0..1浮点值,同时保持顺序

时间:2013-03-06 13:11:10

标签: algorithm mapping redis

我想使用Redis对字符串值进行排序(使用有序集合),但我只能使用浮点数来实现此目的。我正在寻找一种算法,将字符串转换为float 0..1值,同时保持顺序。

我的意思是s1< s2(按字母顺序)应该表示f(s1)< F(S2)。

有这样的算法吗?

P.S。我将使用这样的算法对用户名进行排序,并且在大多数情况下,具有匹配分数的玩家将具有完全不同的用户名。因此,在大多数情况下,任何一种方法都应该有效,但仍然存在冲突的余地。另一方面,字符串将被正确排序,如果几乎相同的用户名被错误排序,则可以接受。

2 个答案:

答案 0 :(得分:3)

每个字符都可以映射到其ASCII个数字。如果你将每个字符串转换为它的浮点等价物连接所有的ASCII数字(最后在它们前面的零,以便所有字符将映射到三个数字),你将继续订购。 但是如果你的字符串很长,你的浮点数会很大,你的映射可能不是唯一的(如果有几个字符串以相同的字符开头,由于浮点内部的四舍五入)。

例如:

'hello' -> 104101108108111

如果你知道你的字符串包含哪些字符子集(例如,只有小写字母,或只有大写字母和数字),你可以创建自己的映射,以便每个字符使用更少的数字。

答案 1 :(得分:1)

在数学上,这样的算法存在并且是微不足道的:简单地在字符串之前放置一个小数点(“。”)并将其解释为基数为256的数字(假设您的字符串使用8位字符)。类似地,如果您的字符串只有字符“0”到“9”,您可以将其读作十进制数字,例如字母“58229”的.58229。你正在做同样的事情,只用基数256而不是基数10。

实际上,如果没有严格限制的潜在字符串或特殊浮点软件,这是不可能的。由于典型的浮点对象具有有限的大小,因此它具有有限数量的可能值。例如,具有64位的浮点对象具有至多2 64 值,甚至忽略那些代表诸如NaN的特殊概念的那些。相反,任意长度的字符串具有无限多的潜在值。即使你在当今的计算机存储器中将字符串限制在合理的范围内,它的潜在值也远远超过普通的浮点对象。

要解决此问题,您必须减少潜在字符串的数量(通过限制其长度或以其他方式限制允许的字符串)或增加潜在浮点值的数量(可能通过使用特殊的任意精度浮点数)软件)。