Permutation Id..? C++

Permutation Id..? C++

本文关键字:C++ Id Permutation      更新时间:2023-10-16

我正在使用排列生成一个字符串(使用其每个字符)到"helloworld!",但它需要。。。176791到达"helloworld!"有没有办法让我只需输入:176791快速转换到"hellowworld!"?

...
176790. helloworl!d
176791. helloworld!

我的代码:

#include <windows.h>
#include <string>
#include <iostream>
#include <algorithm>
int main( void )
{
::UINT64 Count = 0;
std::string SomeString = "eohldo!lwrl";
do
{
Count ++;
std::cout << Count << ". " << SomeString << std::endl;
if( SomeString == "helloworld!" )
break;
} while( std::next_permutation( SomeString.begin( ), SomeString.end( ) ) );
::getchar( );
return( 0 );
};

我不确定这个问题是关于什么的。基本上,看起来你正在寻找一种用整数"编码"排列的方法。但尚不清楚该编码是否需要与对std::next_permutation的顺序调用生成的排列序列同步。是吗?I.e你要求数字176791编码std::next_permutation176791应用产生的置换吗?

置换可以通过几种不同的方式由整数编码。正确构造的编码将全部占用相同数量的比特。但是不同的编码可能会使用不同的整数来编码相同的排列。

无论如何,如果你不关心特定的编码方法,那么N元素的任何排列都可以用以下方式编码:

  • 想象一下排列的规范表示:一个描述序列元素新位置的N索引数组,即index[old position] = new position

  • 现在简单地将该数组解释为以N为基数的N位数字。即,排列由整数值表示

    index[0]*N^0 +  index[1]*N^1 + index[2]*N^2 + ... + index[N-1]*N^(N-1)
    

基本上,原始排列的正则数组表示被压缩成足够大的整数值。(如果N是2的幂,则此表示将简单地将原始数组值打包到一个位数组中)。包装和开箱都是一个简单的过程。

不幸的是,我上面描述的表示结构不好由于它试图用非唯一值对index数组进行"无损"编码,因此它需要比所需更多的比特。排列的有效表示在索引数组中不会有重复值。这立即意味着上述表述过于夸张。更紧凑的表述应该是可能的。无论如何,这应该是一个经过充分研究的主题,一个简单的谷歌搜索应该会发现很多关于编码排列的信息。


这里有一个SO链接,可以对这个主题进行更深入的分析

快速排列->数字->排列映射算法