【发布时间】:2011-04-03 10:23:27
【问题描述】:
我有一个字母 a-z 的 char[26] 并通过嵌套的 for 语句生成一个序列列表,例如:
aaa, aaz... aba, abb, abz, ... zzy, zzz.
目前,该软件被编写为从 aaa-zzz 生成所有可能值的列表,然后维护一个索引,并遍历它们中的每一个对它们执行操作。
这个列表显然很大,它不是大得离谱,但它已经到了内存占用太大的地步(还有其他区域正在研究,但这是我得到的一个)。
我正在尝试生成一个公式,我可以在其中保留索引,但取消序列列表并根据当前索引计算当前序列(因为序列之间的操作之间的时间很长)。
例如:
char[] characters = {a, b, c... z};
int currentIndex = 29; // abd
public string CurrentSequence(int currentIndex)
{
int ndx1 = getIndex1(currentIndex); // = 0
int ndx2 = getIndex2(currentIndex); // = 1
int ndx3 = getIndex3(currentIndex); // = 3
return string.Format(
"{0}{1}{2}",
characters[ndx1],
characters[ndx2],
characters[ndx3]); // abd
}
我尝试过使用子集 (abc) 制作一个小示例,并尝试使用模除法对其进行索引,但我今天思考困难,我被难住了。
我不是在寻求答案,只是寻求任何帮助。也许是朝着正确的方向踢?
【问题讨论】:
-
char[25] 不足以容纳 a..z。您可能想要检查缓冲区溢出或其他内容。
-
你到底想达到什么目的?
-
您似乎正在尝试计算排列序列的单个特定步骤,而不是索引整个排列结果?
-
我知道答案已被接受,但这是一个很好的问题,有一组聪明的答案。我会把它留给作者,但我建议一个更好的标题,比如:“如何计算第 N 个排列步骤?” “索引到不存在的集合”并没有真正传达问题,IMO。
-
@Paul Sasik:同意。改变了。顺便说一句,我确实使用了@LBushkin 和@Martin Liversage 提供的想法的变体来解决与这个问题非常相关的问题。