给定一个长度为 n 的数组,我需要打印出数组的字典索引(从零开始索引)。字典索引本质上是给定数组如果放置在包含原始数组的所有可能排列的超级数组中的位置。
事实证明这并不是那么困难(唯一元素排列),但我现在的问题是制作相同的算法,但对于包含相同元素重复项的数组。
这是一个示例图表,显示了一个小数组的一些可能排列,以及它们各自的预期返回值:
[0 1 1 2 2]->0
[0 1 2 1 2]->1
[0 1 2 2 1]->2
[0 2 1 1 2]->3
[0 2 1 2 1]->4
[0 2 2 1 1]->5
[1 0 1 2 2]->6
[1 0 2 1 2]->7
[1 0 2 2 1]->8
[1 1 0 2 2]->9
[1 1 2 0 2]->10
[1 1 2 2 0]->11
..
[2 2 1 0 1]->28
[2 2 1 1 0]->29
最重要的是,我想在不生成其他排列来解决问题的情况下执行此操作(例如,我不想生成小于给定排列的所有排列)。
我正在寻找伪代码——只要我能理解这个概念,就不需要特定的语言。即使没有伪代码的计算原理也可以。
我见过一些实现类似的实现,但对于二进制字符串(仅包含两种不同类型的元素),他们使用二项式系数来完成工作。希望这会有所帮助。