zoukankan      html  css  js  c++  java
  • 证明:寝室分配问题是NPC问题

    P、NP、NPC、NP-hard

    • P:多项式时间能够解决的问题的集合,比如最短路径问题是集合P的一个元素,而最短路径问题本身又是一个集合,因此P是集合的集合。
    • NP:多项式时间内能够验证的问题的集合。【P$subseteq$NP】
    • NPC:B是NPC问题当且仅当(1)B是NP问题;(2)存在一个已知的NPC问题A,A能规约到B。
    • NP-hard:如果问题B不满足NPC的第一个条件,但满足第二个条件,则称B是NP-hard的。

    规约:$A le_p B$

    如果我们要证明问题B是NPC问题,则我们需要找到一个已知的NPC问题A,且要证明问题B至少比问题A难,即$A le_p B$。

    分配寝室问题

      新生来了,学校需要分配寝室(k人一间),为了更人性化,首先征求学生意见,假设共有n个学生且n为k的倍数,每k个学生可以商量后作为一组,并提交一份意向表,意向表内容是k个学生姓名,表示这k个学生相互同意住在一个寝室,当然对于任何一个学生,他可以从属于多个组,问:是否存在一个合理的分配寝室的方案?

      分配寝室问题的实例:

    1. 学生集合S
    2. m个意向表C
    3. 寝室能容纳的学生数k

    我们用函数 allocation(S,C,k) 来表示解决分配寝室问题的函数。

    比如:

    k=4,n=16(学生用1,...,16进行编号),共6份意向表:{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{1,5,7,9},{1,10,14,15},其中可以看到学生1从属于3个组,即学生1既可以和2,3,4一个寝室,也可以和5,7,9一个寝室,还可以和10,14,15一个寝室。

    XKC问题(Exact cover by k set problem)

    实例:

    1. $S = { {s_1},cdots,{s_n}} ,|S| = n$,n是k的倍数
    2. k元对组成的集合C,$C={c_1,c_2,cdots,c_m},|C|=m,forall c in C,|c| = k$

    问:C是否包含S的恰当覆盖,即是否存在大小为n/k的集合C',$C'subseteq C$,且对于S中的每个元素,恰好出现在C’的一个成员中?

    我们用 XKC(S,C,k)来表示解决XKC问题的函数。

    XKC问题规约到分配寝室问题

    只要证明分配寝室问题至少比XKC更难即可,即如果存在一个分配寝室问题的算法,则XKC就能够解决。

    XKC(S,C,k)
    {
        allocation(S,C,k);
    }

    通过上述的方法就能看出:XKC $le _p$ 分配寝室问题。

    X3C$le_p$XKC

    在《计算机和难解性》中,作者已经证明了$3DMle_p X3C$,即X3C是NPC问题。利用限制法,即可证明规约的正确性,如下所示:

    X3C(S,C)
    {
        XKC(S,C,3);
    }
  • 相关阅读:
    IIS请求筛选模块被配置为拒绝超过请求内容长度的请求(转)
    解决Android AVD启动报错问题
    找新朋友
    【枚举】【SDOI 2011】【bzoj 2241】打地鼠
    Invalidate、RedrawWindow与UpdateWindow的差别
    蓝牙DA14580开发:固件格式、二次引导和烧写
    【C/C++学院】0723-32位与64位/调戏窗体程序/数据分离算法/内存检索/二分查找法/myVC
    Maven 使用 二——nexus
    Linux程序编译链接动态库版本号的问题
    Key-Value Observing (键值监測)
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3203673.html
Copyright © 2011-2022 走看看