📜  复杂性类的类型 | P, NP, CoNP, NP hard 和 NP complete(1)

📅  最后修改于: 2023-12-03 14:51:39.862000             🧑  作者: Mango

复杂性类的类型

在计算机科学和算法分析中,复杂性类(complexity classes)是一种用于描述计算问题复杂性的形式体系。常见的复杂性类包括 P、NP、CoNP、NP hard 和 NP complete 等。本文将介绍这些复杂性类的定义和特征。

P 类

P 类是指在多项式时间内可解的计算问题构成的类别。换句话说,对于任意一个 P 类问题,都可以在多项式时间内计算出它的解。例如,对于一组给定的整数,判断其中是否包含质数是一个 P 类问题。

NP 类

NP 类是指在多项式时间内验证可解的计算问题构成的类别。也就是说,如果一个问题的解可以被多项式时间内验证,那么它就属于 NP 类。但是,与 P 类不同的是,NP 类问题的解可能需要超出多项式时间的复杂度去计算。例如,旅行商问题(TSP)就是一个 NP 类问题。

CoNP 类

CoNP 类与 NP 类相似,但是它是 NP 类问题的补集。也就是说,对于任意一个 CoNP 类问题,如果它的解能够在多项式时间内验证,那么它的求解过程就是不可能的。目前还没有发现任何 NP 类问题的补集属于 P 类或 CoNP 类,因此 CoNP 类问题被认为比 NP 类问题更难解决。

NP hard 类

NP hard 类是指至少和 NP 类问题一样困难的问题的集合,但却不一定属于 NP 类。也就是说,NP hard 类问题可能不是可解的,但是它们至少是 NP 类问题的等价问题。因此,如果一个问题被证明为 NP hard,那么它一定具有比 NP 类问题更高的复杂度。

NP complete 类

NP complete 类是 NP 类问题的最难问题的集合,也是 NP hard 类问题的子集。所有 NP complete 类问题都有以下性质:它们都是 NP 类问题,并且对于任何一个 NP 类问题,都存在一个等价于它的 NP complete 类问题。因此,如果一个 NP complete 类问题被证明可以在多项式时间内解决,那么所有的 NP 类问题也都可以在多项式时间内解决。

总结

复杂性类是计算机科学和算法研究中非常重要的概念。P 类问题在多项式时间内可解,NP 类问题在多项式时间内可验证,CoNP 类问题在多项式时间内不可能解决,NP hard 类问题至少和 NP 类问题一样困难,NP complete 类问题是 NP 类问题中最难问题的集合。在实际应用中,我们需要根据问题的性质和实际需求选择合适的算法和数据结构,以提高计算效率和减小时间复杂度。

# P 类示例
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

# NP 类示例
# 旅行商问题的暴力搜索算法
def tsp(graph, path, visited, cur_len, shortestPath, shortestLen):
    if len(path) == len(graph):
        if cur_len + graph[path[-1]][path[0]] < shortestLen:
            shortestPath[:] = path
            shortestLen = cur_len + graph[path[-1]][path[0]]
    for next_node in range(len(graph)):
        if next_node not in visited:
            cur_len += graph[path[-1]][next_node]
            path.append(next_node)
            visited.add(next_node)
            tsp(graph, path, visited, cur_len, shortestPath, shortestLen)
            visited.discard(next_node)
            path.pop()
            cur_len -= graph[path[-1]][next_node]

# CoNP 类示例
# 可以被证明为同构问题是 CoNP hard 类问题
# 在多项式时间内判断两个图是否同构是不可能的

参考资料