アルゴリズム


■内容

Top

■アルゴリズム

Top

■アルゴリズムの記述方法

Top

■アルゴリズムとデータ構造

Top

■アルゴリズムの基本構造

Top
■順次構造
■例題

  1. 変数 a と 変数 b を交換します。
    ・t ← a
    ・a ← b
    ・b ← t
    
    exchange01.jpg
    var t = a;
    a = b;
    b = t;
    
Top
■分岐構造
Top
■if-then 構造
■例題

  1. 変数 a と 変数 b の小さい方を変数 a、大きいほうを変数 b にします。
    ○ 変数 t
    ▲ a > b
    |・t ← a
    |・a ← b
    |・b ← t
    ▼
    
    exchange02.jpg
    if (a > b) {
        var t = a;
        a = b;
        b = t;
    }
    
■実習
  1. プロンプトから入力した 2 つの整数のうち、最小値を表示する HTML "Min01.html" を作成してください。
Top
■if-then-else 構造
■例題

  1. 変数 a の値の偶数 / 奇数を判定し、表示します。
    ▲ a が 2 で割り切れる
    |・"a は偶数" を表示
    +
    |・"a は奇数" を表示
    ▼
    
    evenodd01.jpg
    if (a % 2 == 0) {
        document.write("a は偶数");
    } else {
        document.write("a は奇数");
    }
    
■実習
  1. プロンプトから 2 つの整数を入力して、大小関係を判定する HTML "Large01.html" を作成してください。
Top
■多分岐構造(ケース構造)
■例題

  1. 変数 a の値の正負零を判定し、表示します。
    ▲ a > 0
    |・"a は正数" を表示
    |
    +a = 0
    |・"a はゼロ" を表示
    |
    +
    |・"a は負数" を表示
    ▼
    
    sign01.jpg
    if (a > 0) {
        document.write("a は正数");
    } else if (a == 0) {
        document.write("a はゼロ");
    } else {
        document.write("a は負数");
    }
    
■実習
  1. プロンプトから入力した整数が 0 から 100 の範囲に入っているか否かを表示する HTML "Range01.html" を作成してください。
Top

■繰返し構造

Top
■単純な繰返し
■例題
  1. 整数 n の数だけ、星印(*)を横に並べるアルゴリズムです。

    ○ 整数型: i
    ■ i = 1, 2, 3, ..., n
    |・星印(*)を表示
    ■
    
    StarPrint01.jpg
    "StarPrint01.html"
    1. for (var i = 1; i <= n; i++) {
    2. document.write("*");
    3. }

■実習
Top
■繰返しのネスト
■例題
  1. 整数 n の数だけ、星印(*)を縦横(正方形)に並べるアルゴリズムです。

    ○ 整数型: i, j
    ■ i = 1, 2, 3, ..., n
    |■ j = 1, 2, 3, ..., n
    ||・星印(*)を表示
    |■
    |・改行する
    ■
    
    StarPrint02.jpg
    "StarPrint02.html"
    1. for (var i = 1; i <= n; i++) {
    2. for (var j = 1; j <= n; j++) {
    3. document.write("*");
    4. }
    5. document.write("<br/>");
    6. }

■実習
  1. プロンプトから入力した数値の数だけ、星印(*)を三角形に並べるHTML "StarPrint03.html" を作成してください。(実行結果参照)

  2. プロンプトから入力した数値の数だけ、星印(*)を逆三角形に並べるHTML "StarPrint04.html" を作成してください。(実行結果参照)
Top

■基本的なアルゴリズム

Top
■最小値・最大値
Top
■合計の計算
Top
■ユークリッドの互除法
■ループ構造の表現
Top

■配列を使ったアルゴリズム

Top
■配列のコピー
■例題

  1. 配列 a を、要素の正順に配列 b にコピーする。

    ○ 整数型: b[]
    ○ 整数型: i
    ■ i = 0, 1, ... Na - 1
    |・b[i] ← a[i]
    ■
    
    Array31a01.jpg
    "Array31.html"
    1. // 要素の正順に配列 b にコピーする。
    2. var b = new Array(a.length);
    3. for (var i = 0; i < a.length; i++) {
    4. b[i] = a[i];
    5. }

  2. 配列 a を、要素の逆順に配列 c にコピーする。

    ○ 整数型: c[]
    ○ 整数型: i
    ■ i = 0, 1, ... Na - 1
    |・c[i] ← a[Na - 1 - i]
    ■
    
    Array31a02.jpg
    "Array31.html"
    1. // 要素の逆順に配列 c にコピーする。
    2. var c = new Array(a.length);
    3. for (var i = 0; i < a.length; i++) {
    4. c[i] = a[a.length - 1 - i];
    5. }

  3. 配列 a を、要素をひとつずらして配列 d にコピーする。

    ○ 整数型: d[]
    ○ 整数型: i
    ■ i = 0, 1, ... Na - 1
    |・d[i] ← a[(i + 1) を Naで割ったあまり]
    ■
    
    Array31a03.jpg
    "Array31.html"
    1. // 要素をひとつずらして配列 d にコピーする。
    2. var d = new Array(a.length);
    3. for (var i = 0; i < a.length; i++) {
    4. d[i] = a[(i + 1) % a.length];
    5. }

  4. 配列 a の要素を逆にする。

    ○ 整数型: i
    ■ i = 0, 1, ... [Na / 2]
    |・a[i] と a[Na - 1 - i] とを交換する
    ■
    
    Array31a04.jpg
    "Array31.html"
    1. // 要素を逆にする。
    2. var w;
    3. for (var i = 0; i < a.length / 2; i++) {
    4. w = a[i];
    5. a[i] = a[a.length - 1 - i];
    6. a[a.length - 1 - i] = w;
    7. }

  5. 配列 a の要素をひとつずらす。このとき、作業用の変数をひとつ使用してもよい。

    ○ 整数型: w = a[0];
    ○ 整数型: i
    ■ i = 0, 1, ... Na - 2
    |・a[i] ← a[i + 1]
    ■
    ・a[a.length - 1] ← w
    
    Array31a05.jpg
    "Array31.html"
    1. // 要素をひとつずらす。このとき、作業用の変数をひとつ使用してもよい。
    2. w = a[0];
    3. for (var i = 0; i < a.length - 1; i++) {
    4. a[i] = a[i + 1];
    5. }
    6. a[a.length - 1] = w;

Top
■要素数がわからない配列
■例題

  1. 要素の最後に最大値が入っている整数型配列 b の最大値を除いた要素数を出力する関数 size() を作成してください。

    ○ 整数型: i
    ・i ← 0
    ■ b[i] != 最大値
    |・i のカウントアップ
    ■
    ・変数 i の値を表示
    
    ElementSize01.jpg
    "ElementSize01.html"
    1. function size(a) {
    2. var i;
    3. for (i = 0; a[i] != Number.MAX_VALUE; i++);
    4. return i;
    5. }

Top

■探索

Top
■線形探索
■例題

  1. 指定した整数 n が、配列 a の要素と一致しているか否かを検査し、一致する場合はそのときの添字を、一致しない場合は、-1 を戻す関数を作成してください。ただし、配列の要素は昇順に並んでいるとは限りません。
  2. ○ 整数型: i
    ■ i = 0, 1, ... Na - 1
    |▲ a[i] = n
    ||・添字 i を返す
    |▼
    ■
    ・値 -1 を返す
    
    SequentialSearch.jpg
    "SequentialSearch.html"
    1. function search(a, n) {
    2. for (var i = 0; i < a.length; i++) {
    3. if (a[i] == n) {
    4. return i;
    5. }
    6. }
    7. return -1;
    8. }

Top
■2 分探索
■例題

  1. 指定した整数 n が、配列 a の要素と一致しているか否かを検査し、一致する場合はそのときの添字を、一致しない場合は、-1 を戻す関数を作成してください。ただし、配列の要素は昇順に並んでいます。
  2. ○ 整数型: l = 0, h = Na - 1, m
    ■ l <= h
    |・m ← [(l + h) / 2]
    |▲ a[m] < n
    ||・l ← m + 1
    ||
    |+ a[m] > n
    ||・h ← m - 1
    |+ 
    ||・変数 m を返す
    |▼
    ■
    ・値 -1 を返す
    
    BinarySearch.jpg
    "BinarySearch.html"
    1. function search(a, n) {
    2. var l = 0;
    3. var h = a.length - 1;
    4. var m;
    5. while (l <= h) {
    6. m = Math.floor((l + h) / 2);
    7. if (a[m] < n) {
    8. l = m + 1;
    9. } else if (a[m] > n) {
    10. h = m - 1;
    11. } else {
    12. return m;
    13. }
    14. }
    15. return -1;
    16. }

Top

■コントロール・ブレーク

■例題

  1. 昇順に並んでいる配列 a があります。配列 a の中の同じ要素の数をカウントし、その結果を配列で返す関数を作成してください。
    結果配列では、2つの要素がペアになり、最初の要素に、配列 a の値、そのつぎの要素に、その数を入れます。
  2. ○ 整数型: countValue[]
    ○ 整数型: count = 0
    ○ 整数型: prevValue = a[0]
    ○ 整数型: i, j
    ・ j ← 0
    ■ i = 0, 1, ... Na - 1
    |▲ prevValue = a[i]
    ||・count のカウントアップ
    |+ 
    ||・countValue[j] ← prevValue
    ||・countValue[j + 1] ← count
    ||・j ← j + 2
    ||・count ← 1
    ||・prevValue ← a[i]
    |▼
    ■
    ・countValue[j] ← prevValue
    ・countValue[j + 1] ← count
    ・配列 countValue を返す
    
    Count01.jpg
    "Count01.html"
    1. function count(a) {
    2. var countValue = new Array();
    3. var prevValue = a[0];
    4. var j = 0;
    5. var count = 0;
    6. for (var i = 0; i < a.length; i++) {
    7. if (prevValue == a[i]) {
    8. count++;
    9. } else {
    10. countValue[j] = prevValue;
    11. countValue[j + 1] = count;
    12. j = j + 2;
    13. count = 1;
    14. prevValue = a[i];
    15. }
    16. }
    17. countValue[j] = prevValue;
    18. countValue[j + 1] = count;
    19. return countValue;
    20. }

  3. 配列 a の各要素の降順の順位を配列で返す関数を作成してください。
  4. ○ 整数型: rank[]
    ○ 整数型: i, j
    ■ i = 0, 1, ... Na - 1
    |・rank[i] ← 1
    |■ j = 0, 1, ... Na - 1
    ||▲ a[j] > a[i]
    |||・rank[i] のカウントアップ
    ||▼
    |■
    ■
    ・配列 rank を返す
    
    Rank01.jpg
    "Rank01.html"
    1. function rank(a) {
    2. var rank = new Array(a.length);
    3. for (var i = 0; i < a.length; i++) {
    4. rank[i] = 1;
    5. for (var j = 0; j < a.length; j++) {
    6. if (a[j] > a[i]) {
    7. rank[i]++;
    8. }
    9. }
    10. }
    11. return rank;
    12. }

Top

■併合

■例題

  1. 昇順に並んでいる2つの配列 a, b があります。配列 a と b をまとめて、新しい配列 c をつくる関数を作成してください。このとき、つぎのような条件を前提とします。
  2. ○ 整数型: c[]
    ○ 整数型: i = 0, j = 0, k = 0
    ■ a[i] < 最大値 または b[j] < 最大値
    |▲ a[i] < b[j]
    ||・c[k] ← a[i]
    ||・k のカウントアップ
    ||・i のカウントアップ
    || 
    |+ a[i] = b[j]
    ||・c[k] ← a[i]
    ||・k のカウントアップ
    ||・i のカウントアップ
    ||・j のカウントアップ
    |+ 
    ||・c[k] ← b[j]
    ||・k のカウントアップ
    ||・j のカウントアップ
    |▼
    ■
    ・c[k] ← 最大値
    ・配列 c を返す
    
    Matching01.jpg
    "Marge01.html"
    1. function marge(a, b) {
    2. var c = new Array();
    3. var i = 0, j = 0, k = 0;
    4. while (a[i] < Number.MAX_VALUE || b[j] < Number.MAX_VALUE) {
    5. if (a[i] < b[j]) {
    6. c[k++] = a[i++];
    7. } else if (a[i] == b[j]) {
    8. c[k++] = a[i++];
    9. j++;
    10. } else {
    11. c[k++] = b[j++];
    12. }
    13. }
    14. c[k] = Number.MAX_VALUE;
    15. return c;
    16. }

■整列

Top
■バブル・ソート(交換ソート)
Top
■選択ソート
Top
■挿入ソート
■例題

  1. 配列 a の要素を昇順に並べ替えて返す関数を作成してください。(例題は選択ソートです)
  2. ○ 整数型: i, j
    ■ i = 0, 1, ... Na - 2
    |■ j = i + 1, i + 2, ... Na - 1
    ||▲ a[i] > a[j]
    |||・a[i] と a[j] の値を交換
    ||▼
    |■
    ■
    ・配列 a を返す
    
    Sort01.jpg
    "Sort01.html"
    1. function sort(a) {
    2. var n = a.length;
    3. for (var i = 0; i < n - 1; i++) {
    4. for (var j = i + 1; j < n; j++) {
    5. if (a[i] > a[j]) {
    6. var t = a[i];
    7. a[i] = a[j];
    8. a[j] = t;
    9. }
    10. }
    11. }
    12. return a;
    13. }

Top
■クイック・ソート
Top
■マージ・ソート
Top

■文字列探索

■例題

  1. 文字列 a の中の部分文字列 b のインデックスを返す関数を作成してください。
  2. ○ 整数型: i, j
    ■ i = 0, 1, ... (Na - Nb + 1)
    |■ j = 0, 1, ... Nb - 1
    ||▲ a[i + j] != b[j]
    |||・ループから脱出
    ||▼
    |■
    |▲ j >= Nb
    ||・ループから脱出
    |▼
    ■
    ▲ j < Nb
    |・i ← -1
    ▼
    ・変数 i を返す
    
    StringSearch01.jpg
    "StringSearch01.html"
    1. function search(a, b) {
    2. var i, j;
    3. for (i = 0; i < a.length - b.length + 1; i++) {
    4. for (j = 0; j < b.length; j++) {
    5. if (a[i + j] != b[j]) {
    6. break;
    7. }
    8. }
    9. if (j >= b.length) {
    10. break;
    11. }
    12. }
    13. if (j < b.length) {
    14. i = -1;
    15. }
    16. return i;
    17. }

Top

■グラフ・アルゴリズム

Top

■その他

Top
■例題 - エラトステネスのふるい

  1. エラトステネスのふるいを利用して、指定された数 n までの素数を配列として戻す関数を作成してください。

    ○ 整数型: prime[n]
    ○ 整数型: primevalue[]
    ○ 整数型: i, j
    ・配列 prime の要素をすべて true にする
    ■ i = 2, 3, ... n - 1
    |▲ prime[i] ← true
    ||■ j = 2 * i, 2 * i + j, ... n - 1
    |||・prime[j] ← false
    ||■
    |▼
    ■
    ・j ← 0
    ■ i = 2, 3, ... n - 1
    |▲ prime[i] ← true
    ||・primevalue[j] ← i
    ||・j のカウントアップ
    |▼
    ■
    ・配列 primevalue を返す
    
    Eratosthenes.jpg
    "Eratosthenes.html"
    1. function eratosthenes(n) {
    2. var prime = new Array(n); // ふるい
    3. var primevalue = new Array(); // 素数配列(戻り値)
    4. for (var i = 0; i < n; i++) {
    5. prime[i] = true;
    6. }
    7. for (var i = 2; i < n; i++) {
    8. if (prime[i]) {
    9. for (var j = 2 * i ; j < n; j = j + i) {
    10. prime[j] = false;
    11. }
    12. }
    13. }
    14. var j = 0;
    15. for (var i = 2; i < n; i++) {
    16. if (prime[i]) {
    17. primevalue[j] = i;
    18. j++;
    19. }
    20. }
    21. return primevalue;
    22. }

Top

inserted by FC2 system