给定一个长度为n的数组,我需要打印出数组的词典索引(从零开始索引)。词典索引本质上是给定数组放置在包含原始数组的所有可能排列的超级数组中的位置。
这并不是那么困难(Unique Element Permutations),但我的问题现在是制作相同的算法,但对于包含相同元素重复的数组。
这是一个示例图表,显示了一个小数组的一些可能的排列,以及它们各自的预期返回值:
[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
最重要的是,我希望这样做而不会产生其他排列来解决问题(例如,我不想生成比给定排列更少的所有排列)。
我正在寻找伪代码 - 只要我能理解这个概念,就不需要特定的语言。即使没有伪代码的计算原理也没问题。
我看到some implementations做了类似的事情,但是对于二进制字符串(只包含两种不同类型的元素),他们使用二项式系数来完成工作。希望这会有所帮助。