用整数表示排列顺序?

时间:2011-01-04 16:29:05

标签: c algorithm

假设有N(N = 10)个字母A,B,...,J。字符串S是排列的一个实例。

我希望通过32位整数p存储排列顺序,并在字符串S和订单p之间进行转换,并验证整数值,我写过这样的话:

int S2P(char *s) {
    unsigned int p = 0;
    char c;
    while (c = *s++) {
        c -= 'A'; 
        p *= 10; 
        p += c; 
    }
    return p; 
}

char *P2S(unsigned int p, char *buf) {
    char *s = buf + 10; 
    char used[20], *t;
    int i, j, c; 
    strcpy(used, "ABCDEFGHIJ"); 
    *s-- = '\0';
    for (i = 1; i < 10; i++) {
        *s-- = c = 'A' + (p % 10); 
        p /= 10; 
        t = strchr(used, c);
        if (t)
            *t = '-'; 
    }
    for (i = 0; i < 10; i++)
        if (used[i] != '-')
            *s = used[i];
    return buf; 
}

int PCheck(int p) {
    char tmp[20];
    int q = S2P(P2S(p, tmp)); 
    return p == q;
}

它的工作效率不高。这意味着,

  1. 不可能再添加一个字母。 (max(N)= 10)
  2. P2S中,使用额外的查找表来查找第10个字母。
  3. PCheck(int)太慢了。
  4. 如何让它变得更好?一段直接的代码是值得赞赏的。

2 个答案:

答案 0 :(得分:2)

  

有没有更好的算法?

查看Knuth's TAOCP第4卷分册2,生成所有元组和排列(我认为它很快会以实体书的形式出现)。他在那里解决了这个问题。

答案 1 :(得分:2)

我认为您对factoradic感兴趣。这使您可以找到n的{​​{1}}词典排列的位置以及同一组的给定排列在所有排列的词典排序中的位置,并且它也是有效的。