版权声明:本文为博主原创文章,转载标注出处。联系微信btc20002000 https://blog.csdn.net/qq_36666115/article/details/88384479
直接复制的 邮箱内容
来源:听mooc第三讲:大O记号。划分子集为NPC问题。提出如下的解决方法:
按照O(1)思维,是否可以等分两个子集,回答的是或者不是,那么可以看做是是否存在一种方法可以分成两个。
前提:对需要划分的数据进行一个从大到小的排序
算法如下:Python实现
c = [55, 34, 31, 27, 21, 21, 20, 17, 15, 15, 15, 13, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 8, 8, 7, 7, 7, 7, 6,
6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3]
print(len(c), sum(c))
c1 = []
c2 = []
for i in range(len(c)):
if sum(c1) <= sum(c2):
c1.append(c[i])
else:
c2.append(c[i])
print(c1, sum(c1))
print(c2, sum(c2))
。结果如下:
51 538
[55, 27, 21, 17, 15, 13, 11, 11, 10, 10, 9, 9, 7, 7, 7, 6, 5, 5, 4, 4, 4, 3, 3, 3, 3] 269
[34, 31, 21, 20, 15, 15, 12, 11, 11, 10, 10, 9, 8, 8, 7, 6, 6, 5, 5, 5, 4, 4, 3, 3, 3, 3] 269
计算结果表明:
在O(1)复杂度情况下,计算得出了 划分子集。
算法缺点:
数据单一,存在偶然性。