从给定列表中查找任何k元素中的最大值(总和(计数(设置位)))

时间:2016-11-30 07:02:33

标签: python list

我有一个问题是找到给定列表中任何k元素中设置位数的最大值。

鉴于:

n = 4   # length of list
k = 2   # choose only k elements of list whose count(sum(set bits)) is max
list  l= 6 2 1 0

所以如果我分别用2和1设置位选择数字6( 11 0)和1(00 1 ),添加它们会给出最大设置位数即。 3

我尝试的是:

from itertools import combinations
s = list(map(int,raw_input().split()))
n = s[0]
k = s[1]

l = list(map(int,raw_input().split()))

comb = list(combinations(l, k))
# print comb
ad = []
for i in comb:
    x = bin(i[0])[2:].count('1')+bin(i[1])[2:].count('1')
    ad.append(x)
# print ad
print max(ad)

我的问题在于行:

x = bin(i[0])[2:].count('1')+bin(i[1])[2:].count('1')

由于 k = 2 ,我手动采用i [0]和i [1]。 但是如何做到这一点动态

此外,我正在寻找答案而不使用列表理解,因为我的列表大小可能会变为2到10 ^ 18,这会导致内存超出。

如果您可以提出任何其他逻辑,那将非常有用。

2 个答案:

答案 0 :(得分:2)

我希望那里有一种。我真的认为组合是不需要的,因为只有设置了最多位的项才能构成结果。请考虑以下事项:

鉴于您的意见,以下我认为计算结果:

n = 4   # length of list
k = 2   # choose only k elements of list whose count(sum(set bits)) is max
l = [6, 2, 1, 0]
像这样:

>>> sorted(l, key=lambda v: bin(v)[2:].count('1'), reverse=True)[:2]
[6, 2]

可以通过使用大小为k的heapq并插入(bin(v)[2:].count('1'), v)来对输入进行流式处理,然后通过提取数字将结果作为产品。 heapq函数nlargest可以正常使用

>>> import heapq
>>> heapq.nlargest(k, l, key=lambda v: bin(v)[2:].count('1'))
[6, 2]

请注意l可以是迭代器。这在恒定的空间中运行。内存使用量取决于k而不是迭代器的长度。

然后您可以计算其他答案中设置的位总和:

>>> sum(bin(v)[2:].count('1') for v in [6,2])
3

答案 1 :(得分:1)

我认为

x = sum([bin(i[kk])[2:].count('1') for kk in range(k)])

可行吗