词典排列如何在算法上起作用?

时间:2013-07-19 09:12:45

标签: algorithm permutation lexicographic

或者例如,如果给你“abcd”,词典排列将是:

abcd
abdc 
acbd
acdb 
adbc 
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba

我直观地理解它是如何排序的,如果你给了我任何一组字母或数字,我可以解决它们应该如何排序,但不是数学上你将如何从一步到达下一个。 例如: 从abdc到acbd的数学过程是什么?

2 个答案:

答案 0 :(得分:0)

嗯,一个选项可能是:

从一步走到下一步,

  • 设p = n-1
  • 你拿(p)字母abdc => d。
    • 你根据你的订单接下一封信。
      • 如果它存在,那么你写它,然后用剩余的字母命令结束你的单词
      • 其他,p = p - 1然后你回到上一步。

不确定这是最好的方法。为什么要从一步到下一步呢?为什么不写所有的单词,开头写作(n-1)!首字母开头,然后(n -1)!第二次......

a
a
...
a
b
b
...
b

对于这些单词中的每一个:继续(n-2)!第二个字母和(n-2)!第三封信:

ab
ab
...
ab
ac
ac
....
ac
....
ba
ba
...
bc
bc
....

等等

答案 1 :(得分:0)

如果英语是我的母语,我可以向您解释这个问题的各个方面。现在只需给出我的代码(它解释自己)来置换整数:

const int maxn = 2000;
int x[maxn];
void next_permutation(int n)
{
    int i;
    int min_suffix = INT_MAX;
    int min_index = -1;
    for(i=n-1; i>0; --i){
        if(x[i] < x[i+1])break;
    }
    if(i==0){
        for(int i=1; i<=n; ++i){
            x[i] = i;
        }
        return;
    }

    for(int j=i+1; j<=n; ++j){
        if(x[j]>x[i] && x[j]<min_suffix){
            min_suffix = x[j];
            min_index = j;
        }
    }
    //swap x[i], x[min_index];
    {
        int tmp = x[i];
        x[i] = x[min_index];
        x[min_index] = tmp;
    }

    //insert_sort x[i+1...n]
    {
        for(int j=i+2; j<=n; ++j){
            int k;
            for(k=j-1; k>=i+1; --k){
                if(x[j]>x[k])break;
            }

            int tmp = x[j];
            for(int l=j-1; l>k; --l){
                x[l+1] = x[l];
            }
            x[k+1] = tmp;
        }
    }

}