数学 - 找出两个字符串之间的排列数
Math - Find The Number Of Permutations Between Two Strings
这不是作业 =)。我正在做一个项目,它将自动生成一个顺序计算机名称列表,如果该列表将是一个疯狂的长列表,我想添加一个警告。
我知道如何从 A-ZZZ 中找到排列数,但我有很多时间尝试应用 inclusion-exclusion 集合。这是场景,为简单起见,字符集将仅为 A - Z,并且不区分大小写,因此 "A" = "a".
用户输入的范围是"ABC"到"AXE"。所以我需要的唯一计数是在这两者之间。所以伪逻辑将获得 A - ZZZ 的完整总数,然后我需要排除 "ABC" 之前的所有内容和 "AXE" 之后的所有内容。
所以问题是,如何找到 "ABC" 之前和 "AXE" 之后的计数。我查看了所有旧的离散和统计数学书籍,但没有真正适合的,或者在插入数字时给我正确的答案(n!/ n1!* n2!...)。我什至尝试做一些事情,比如将二进制或十六进制转换为十进制,但正如你所知,这是一个史诗般的失败 =).
谢谢,
戴夫
最简单的解决方案是将两个字符串都视为 base-26 表示中的数字:
ABC = 26^2 * 0 + 26^1 * 1 + 26^0 * 2 = 28(base 10)
ACC = 26^2 * 0 + 26^1 * 2 + 26^0 * 2 = 54(base 10)
ACC - ABC = 54 - 28 = 26
所以[ABC, ACC]
.
范围内共有27个字符串
基本思路是使用基数为 26 的 positional numeral system(所有字母从 A 到 Z)。
这种方法只有一个问题:
它不能处理空字符,因为它们不遵循 "default" 行为,因为它们只能作为前缀出现。
这个问题的解决方法是从
扩展我们的值映射
A = 0, B = 1, ..., Z = 25
至
empty = -1, A = 0, ..., Z = 25
虽然这打破了数字系统的定义,但我们现在也能够处理更短的字符串:
magnitude([ZZ, AAA]) = AAA - ZZ + 1 = 0 - (-1) + 1 = 2
这不是作业 =)。我正在做一个项目,它将自动生成一个顺序计算机名称列表,如果该列表将是一个疯狂的长列表,我想添加一个警告。
我知道如何从 A-ZZZ 中找到排列数,但我有很多时间尝试应用 inclusion-exclusion 集合。这是场景,为简单起见,字符集将仅为 A - Z,并且不区分大小写,因此 "A" = "a".
用户输入的范围是"ABC"到"AXE"。所以我需要的唯一计数是在这两者之间。所以伪逻辑将获得 A - ZZZ 的完整总数,然后我需要排除 "ABC" 之前的所有内容和 "AXE" 之后的所有内容。
所以问题是,如何找到 "ABC" 之前和 "AXE" 之后的计数。我查看了所有旧的离散和统计数学书籍,但没有真正适合的,或者在插入数字时给我正确的答案(n!/ n1!* n2!...)。我什至尝试做一些事情,比如将二进制或十六进制转换为十进制,但正如你所知,这是一个史诗般的失败 =).
谢谢,
戴夫
最简单的解决方案是将两个字符串都视为 base-26 表示中的数字:
ABC = 26^2 * 0 + 26^1 * 1 + 26^0 * 2 = 28(base 10)
ACC = 26^2 * 0 + 26^1 * 2 + 26^0 * 2 = 54(base 10)
ACC - ABC = 54 - 28 = 26
所以[ABC, ACC]
.
基本思路是使用基数为 26 的 positional numeral system(所有字母从 A 到 Z)。
这种方法只有一个问题:
它不能处理空字符,因为它们不遵循 "default" 行为,因为它们只能作为前缀出现。
这个问题的解决方法是从
扩展我们的值映射A = 0, B = 1, ..., Z = 25
至
empty = -1, A = 0, ..., Z = 25
虽然这打破了数字系统的定义,但我们现在也能够处理更短的字符串:
magnitude([ZZ, AAA]) = AAA - ZZ + 1 = 0 - (-1) + 1 = 2