7.2 配列による集合



すべての要素が同じ型のとき,配列を用いて集合を表現できます。
      

上記のように,順序は任意でかまいません。

CやC++では,集合の要素数と配列の要素数を
等しくする必要がありますので,
初期化時に動的に領域を確保する等の工夫が必要です。

一方,C#を使う場合には,newキーワードを用いて,
サイズが決まった時点で配列の大きさを決めます。

また,C#では,ギザギザの形の配列(Jag配列)を
宣言できますので,
他のC処理系よりも配列による集合表現が容易です。

[プログラム例] フォーム定義

// データ宣言
public int[][] Set = new int[3][];

// 結果の表示
public void 表示()
{
  string S; listBox1.Items.Clear();
  foreach(int[] A in Set)
  {
     if(A.Length==0) S="[]";
     else
     {
         S="";
        foreach(int X in A) S += X.ToString()+", ";
        S = "[" + S.Substring(0,S.Length-2)+ "]";
     }
     listBox1.Items.Add(S);
  }
}
// 初期設定
private void button1_Click(object sender, System.EventArgs e)
{
  Set[0]= new int[3]{1,2,3};
  Set[1]= new int[0]{};
  Set[2]= new int[4]{4,5,6,7};
  表示();
}
// 集合SにXが入っているかどうか
private bool SetMember(int X, int[] S)
{
  for(int i=0;i<S.Length;i++) if(X==S[i])return true;
  return false;
}
private void button2_Click(object sender, System.EventArgs e)
{
  int EL=int.Parse(textBox1.Text);
  int ID=int.Parse(textBox2.Text);
  if(ID>=0 && ID<=2)
     MessageBox.Show(SetMember(EL,Set[ID]).ToString());
}
// 集合SにXを追加
private int[] AddMember(int X,int[] S)
{
  if(SetMember(X,S)) return S;
  int[] S2=new int[S.Length+1];
  for(int i=0;i<S.Length;i++) S2[i]=S[i];
  S2[S.Length]=X;
  return S2;
}
private void button3_Click(object sender, System.EventArgs e)
{
  int EL=int.Parse(textBox1.Text);
  int ID=int.Parse(textBox2.Text);
  Set[ID]=AddMember(EL,Set[ID]);
   表示();
}
// 集合SからXを削除
private int[] DelMember(int X,int[] S)
{
  if(!SetMember(X,S))return S;
  int[] S2=new int[S.Length-1];
  int ii=0;
  for(int i=0;i<S.Length;i++)if(S[i]!=X) S2[ii++]=S[i];
  return S2;
}
private void button4_Click(object sender, System.EventArgs e)
{
  int EL=int.Parse(textBox1.Text);
  int ID=int.Parse(textBox2.Text);
  Set[ID]=DelMember(EL,Set[ID]);
  表示();
}
// S1とS2の和集合
private int[] SetUnion(int[] S1,int[] S2)
{
  int[] S = S2;
  foreach (int EL in S1) S = AddMember(EL,S);
  return S;
}
private void button5_Click(object sender, System.EventArgs e)
{
  int ID1=int.Parse(textBox2.Text);
  int ID2=int.Parse(textBox3.Text);
  Set[ID1]=SetUnion(Set[ID1],Set[ID2]);
  表示();
}
// S1とS2の積集合
private int[] SetIntersection(int[] S1,int[] S2)

{
  int[] S = new int [ ]{ };
  foreach (int EL in S1)
       if(SetMember(EL,S2))S = AddMember(EL,S);
  return S;
}
private void button6_Click(object sender, System.EventArgs e)
{
  int ID1=int.Parse(textBox2.Text);
  int ID2=int.Parse(textBox3.Text);
  Set[ID1]=SetIntersection(Set[ID1],Set[ID2]);
  表示();
}
// S1とS2の差集合 private int[] SetDifference(int[] S1,int[] S2)
{
  int[] S = new int [ ]{ };
  foreach (int EL in S1)
      if(!SetMember(EL,S2)) S = AddMember(EL,S);
  return S;
}
private void button7_Click(object sender, System.EventArgs e)
{
  int ID1=int.Parse(textBox2.Text);
  int ID2=int.Parse(textBox3.Text);
  Set[ID1]=SetDifference(Set[ID1],Set[ID2]);
  表示();
}




1. 基本的なアルゴリズム

2. 基本的なデータ構造

3. 操作を伴うデータ構造

4. 探索

5. 再帰的アルゴリズム

6. ソート

7. 集合

8. 文字列処理

9. 色々なアルゴリズム


上のタイトルをクリックします