算法设计之字典序

本文探讨了如何计算一个特定排列在字典序中的位置,以及如何找到字典序排列的下一个排列。通过分析和递归算法,可以计算每个元素到正确位置所需的移动次数,从而确定排列的序号。此外,还提供了C++代码实现来计算字典序值。
摘要由CSDN通过智能技术生成

问题描述:n个元素{1,2,3...n}有n!种不同的排列。将这n!个排列按字典序排列,并编号0,1,2,3...n!-1。每个排列的编号为其字典序值。例如,当n=3时,有6个不同排列的字典序如下:

 

字典序值 0 1 2 3 4 5 排列 123 132 213 231 312 321 算法设计:给定n以及n各元素{1,2,3...n}的一个排列,计算出这个排列的字典序值,以及按字典序排列的下一个排列。

问题分析:比较简单的想法就是就是将n个元素进行排列有n!中组合,然后将这些数进行排序。但是这样存在,效率低下、存储空间消耗巨大的问题。如果运用递归和分治策略来解决问题就会简单的多。

具体步骤:为了求排列对应的序号,只要该序列到第一个序列即0,1,2,3…n-1所需要移动的次数。移动原则是a[i]从大到小移动,对于每一个数字a[i],若i前面比a[i]小的个数正好是a[i]-1个,则这个数不需要向后移动以达到目标序列,否则i后面必然有a[i]-b[i]-1个比a[i]小的数,只要把a[i]移动到比自己小的数后面才能使得移动中的序列正向目标前进。因此只要求出每个数的移动次数,然后相加就是该序列的位置。即每个数到正确位置需要移动的次数为(n-i-1)!*(a[i]-b[i]-1)。

#include<iostream>
#include<cstring>
using namespace std;
 
int section_sum(int i,int k){
//递归求法,求以i开头长度为k的升序字符串的总个数 
    int sum=0;
    if(k==1)
        return 1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值