我有n个元素.为了举个例子,让我们说,7个元素,1234567.我知道有7个!=这些7个元素可能有5040个排列.
我想要一个包含两个函数的快速算法:
f(number)将0到5039之间的数字映射到唯一的排列,并且
f'(置换)将置换映射回其生成的数字.
我不关心数字和排列之间的对应关系,只要每个排列都有自己唯一的数字.
所以,举个例子,我可能会在哪里有功能
f(0) = '1234567'
f'('1234567') = 0
Run Code Online (Sandbox Code Playgroud)
想到的最快的算法是枚举所有排列并在两个方向上创建查找表,这样,一旦创建表,f(0)将是O(1)并且f('1234567')将是查找字符串.然而,这是内存饥饿,特别是当n变大时.
任何人都可以提出另一种算法,它可以快速工作,没有内存缺点吗?
我在这里阅读了一个关于使用ImmutableSet
Guava 的好例子.为了完整起见,此处报告了此示例:
public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
"red",
"orange",
"yellow",
"green",
"blue",
"purple");
class Foo {
Set<Bar> bars;
Foo(Set<Bar> bars) {
this.bars = ImmutableSet.copyOf(bars); // defensive copy!
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我可以通过使用Java枚举获得相同的结果吗?
PS:这个问题在我的脑海中更加混乱!