【发布时间】:2017-11-03 19:38:53
【问题描述】:
问候 Delphian 堆垛机。
我已经搜索了整个网站,所有与“排列排序和未排序”相关的讨论,但找不到满足我需求的讨论。
在德尔福中:
有一个数组:
Members: array [0..3] of Byte = (0,1,2,3);
如果要遍历由 3 个元素组成的所有不同排列,可以估计结果列表将由 24 行组成,按字典顺序排列为:
0 012
1 013
2 021
3 023
4 031
5 032
6 102
7 103
8 120
9 123
10 130
11 132
12 201
13 203
14 210
15 213
16 230
17 231
18 301
19 302
20 310
21 312
22 320
23 321
可以使用“n选择k”公式计算列表的大小,其中“n”代表成员数,“k”代表选择数:
p(n,k) = n! / (n-k)!
p(4,3) = 4! / (4-3)! = (4 x 3 x 2 x 1) / (1 x 1) = 24
我想弄清楚的是如何(不搜索整个列表):
通过提供词典排名,比如“13”,可以“取消排名”并获得子集“203”。
通过提供子集“203”,可以获得字典排序“13”。
任何帮助将不胜感激。
感谢您的宝贵时间。
【问题讨论】:
-
等一下,您已经计算了给定空间中的所有 n 排列,其中包含 k 个组。当您已经可以使用公式获得结果时,为什么还需要迭代结果列表?顺便说一句,您正在寻找一个 TDictionary,其中 KEY 是数字 (13),VALUE 是 203。我会使用它!
-
问候阿尔贝托,我将在非常大的空间中使用它,仅在某些条件下提取几个子集,我无法承受数 TB 的数据库来搜索特定的索引(等级)或子集(未排名)。
-
TDictionary
会有所帮助,就查找速度而言,它是 O(1)。 docwiki.embarcadero.com/CodeExamples/Tokyo/en/…可以帮忙吗? -
这不是速度的问题 Alberto,空间,它会产生大量的磁盘/内存空间。
标签: delphi subset distinct permutation rank