-3

假设我有一组唯一数字 [5, 123, 49176, 30982, 542] 现在我想转换数字并获得另一组唯一数字(整数),范围在 0 到 25 之间

任何人都可以建议任何可以帮助我解决这个问题的算法吗?

4

3 回答 3

3

你要把它们标准化吗?

raw =  [5, 123, 49176, 30982, 542] 

normalization = [(i-min(raw))/(max(raw)-min(raw))*25 for i in raw]
print(normalization)

它会给你:(所有元素都保证是唯一的)

[0.0, 0.059994712330438675, 25.0, 15.749628846271177, 0.2730267840800472]     

如果 result 的元素被限制为整数:

import random
raw =  [5, 1, 23, 49176, 30982, 542] 

if len(raw) > 26: #there's no way to get more than 26 unique elements from 0~25 integers 
    print("mission impossible")
else:
    print(random.sample(range(26), len(raw)))

它会给你(例如):

[23, 4, 13, 10, 18, 24]   

这对你来说是两种妥协的方式。但是根据您的评论,您实际上需要一个单射函数,其域都是整数,而余域是 [0,25] 中的整数。不幸的是,这是一项不可能完成的任务。

于 2012-12-20T13:21:02.470 回答
2

(假设整数)

您可以对元素进行排序,并为每个元素指定其索引(在排序列表中)。假设您的数字少于(或正好)26 个,您将获得所需的范围。如果您可以通过仅将数字设置为集合的当前顺序(例如迭代顺序)来允许同一集合的不确定结果,您也可以避免排序。

请注意,如果您想要一些一般大小写哈希,则无法完成 - 如果您的范围大于 26 - 您将有重复。这直接来自鸽笼原理,其中范围是鸽子,范围 [0,25] 是鸽笼。

于 2012-12-20T13:16:18.917 回答
0

将每个数字用作随机函数的种子,然后检查并确保没有任何重复项。
如果你有一个大于 25 的集合,这也会崩溃,就像 Amit 说的那样。

于 2012-12-20T13:19:08.590 回答