「アルゴリズムの設計と解析」 - 配線エッセイ

転送:https://blog.csdn.net/liufeng_king/article/details/8671407

 問題の1説明:

      それぞれ、回路基板上に、n個の端子の下端。以下に示すような回路設計、ガイドワイヤの要件(I、[PI](I))と上部端子スタッドI、π(i)の下端が、連結されています。ここで、π(I)、1≤iは≤n、{...、1,2、N}である置換です。鉛(I、π(I))は、回路基板上のi番目のワイヤと呼ばれます。任意の1≤iについては、π(I)>π(j)をj個の≤n、交差i番目とj番目の接続配線のための必要十分条件である≤します。

π(I)= {} 8,7,4,2,5,1,9,3,10,6

         回路基板の製造において、ワイヤのこれらの要件nは、複数の絶縁層上に分布します。同じ層上の配線が交差していません。多くの配線層として存在するように、第1配線層の上に配置された配線を決定する問題。換言すれば、問題は最大の互いに素な部分集合{iがn≤1≤、I、π(I)}リード現在のネット=を決定するために頼みました。    

     2、次善構造特性:

     。N(i、j)が最大の互いに素なサブセットMNSである(I | N(I、J)= {(T、π(T))∈ネットは、T≤I、π(T)≤J Tは}注、j)のサイズ(i、j)は= | MNS(i、j)を|。

     (1)i = 1のとき

    

    (2)の場合、I> 1の場合

    ①J <π(I)。この場合、(I、π(i))をN(i、j)はに属していません。したがって、この場合、N(i、j)は= N(I-1、j)は、それによってサイズ(I、J)=サイズ(I-1、J)。

    ②Jの≥π(I)。この場合、(I、π(i))を∈MNS(i、j)の場合、T <I及びπ(t)が存在する<π任意(T、π(t))を∈MNS(i、j)は(のためのI)、そうでなければ、(T、π(T))と(I、π(i))を交差します。この場合、MNS(I、J) - {(I、π(I))} N(I-1、π(I)-1)最大の互いに素なサブセットです。そうでない場合、サブセットMNSは、(i-1、π(i)は-1)∪{(π(I))} N(I、J)に含まれているMNS(i、j)が大きいN(私の比であります互いに素な部分集合の、J)。これは、のMNS(i、j)の定義と矛盾します。

     (私は、π(i))がMNSトン<私と(i、j)は、その後、任意のための(T、π(t))の∈MNS(i、j)は、されていない場合。MNS(i、j)がN(I-1、j)は、従って、サイズ(i、j)は≤Size(I-1、J)に含まれます。

     一方、MNS(I-1、J)N(i、j)の中に含まれるので、そこサイズ(i、j)は≥Size(I-1、j)は、それによってサイズ(I、J)=サイズ( I-1、j)を。

     3、漸化式

     最適値回路配線問題サイズ(N、N)。問題の準最適な構造特性から見た、準最適値再帰の問題は次のように

     下から上に、次いで第一の端子の行だけカウント、最適な配線2、及び、最適な配線の複数の端子の行を見つけます。具体的なコードは次のよう:

// 3D8配線動的計画問題
の#include "STDAFX.H"
の#include <iostreamの> 
使用して名前空間STD; 
 
のconst int型N = 10;
 
ボイドMNS(C INT []、N-INT、INT **サイズ);
(トレースバックを無効C INT []、int型のサイズ**、N-INT、INTネット[]、INT&M);
 
int型のmain()
{
    int型C [] = {0,8,7,4,2,5,1,9,3 、10,6は}; //インデックスが開始
    INTサイズ=新しい新しいINT ** * [N + 1];
 
    のために(INT I = 0;私は= N <; Iは++)
    {
        サイズ[I] =新しい新しいINT [ 1 + N];
    }
 
    MNS(C、N、サイズ);
 
    COUT << "接続の最大数を交差配線はありません:" <<サイズ[N] [N] << ENDL;
 
    INTネット[N]、M ;
    トレースバック(C、サイズ、N、ネット、M);
 
    COUTは、<< "最大の互いに素な接続がある:" << ENDL;
    (INTのための1-M = I; I> = 0;。i--)
    {
        COUT << "(" <<ネット[I] << " "<< C [ネット[I]] <<")"。
    }
    COUT << ENDL。
    0を返します。
}
 
ボイドMNS(INT C []、int型nは、INT **サイズ)
{
    ための(int型J = 0; J <C [1]; J ++)
    {
        サイズ[1]〜[J] = 0;
    }
 
    のための(int型J = C [1]であり、j <= nであり、j ++)
    {
        サイズ[1]〜[J] = 1。
    }
 
    ため(INT I = 2; iがN <、iは++)
    {
        (int型J = 0; J <C [i]は、J ++)用
        {
            サイズ[I] [J] =サイズ[I-1]〜[J]。 //当iは<C [I]的情形
        }
        ための(int型J = C [i]は、J <= nであり、j ++)
        {
            //当J> = C [i]は时、考虑(I、C [I] )是否属于MNS(i、j)の的两种情况
            サイズ[I] [J] = MAX(サイズ[1-I]、[J]、サイズ[-I 1] [C [I] -1] + +1);
        }
    }
    サイズ[N-] [N-] = MAX( [N - 1]サイズ[N-]、サイズ[N - 1] [C [N-] -1] + +1);
}
 
ボイドトレースバック(C INT []、int型のサイズ**、N-INT、INTネット[]、 M&INT)
{
    INT = N-J;
    M = 0;
    のための(INT I = N-; I> 1; i--)
    {
        IF(サイズ[I] [J] =サイズ[1-I]、[J])! //この場合、(I、C [I] )最大エッジ互いに素な部分集合
        {
            ネット[++のM] = I;
            J = C [I] -1; //更新間隔拡張カラム接続
        }
    }
    IF (J> = C [1] )// プロセス場合、I = 1
    {
        ネット[++のM] = 1;
    }
}
     アルゴリズムMNS時間と空間の複雑さが(N ^ 2)Oです。トレースバック時間複雑度はO(N)です。次のようにプログラムの結果は以下のとおりです。

おすすめ

転載: blog.csdn.net/qq_40903237/article/details/94602524