如何用整数存储排列的顺序

谢继雷 2011-01-05 12:34:00
假设有 N=10 个字母 A, B, ..., J,字符串 S 是 10个字母的一个排列,
我想用一个 32 位整型 p 来存储这个排列,

为了在字符串 S 和 p 之间相互转换,以及验证 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;
}


但我觉得还不够好,请问有什么更有效的算法?
...全文
114 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2011-01-08
  • 打赏
  • 举报
回复
10个字母不重复的话,用字典序的顺序当编号就可以,大概是个n^2的算法。10!也不算很大,存个表方便查找。
showjim 2011-01-08
  • 打赏
  • 举报
回复
10^10>2^32,当然如果是排列可以只记录9个数,10^9<2^32

要效率的话,可以用位运算取代乘除运算,可以用7个4b表示前7个数,2个2b表示后2个数,程序写起来麻烦
cug_fish_2009 2011-01-06
  • 打赏
  • 举报
回复
楼主的算法想搞什么名堂。
如果S字符串的可能性有10^26个,32位整数能表示多少个?
假如实在项存储的话,应该采用hash函数。

我看你想用十进制位来搞定,不行吧!
lay_1980 2011-01-05
  • 打赏
  • 举报
回复
S2P应返回__int64
其他没啥
丈八涯 2011-01-05
  • 打赏
  • 举报
回复
不认为有什么更好的办法。
楼主已经是按位置记录了,其他方法转换都应该比这麻烦。
对C不很了解,但感觉楼主P2S函数好像可以更简练些。
xibeitianlang 2011-01-05
  • 打赏
  • 举报
回复
既然是排列就应该和阶乘有关,10个字符的排列总共有10!个吧。一一对应即可。
比如ABC的字典序:0 ABC; 1 ACB; 2 BAC; 3 BCA; 4 CAB; 5 CBA.

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧