プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

最短の一般的なスーパーシーケンス


最も短い一般的なスーパーシーケンスは、指定された両方のシーケンスの各要素が存在するシーケンスです。言い換えれば、与えられた2つの文字列は、どちらもShortestCommonSuper-Sequenceのサブシーケンスであると言えます。

2つの文字列に共通の文字がない場合は、それらを連結してスーパーシーケンスを取得できます。ただし、一般的な文字がいくつかある場合は、最初に最長の文字列を見つけてから、他の文字列の文字を追加する必要があります。

入力と出力

Input:
Two strings. “ABCDEF” and “XYDEF”
Output:
The length of the shortest common super-sequence.
Here the super-sequence is “ABCDEFXY”. So the length is 8.

アルゴリズム

superSeq(str1, str2)

入力: 2つの文字列str1とstr2。

出力: スーパーシーケンスの長さを見つけます。

Begin
   m := length of str1
   n := length of str2
   define table named seqTab of size (m+1 x n+1)

   for i := 0 to m, do
      for j := 0 to n, do
         if i = 0, then
            seqTab[i, j] := j
         else if j = 0, then
            seqTab[i, j] := i
         else if str1[i-1] = str2[j-1], then
            seqTab[i, j] := 1 + seqTab[i-1, j-1]
         else
            seqTab[i, j] := 1 + minimum of seqTab[i-1, j] and seqTab[i, j-1]
      done
   done
   return seqTab[m, n]
End

#include<iostream>
using namespace std;

int min(int a, int b) {
   return (a<b)?a:b;
}

int superSeq(string str1, string str2) {
   int m = str1.size();
   int n = str2.size();

   int supSeqTable[m+1][n+1];

   for (int i = 0; i <= m; i++) {
      for (int j = 0; j <= n; j++) {
         if (!i)
            supSeqTable[i][j] = j;              //shortest supersequence length is j
         else if (!j)
            supSeqTable[i][j] = i;                //shortest supersequence length is i
         else if (str1[i-1] == str2[j-1])
            supSeqTable[i][j] = 1 + supSeqTable[i-1][j-1];
         else
            supSeqTable[i][j] = 1 + min(supSeqTable[i-1][j], supSeqTable[i][j-1]);
      }
   }
   return supSeqTable[m][n];
}

int main() {
   string first = "ABCDEF";
   string second = "XYDEF";
   cout << "Length of the shortest supersequence is " << superSeq(first, second);
}
です。

出力

Length of the shortest supersequence is 8

  1. 正確にk個のエッジを持つ最短経路

    1つの有向グラフには、頂点の各ペア間の重みが示され、2つの頂点uとvも提供されます。私たちのタスクは、頂点uから頂点vまでの最短距離を、正確にk個のエッジで見つけることです。 この問題を解決するために、頂点uから開始し、隣接するすべての頂点に移動し、k値をk-1として使用して隣接する頂点に対して繰り返します。 入力と出力 Input: The cost matrix of the graph. 0 10 3 2 ∞  0 ∞ 7 ∞  ∞ 0 6 ∞  ∞ ∞ 0 Ou

  2. 単一ソースの最短経路、任意の重み

    単一ソース最短経路アルゴリズム(任意の重みが正または負の場合)も知られています。ベルマンフォードアルゴリズムは、ソース頂点から他の頂点までの最小距離を見つけるために使用されます。このアルゴリズムとダイクストラのアルゴリズムの主な違いは、ダイクストラのアルゴリズムでは負の重みを処理できないことですが、ここでは簡単に処理できます。 Bellman-Fordアルゴリズムは、ボトムアップ方式で距離を検出します。最初に、パスにエッジが1つしかない距離を見つけます。その後、パスの長さを増やして、考えられるすべての解決策を見つけます。 入力 −グラフのコストマトリックス: 0 6 ∞