JSソートの実装

22286 ワード

アルゴリズムの大きなオーバーヘッドと時間の複雑さ


アルゴリズム#アルゴリズム#

  • アルゴリズムは、ある目的を達成したり、結果を生成したりするために経験しなければならない一連のプロセスを指す.
  • の目的を達成する方法は多様であるため、1つの目的を達成するために多くのアルゴリズムが存在する.
  • アルゴリズムの実行時間は,入力値サイズの関数増分(=成長率)に大きく影響される.
  • アルゴリズムの実行時間をマークすると、重要でない定数と係数(入力サイズが無限大)が削除され、実行時間が重要な成長率に集中し、漸近マーク法と呼ばれる.
  • 漸近とは、計算の影響が最も大きい港湾を意味する.
  • Big-O記号

  • 近接性マーキング法の1つであり、漸近性マーキング法は以下の3種類あり、平均して3つのマーキングが最も正確であるが、評価が難しいため、主にbigoマーキング法が用いられる.
  • 最適:ω記号
  • の平均値:3打法(Big-θ Notation)
  • 最悪の場合:大文字
  • ビオ記号は、不要な演算を除去するために使用され、アルゴリズム解析を容易にする.
  • Big−Oで測定した複雑さには時間と空間的複雑さがある.
  • ソース:http://bigocheatsheet.com/

    時間の複雑さ

  • 問題を解決するのに要する時間と入力の関数関係を指す.
  • アルゴリズムの性能
  • を記述する
  • アルゴリズムは、フロー実行の演算数値化
  • を必要とする.
  • 時間の複雑さに最も影響を及ぼすのはnの単位である.
  • 1             O(1)   --> 상수
    2n + 20       O(n)   --> n이 가장 큰영향을 미친다.
    3n^2          O(n^2) --> n^2이 가장 큰영향을 미친다.
  • 時間複雑度トラブルシューティング手順
  • O(1) – 상수 시간 : 문제를 해결하는데 오직 한 단계만 처리함.
    O(log n) – 로그 시간 : 문제를 해결하는데 필요한 단계들이 연산마다 특정 요인에 의해 줄어듬.
    O(n) – 직선적 시간 : 문제를 해결하기 위한 단계의 수와 입력값 n이 1:1 관계를 가짐.
    O(n log n) : 문제를 해결하기 위한 단계의 수가 N*(log2N)번만큼의 수행시간을 가진다.(선형로그형)
    O(n^2)2차 시간 : 문제를 해결하기 위한 단계의 수는 입력값 n의 제곱.
    O(C^n) – 지수 시간 : 문제를 해결하기 위한 단계의 수는 주어진 상수값 C 의 n 제곱.

    Bubble Sort

    export const ascending = arr => {
      for (let i = 0; i < arr.length; i++) {
        for (let j = 0; j < arr.length - (i + 1); j++) {
          if (arr[j] > arr[j+1]) {
            [arr[j], arr[j+1]] = [arr[j+1], arr[j]]
          }
        }
      }
      return arr;
    };
  • 時間複雑度O(n^2)
  • 2つの隣接する要素をチェックしてソートする方法
  • のソート回転を行うたびに、最下位の要素はソートから除外されます.
  • は、2つの単純に隣接する要素を比較するので、容易に実現できる.
  • 文を2回繰り返し、不要な比較を排除し、実行時間が長い.
  • Heap Sort

    const heapify = (arr, lastIdx) => {
      let idx = parseInt(lastIdx / 2) - 1;
    
      while (idx >= 0 ) {
        const left = arr[idx * 2 + 1];
        const right = arr[idx * 2 + 2];
    
        if (left >= right && arr[idx] < left) {
          const temp = arr[idx];
          arr[idx] = arr[idx * 2 + 1];
          arr[idx * 2 + 1] = temp;
        } else if (right > left && arr[idx] < right) {
          const temp = arr[idx];
          arr[idx] = arr[idx * 2 + 2];
          arr[idx * 2 + 2] = temp;
        }
        idx--;
      };
      return arr;
    };
    
    export const heapAscending = arr => {
      for(let i = arr.length - 1; i >= 0; i--) {
        arr = heapify(arr, i);
    
        if (arr[0] > arr[i]) {
          const temp = arr[i];
          arr[i] = arr[0];
          arr[0] = temp;
        }
      };
      return arr;
    };
    ソース:https://taesung1993.tistory.com/26
  • 時間複雑度O(n log n)
  • hipソートはhip生成アルゴリズムを用いてソートする方法である.
  • hip生成アルゴリズムを用いて最大値(または最小値)を求める.
  • hipアルゴリズムの生成が完了すると、配列の最初の要素の最大値を配列の最後の要素に置き換えます.
  • 以降のプロセスでは、最後の要素を並べて決定された状態にあり、比較プロセスに参加する必要はありません.
  • hip生成アルゴリズム−最初の要素、最後の要素交換プロセスを繰り返し配列する.
  • Merge Sort

    const mergeSort = (array) => {
      if (array.length < 2) {
        return array;
      }
    
      const mid = Math.floor(array.length / 2);
      const left = array.slice(0, mid);
      const right = array.slice(mid);
      return merge(mergeSort(left), mergeSort(right));
    
      function merge(left, right) {
        const result = [];
        let leftIndex = 0;
        let rightIndex = 0;
    
        while (leftIndex < left.length && rightIndex < right.length) {
          if (left[leftIndex] < right[rightIndex]) {
            result.push(left[leftIndex]);
            leftIndex++;
          } else {
            result.push(right[rightIndex]);
            rightIndex++;
          }
        }
        return result.concat(left.slice(leftIndex), right.slice(rightIndex));
      }
    };
  • 時間複雑度O(n log n)空間複雑度:O(n)
  • 符号ソートは、データを先に細分化してからマージソートするアルゴリズムである.
  • 分割征服アルゴリズムに属する.
  • 参照。


    時間複雑度とBig-Oシンボル:https://blog.chulgil.me/algorithm/
    Bubble Sort: https://webruden.tistory.com/391
    Heap Sort: https://taesung1993.tistory.com/26
    ソートアルゴリズム:https://medium.com/@lghaske/ソート-アルゴリズム-クリーンアップ-大-o-82391 afd 20 a 2
    Merge Sort: https://im-developer.tistory.com/134