划分两个子集的NPC问题 算法设计 复杂度O(1)

版权声明:本文为博主原创文章,转载标注出处。联系微信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)复杂度情况下,计算得出了 划分子集。

算法缺点:
数据单一,存在偶然性。

算法未经检验,可以讨论解决方法。

猜你喜欢

转载自blog.csdn.net/qq_36666115/article/details/88384479