在數(shù)學(xué)中,字典或詞典順序(也稱為詞匯順序,字典順序,字母順序或詞典順序)是基于字母順序排列的單詞按字母順序排列的方法。這種泛化主要在于定義有序完全有序集合(通常稱為字母表)的元素的序列(通常稱為計算機科學(xué)中的單詞)的總順序。

對于數(shù)字1、2、3......n的排列,不同排列的先后關(guān)系是從左到右逐個比較對應(yīng)的數(shù)字的先后來決定的。例如對于5個數(shù)字的排列 12354和12345,排列12345在前,排列12354在后。按照這樣的規(guī)定,5個數(shù)字的所有的排列中最前面的是12345,最后面的是 54321。

別名

詞典順序

應(yīng)用學(xué)科

數(shù)學(xué)

相關(guān)術(shù)語

有序集合

定義

按字母順序排列的方法

正文

數(shù)字也可以作為特別的字符串...這種情況下...如果我們用字典序進(jìn)行比較...就有可能會出現(xiàn)下面這種情況...

"100"<"1000"..(加引號的目的是為了區(qū)別數(shù)字..與數(shù)字串..)

事實上呢。在計算機里...我們會這么看..和之前一樣...我們會首先比較第一個字符...

這里"1"='1'..(已經(jīng)可以看到區(qū)別了..在數(shù)中..數(shù)字因為位置的不同會有不同的意義..而這里。這種分別變的不一樣了...)

..一步比較...還沒有辦法分辨出它們的大小...只好再比較之后的數(shù)...

這種情況回直到最后一次嘗試...第一個字符串已經(jīng)空掉之前...

如果硬要比較的話...

空格的ascii碼值是32.(Ascii碼還是用兩位十六進(jìn)制表示比較合適)

‘0’的ASCII碼值是48 所以‘100’<'1000'

例子:依次比字母, 如

字典序法

對于數(shù)字1、2、3......n的排列,不同排列的先后關(guān)系是從左到右逐個比較對應(yīng)的數(shù)字的先后來決定的。例如對于5個數(shù)字的排列 12354和12345,排列12345在前,排列12354在后。按照這樣的規(guī)定,5個數(shù)字的所有的排列中最前面的是12345,最后面的是 54321。

字典序如下:

設(shè)P是

的一個全排列:

1)從排列的右端開始,找出第一個比右邊數(shù)字小的數(shù)字的序號j(j從左端開始計算),即

2)在

的右邊的數(shù)字中,找出所有比

大的數(shù)中最小的數(shù)字

,即

(右邊的數(shù)從右至左是遞增的,因此k是所有大于

的數(shù)字中序號最大者)

3)對換

4)再將

倒轉(zhuǎn)得到排列

,這就是排列p的下一個排列。

程序源碼??

#include "stdio.h"

#include "string.h"

int* MediumToPermutation(int* piMedium, int iLen)

{

int* pFlag;

int i, j, sum;

int*piPermutation;

;

memset(pFlag,0, sizeof(int) * (iLen + 1));

{

;

while

{

if

if

break;

}

;

;

}

for

{

if

{

break;

}

}

delete[]pFlag;

returnpiPermutation;

}

int* PermutationToMedium(int* piPermutation, int iLen)

{

int i, j, sum;

int* piMedium;

memset

for

{

;

while

{

if

;

;

}

}

returnpiMedium;

}

void NextM(int* piMedium, int iLen, int iM)

{

int i, iAdd;

while

{

{

{

;

;

}

else break;

;

}

{

{

{

}

break;

}

}

iM--;

}

}

int* Solve(int* piPermutation, int iLen, int iNext)

{

int* piResult;

int*piTmp;

int i;

piTmp =PermutationToMedium(piPermutation, iLen);

printf("對應(yīng)的中介數(shù)是:");

printf("其后第

個排列對應(yīng)的中介數(shù)是:",iNext);

;

delete []piTmp;

returnpiResult;

}

void CharToInt(char* pcIn, int* piOut)

{

int i, j, n;

int len =strlen(pcIn);

for

{

}

for(i = 0; i< 128; i++)

{

{

for

{

{

break;

}

}

}

}

}

void IntToChar(char* pcCmp, int* piCmp, int* piIn, char*pcOut)

{

int i, j;

{

{

{

break;

}

}

}

}

int main()

{

//freopen("input.txt", "r", stdin);

//freopen("output.txt","w", stdout);

char in[128];

int next;

printf("<===================作業(yè)二(全排列的生成算法)===================> ");

printf("請輸入排列字符串:");

{

printf("預(yù)推出其后的第幾個排列:");

printf("排列

", in);

int *out;

CharToInt(in, out);

int* out1;

int i;

char* out2;

IntToChar(in, out, out1, out2);

printf("排列

后的第

個排列是:",in, next);

printf("

, out2);

printf(" ");

delete[]out1;

delete[]out2;

delete[]out;

}

return 0;

算法說明?

?設(shè)置了中介數(shù)的字典序 全排列生成算法,與遞歸直接模擬法和循環(huán)直接模擬法的最大不同是,不需要模擬有序全排列的生成過程,也就不需要逐一地生成各個全排列,只要知道初始全排列,就能根據(jù)序號(

),直接得到第m個全排列,因此速度非???。它的缺點是在生成序號(

)的遞增進(jìn)進(jìn)制數(shù)時,需要事先創(chuàng)建一個用來存儲n的階乘數(shù)

的數(shù)組p[],所以n的值不能太大,否則就會溢出,根據(jù)我的測試結(jié)果,當(dāng)

時不會溢出,當(dāng)

時會溢出。

設(shè)置了中介數(shù)的字典序全排列生成算法需要設(shè)置中介數(shù),在實際應(yīng)用中比較繁瑣,不如由前一個排列直接推得下一個排列方便。