An open API service indexing awesome lists of open source software.

https://github.com/c-bata/algorithm

アルゴリズムやデータ構造の考え方 & ソースコードをメモ
https://github.com/c-bata/algorithm

Last synced: about 1 year ago
JSON representation

アルゴリズムやデータ構造の考え方 & ソースコードをメモ

Awesome Lists containing this project

README

          

Algorithm
=========

## フォルダ説明

- Algorithms, DataStructuresフォルダ
- 大学編入対策にアルゴリズムやデータ構造の考え方ソースコードをメモ
- ProconChallengeBook
- プログラミングコンテストチャレンジブック第2版の問題

## アルゴリズム役立ち資料

- [実践・最強最速のアルゴリズム勉強会 第一回 講義資料](http://www.slideshare.net/chokudai/wap-atcoder1)
- [実践・最強最速のアルゴリズム勉強会 第ニ回 講義資料](http://www.slideshare.net/chokudai/wap-atcoder2)
- [アルゴリズムとデータ構造](http://www.codereading.com/algo_and_ds/)
- [ソートの計算量](http://lecture.ecc.u-tokyo.ac.jp/~yamaguch/cp1-6/complexity-sort.html)
- [AOJ 色々な言語で降順ソート](http://qiita.com/_meki/items/2254a5a467e02e051d2f)

## アルゴリズム勉強内容まとめ

#### データ構造

###### リスト
###### スタック
###### キュー
###### ヒープ

#### ソーティング

### ソーティング

###### バブルソート
###### 単純挿入法
###### 単純選択法
###### クイックソート
###### マージソート
###### ヒープソート
###### バケットソート

## ソーティングの分類

ソーティングの考え方には大きく「逐次添加法」「分割統治法」「データ構造の利用」の3つがある.

- 逐次添加法:整列済みの要素を1つずつ増やしていく.(例)バブルソート,単純選択法,単純挿入法
- 分割統治法:大きな問題を小さな部分問題に分割して,各問題ごとに求めた解を結合することによって,全体の解を求める.(例)クイックソート,マージソート
- データ構造の利用:ソートの効率を上げるためにデータ構造を利用する.(例)ヒープソート

## オーダ記法(O記法)

オーダは,アルゴリズムの評価に用いる計算量を表す方法の一つ.O(ビッグ・オー)という記号を使う.

たとえばデータ数nが2倍,3倍, ... と増加していった時に,実行時間が:math:`2^2, 3^2`倍と増加して行く場合は:math:`O(n^2)`であるという.

ここで大事なのはO記法では定数や計数を除外した上で,最も増加率の大きな項だけで評価するということ.
だから計算量を表す関数が:math:`f(n)=2^n+n^2`であっても:math:`n^2`より:math:`2^n`の方が増加率が大きいので,計算量は:math:`O(2^n)`となる.

計算量の評価に用いられている関数の大小関係も覚えておくと後々の説明時に楽になる.

```math
O(1) < O(\log{2}{n}) < O(n) < O(n \times \log{2}{n}) < O(n^2) < O(2^n) < O(n!)
```

一般に計算量っていうとアルゴリズムの実行時間を表す尺度で正確には時間計算量のことを指している.これに対し,アルゴリズムの実行に必要な領域の大きさを表すものを領域計算量という.

## 各ソーティングアルゴリズムの計算量の比較

編入試験ではおそらく計算によって解かないといけない。でも対して難しくないので暗記しておいて損はないと思う.

- クイックソート:平均計算量:math:`O(n\log{2}{n})`,最悪計算量:math:`O(n^2)`
- マージソート:計算量:math:`{O(n\log{2}{n})`
- ヒープソート:計算量:math:`{O(n\log{2}{n})`