zoukankan      html  css  js  c++  java
  • 拟阵的最优子集问题的贪心算法

    前置知识

         可以参见:拟阵的相关知识,图拟阵

    问题描述:

           输入:拟阵 M=(S, I),M的加权函数W

           输出:对于加权函数W,M的最优子集

    算法描述:

         1. 确定贪心思想

           这一步直接给出代码,描述有些繁琐。

    贪心(M, W)
    A = null;
    按权W值大小排序S;
    For 任意的x是S的元素(按W(x)递减顺序)DO
        If AU{x} ∈ I /*选择目前W(x)最大的x */
        Then A = AU{x};
    Return A.
    

      说明:构造一个集合M来作为最优子集的边集。

         2.算法复杂性分析

    • 令n = |S|
    • 第3行的时间复杂度是O(nlogn);
    • 第5~6行的算法复杂度是O(f(n)),那么4~6行的算法复杂度是O(nf(n));
    • 总的时间复杂度是:T(n) = O(nlogn) + O(nf(n))。

          2. 分析贪心选择性

           定理1:设M=(S, I)是一个加权拟阵, W是M的权函数, S按W值递减排序. 令x是S中满足{x}∈I的第一个元素, 则存在一个M的优化子集A, x∈A。

           证明:如果不存在一个M的优化子集A, x∈A。假设B是M的任意一个优化子集,且x不是B中的元素,那么可以以下列方法构造一个子集A:

    • 初始时,A={x};
    • 由于A,B都是I的元素,且,|A| < |B|,由拟阵的变换性可知,存在x属于B-A,使得AU{x} 属于I。找到x,且令A = AU{x}。
    • 重复第二步,直到|A| = |B|,而只要|A| < |B|,第二步可以一直进行。

           由此构造方法,一定存在z是B的元素,使得A = (B - {z}) U {x}。

           故而,W(A) = W(B) - W(z) +W(x) > W(B),这与B是优化子集矛盾,假设不成立。 

           对于定理1,值得一提的是,x要求其W值最小,而这种最小之外是附有条件的,即{x} ∈I,一旦去掉这个条件,那么定理将不会成立。因为可能存在一种情况,虽然x的W值最小,但是{x}!∈I,那么就无法满足构造中的第二步条件。

          至于其反例:W(x) < W(S/{x}),而{x}!∈I,而S/{x}∈I,此时的最大独立集合不包含x,即S/{x}。

         3.分析优化子结构

           对于优化子结构的证明需要额外附加一个条件,即存在x∈I,|x| ≥ 2。如果不满足该条件,那么算法只需要选出第一个元素即可,没有必要进行下一步,那么自然也不需要优化子结构。引理2默认该条件成立。

           引理2:设x是第一个被贪心算法选中的元素. 对于包含x的优化子集A而言,A'=A-{x}是子问题M'=(S', I')的优化子集。M'=(S', I')定义如下:

    • S' = {y∈S | {x,y}∈I}
    • I' = {B |B是S-{x}的子集,且BU{x}是I的元素}
    • 权函数相同

           证明:

    • 这里还需要证明我们所构建的二元组M'是一个拟阵。
    • 需要说明的是,贪心算法所选中的第一个元素x,满足{x}∈I,且,其W值在Q中最小,Q = {y|{y}∈I}。
    • S'非空。由于引理2的前置条件,即存在q∈I,|q| ≥ 2,那么,对于任意的q而言,|q|>|{x}|,且q,{x}∈I,依据拟阵M变换性,一定存在m∈q/{x},使得{x}U{q}∈I,那么,s非空。
    • I'是某些非空的S'子集的集合。由于BU{x}∈I,且,B是S-{x}的子集,那么B中的元素一定都是S'中的元素。对于B中的任意元素n,可知,{n}U{x} 是BU{x}的子集合,由拟阵M的遗传性,可知,{n}U{x}∈I,n∈S' 。
    • 遗传性。BU{x}是I的元素,那么对于B的任意子集合A,AU{x}是BU{x}的子集合,由拟阵M的遗传性,AU{x}∈I,那么A属于I'。
    • 变换性。任意的A,B∈I',|A| < |B|,那么AU{x}∈I,且BU{x}∈I,|AU{x}|<|BU{x}|,由拟阵M的变换性,可知存在k∈BU{x}-AU{x},即k∈B-A,使得,AU{k}U{x} ∈I,故而AU{k}∈I'。得证。
    • 对于原问题的证明,如果A'=A-{x}不是子问题M'=(S', I')的优化子集,那么一定存在C'是子问题M'=(S', I')的优化子集,而且W(C') > W(A')。那么,可以构造一个集合C = C'U{x},由于C'∈I',故而C'U{x} 是I的元素,故而C是原问题某个子集,而W(C) = W(C') + W(x),而W(A) = W(A') +W(x),而W(A) < W(C),这与A是原问题的优化子集矛盾,假设不成立。

         4.分析算法正确性

           完全可以由引理1以及引理2使用数学归纳法推出该算法的正确性。

  • 相关阅读:
    Shell学习(八)——dd命令
    PLSQL导出oracle表结构和数据
    如何让Linux 机器CPU使用率变高
    WebService学习总览
    Java发HTTP POST请求(内容为xml格式)
    Oracle—回车、换行符
    Oracle—merge into语法
    Apache解析和绑定域名
    MySQL根据经纬度按距离排序
    jquery监听input
  • 原文地址:https://www.cnblogs.com/zqybegin/p/13594575.html
Copyright © 2011-2022 走看看