将字符串映射到保持字典顺序的数字

时间:2009-12-16 14:28:43

标签: algorithm string sorting function mapping

我正在寻找能够将字符串映射到数字的算法或函数,使得结果值对应于字符串的字典顺序。例如:

"book" -> 50000
"car"  -> 60000
"card" -> 65000
"a longer string" -> 15000
"another long string" -> 15500
"awesome" -> 16000

作为一个函数,它应该类似于:f(x)= y,因此对于任何x1< x2 => f(x1)< f(x2),其中x是任意字符串,y是数字。

如果x的输入集是有限的,那么我总是可以进行排序并分配正确的值,但我正在为x的无限输入集寻找通用的东西。

6 个答案:

答案 0 :(得分:18)

如果您要求f映射到整数,则这是不可能的。

假设有这样的地图f。考虑字符串aaaaaa等。考虑值f(a)f(aa)f(aaa)等。我们要求f(a) < f(aa) < f(aaa) < ...我们发现f(a_n)趋于无穷大,因为n趋于无穷大;在这里,我使用了a_n字符a重复n次的明显表示法。现在考虑字符串b。对于所有f(a_n) < f(b),我们需要n。但f(b)是一个有限整数,我们只是表明f(a_n)变为无穷大。我们有矛盾。没有这样的地图是可能的。

也许你可以告诉我们你需要什么?这是相当抽象的,我们可能会建议更合适的东西。此外,不一定担心一般解决“它”。 YAGNI和所有这些。

答案 1 :(得分:2)

作为Jason's answer的必然结果,如果您可以将字符串映射到有理数,那么这种映射非常简单。如果code(c)是字符c的ASCII码,而s[i]是字符串i中的s字符,则只需如下所示:

result <- 0
scale  <- 1
for i from 1 to length(s) 
  scale <- scale / 26
  index <- (1 + code(s[i]) - code('a'))
  result <- result + index / scale
end for
return result

这将空字符串映射为0,并将每个其他字符串映射到0到1之间的有理数,保持字典顺序。如果你有任意精度的十进制浮点数,你可以用26的幂除以幂100,并且仍然具有完全可表示的数字;使用任意精度二进制浮点数,您可以除以32的幂。

答案 2 :(得分:2)

你要求的是暂时停止鸽子洞原则(http://en.wikipedia.org/wiki/Pigeonhole_principle)。

琴弦是鸽子,数字是洞。 鸽子数量多于洞数,所以你不能将每只鸽子放在自己的洞里。

答案 3 :(得分:1)

你可以更好地编写一个可以提供给sort函数的比较器。比较器接受两个字符串并返回-1,0或1.即使您可以创建这样的映射,您仍然需要对其进行排序。如果您需要“哈希”和订单,则将内容保存在两个数据结构中 - 一个保留订单,另一个允许快速访问。

答案 4 :(得分:1)

也许您正在寻找Radix Tree

  

基数树,Patricia trie / tree,或   暴击位树是一个专门的集合   基于trie的数据结构   用于存储一组字符串。在   与普通的特里相比,   Patricia trie的边缘被标记   与字符序列相反   比单个字符。这些可以   是字符串,位串   例如整数或IP地址,或   通常是任意序列的   按字典顺序排列的对象。   有时名称基数树和   暴击位树仅适用于   树存储整数和帕特里夏   trie保留为更一般   输入,但结构工作   在所有情况下都是一样的。

LWN.net also has an article describing this data structures use in the Linux kernel

答案 5 :(得分:0)

我在这里发了一个问题https://stackoverflow.com/questions/22798824/what-lexicographic-order-means 作为解决方法,您可以将带有代码零的空符号附加到字符串的右侧,并使用案例II中的扩展。

如果没有额外空符号的扩展,我实际上不知道如何制作这样的映射.... 但是如果你有一组有限的符号(V),那么| V * |与| N |相同 - 来自Disrete Math的事实。