Permutation Id..? C++
Permutation Id..? C++
我正在使用排列生成一个字符串(使用其每个字符)到"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_permutation
的176791
应用产生的置换吗?
置换可以通过几种不同的方式由整数编码。正确构造的编码将全部占用相同数量的比特。但是不同的编码可能会使用不同的整数来编码相同的排列。
无论如何,如果你不关心特定的编码方法,那么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链接,可以对这个主题进行更深入的分析
快速排列->数字->排列映射算法
- 从函数角度看ID到文件路径的内部与外部映射
- 通过组合不同的类型来创建唯一的id
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- FFMPEG配置文件级别id大小无效
- 方法内部但循环仍得到预期的不合格id错误C++
- 如何获取 GLFW 窗口 ID?
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 显示数组中的学生 ID 和最高分
- C++:"("令牌"之前有预期的非限定 id 指向类中成员函数的指针
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- Xcode 9.4.1 中的 Apple Mach-O 链接器 (id) 错误
- 错误:令牌 { '{' 之前应存在非限定 ID
- 断言"id < 0"在Qt ActiveX中失败
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 如何根据两个因素组织向量:id 和数量?(C++)
- 在返回 0 之前应为非限定 ID
- Direct3D 11 - HLSL - 获取顶点索引 ID
- 编译时检查特征专用化是否具有唯一 ID
- DCMTK 了解"DIMSE 没有有效的演示上下文 ID"错误
- 一种有效的数据结构,用于按 ID 访问和查找加权随机项