好的,这就是问题所在。
让我们说:
1 means Bob
2 means Jerry
3 means Tom
4 means Henry
上述两个数字的任何总结组合是状态/情绪类型,即程序的编码方式:
7 (4+3) means Angry
5 (3+2) menas Sad
3 (2+1) means Mad
4 (3+1) means Happy
and so on...
我如何创建一个解码函数,使其接受一个添加的(编码)值,如7,5,3,4等,并找出组合并返回代表这两个数字的人的姓名构成组合。请注意,一个数字不能重复以获得心情结果,意味着4必须是3 + 1并且可能不是2 + 2。所以我们可以假设这个例子,每个状态/心情代码只有一种可能的组合。现在的问题是,你如何在python 3中实现这样的代码?这种问题的算法或逻辑是什么?你如何寻找或检查两个数字的组合?我想我应该只运行一个循环,一次添加两个数字,直到结果与状态/心情代码匹配。那会有用吗?但是,如果组合数量增加,这种方法将成为过时(如将4个数字加在一起而不是2个)。这样做会花费很多时间,而且可能效率低下。
我道歉,我知道这些问题非常令人困惑,但请耐心等待。 让我们试着解决一些问题。答案 0 :(得分:4)
如果你想拥有唯一的和,那么为每个可能的“人”分配一个2的幂数。这些数字的任何组合的总和将唯一地标识总和中使用的数字。
1,2,4,8,16,......
我没有提供正确的详细证明,而是提供了一个直观的论证:任何数字都可以用基数2表示,并且它总是恰好是2的幂的一个组合的总和。
此解决方案可能不是最佳解决方案。它有现实的限制(32或64个不同的“人”标识符,除非你使用某种BigInt),但根据你的需要,它可能会有效。具有最小可能值,二进制优于任何其他基数。
(编辑)的
这是一个快速摘录,演示了如何解码总和。返回值是2的幂的指数。count_persons
可以是任意大的,n
的范围也可以迭代(就像一个简单的例子)。
#!/usr/bin/python3
count_persons = 64
for n in range(20,30):
matches = list(filter(lambda i: (n>>i) & 0x1, range(1,count_persons)))
print('{0}: {1}'.format(n,matches))
输出:
20: [2, 4]
21: [2, 4]
22: [1, 2, 4]
23: [1, 2, 4]
24: [3, 4]
25: [3, 4]
26: [1, 3, 4]
27: [1, 3, 4]
28: [2, 3, 4]
29: [2, 3, 4]
答案 1 :(得分:0)
查看更合适的答案here
在我看来,所选择的答案是如此不理想,以至于它被认为是完全错误的。
您正在构建的表可以使用N(N-1)/ 2值进行索引,而二进制方法使用2 N 。
使用64位无符号整数,您可以编码大约sqrt(2 65 )值,即60亿个名称,与二进制方法允许的64个名称进行比较。
使用大数字库可能会有所限制,但所涉及的计算成本远远高于替代方法所需的简单o(N)反向索引算法。
我的结论是:二进制方法效率非常低,除非您想要使用少量值,在这种情况下,对索引进行硬编码或预先计算将是一个很好的解决方案。
由于该问题不太可能与该主题的搜索相匹配,因此无论如何都不重要。