約 3,527,834 件
https://w.atwiki.jp/sevenlives/pages/354.html
配列 ゲーム木 ソート・アルゴリズム データ圧縮? 暗号化アルゴリズム? 検索アルゴリズム ヒューリスティクス 分散アルゴリズム 乱択アルゴリズム Luhnアルゴリズム O記法? B-Tree? ヒープソート? ダイクストラ法? バックトラック? モンテカルロ法? ラスベガス法? シャッフル?Fisher-Yates shuffle?
https://w.atwiki.jp/projecthikky/pages/114.html
さまざまなプログラミングしていく上でアルゴリズムやデータ構造の選択が大事になってくる場面があります このページでいくつかアルゴリズムやデータ構造を紹介できるといいと思います アルゴリズムやデータ構造が重要になる場面は 大量のデータを分類や分析や解析をしたいときやゲームAIを作りたいときなどがよくある事例だと思います 選択するデータ構造やアルゴリズムによって処理にかかる時間や必要なメモリ量などが違ってきます 作りたいプログラムに合わせて適切なアルゴリズムやデータ構造を選択できるようになるのが理想です そのために色々なアルゴリズムやデータ構造が存在するということを知るのが大事になります (名前や用途や性能だけでも把握しておくことが大事です) 競技プログラミングの場合は自分で実装しなければならない場面が多いですので実装法を知る必要がありますが それ以外の場面では誰かが実装した有償・無償のライブラリやコードを利用することになると思います アルゴリズムやデータ構造のリンク集 色んなアルゴリズムやデータ構造の実装例が載ってるサイト Spaghetti Source 旧 http //www.prefield.com/algorithm/ 新 https //github.com/spaghetti-source/algorithm アルゴリズムやデータ構造の概要等がまとめられている http //home.wakatabe.com/ryo/wiki/index.php?%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0 このwikiのページ一覧 ※各アルゴリズム/データ構造のリンク集のページになってます ※難易度の分類は編者の感覚で付けた適当なので不適切なものもあります ※編者募集中 名前 概要や用例や用途など 難易度(低) 総当り(ブルートフォース) その名の通り、全ての解の候補を調べる手法。全探索とも呼ぶ。 キュー(FIFO) 先入れ先出しのデータ構造。幅優先探索などに使われる。 スタック(LIFO) 後入れ先出しのデータ構造。深さ優先探索などに使われる。 両端キュー(deque) ハッシュテーブル 二分木 バブルソート 隣り合う2つの要素を比較してスワップを繰り返していくソートアルゴリズム。計算量はO(N^2)と遅いが直感的には分かりやすい。 マージソート ソートしたい配列を半分に区切り、それらを別々に再帰的にソートしてマージするアルゴリズム。計算量は比較ソートの理想値であるO(NlogN)。安定ソートでもある。 挿入ソート 選択ソート クイックソート バケットソート 幅優先探索(BFS) スタートからゴールまでの最短距離を計算するとか 深さ優先探索(DFS) スタートからゴールまでのルートを見つけ出すとか 二分探索 ソートされた配列から目的の値を探すときに、探索範囲を半分、半分、・・・と削っていくアルゴリズム。計算量はO(logN)と高速。探索以外にも最小値や最大値を求める問題にも応用できる。 累積和 配列のある区間の和を高速に求めたいというときに使われる。配列の先頭からi番目までの和を計算した配列を別に持っておくことで、ある区間の和がO(1)で求められるというテクニック。 しゃくとり法 最小二乗法 二分法 ニュートン法 ヒープ木 分割統治法 木の直径 木構造の2頂点間の距離で最も距離の長いペアを1つ見つけるアルゴリズム 難易度(中) 平衡二分木 赤黒木 平衡二分木の一種 AVL木 平衡二分木の一種 ワーシャルフロイド法(WF) グラフの全ての2点間の最短距離を求めたいときに使われるアルゴリズム。頂点数をNとすると計算量はO(N^3)。辺の重みが負であっても適用でき、負閉路があればそれを検出することも可能。 最小全域木 ダイクストラ法 グラフのある始点から全ての頂点への最短距離を求めたいときに使われるアルゴリズム。頂点数をN、辺の数をMとすると計算量はO((N+M)logN)。辺の重みが全て非負でないと適用できないことに注意。 素集合データ構造(UnionFind/DisjointSet/UF) 2つの集合を1つにまとめたり、ある2つの要素が同じ集合に属しているかを高速に判定することを可能にするデータ構造。Nを要素数とすると、各操作のならし計算量はO(A(N))となる。A(N)はアッカーマン関数の逆関数で増加速度が非常に遅く、実質O(1)と考えても問題は無い。 FenwickTree(BinaryIndexedTree/BIT) 部分的な値の更新を繰り返す必要のあるデータの累積和を高速取得できるデータ構造。値の更新、累積和の取得がどちらもO(logN)で出来る。セグメント木の機能制限版のようなものであるが、こちらのほうが定数倍速い、実装が軽いなどの長所がある。 動的計画法(DynamicProgramming/DP) 小さい部分問題の解を利用してより大きな部分問題の解を求めることを繰り返す手法。部分問題の解を記録しておくことと漸化式を用いることがポイント。非常に応用範囲が広く、競技プログラミングにおいても必須のテクニックである。代表的な問題としてナップサック問題がある。 線型計画法(LinearProgramming/LP) 貪欲法(GreedyAlgorithm/GA) 後のことは考えずにその時その時での最適行動を取っていく手法。探索範囲を大きく狭められるので計算量を劇的に改善することも出来るが、その貪欲法で正しい解答が得られるかは慎重に考える必要がある。正しい解が得られない貪欲法を嘘貪欲と言ったりする。 トライ木(TrieTree) セグメント木 トポロジカルソート 三分探索 難易度(高) k平均法 高速フーリエ変換(FFT) モンテカルロ法 A*サーチ(Aスターサーチ) タブーサーチ ビームサーチ 山登り法(HC) 焼きなまし法(SA) いもす法(imos法) chokudaiサーチ 内容が存在するページ FenwickTree(BinaryIndexedTree) ダイクストラ法 ワーシャルフロイド法(WF) 木の直径 素集合データ構造(UnionFind)
https://w.atwiki.jp/ookubo/pages/33.html
アルゴリズム C/C++のアルゴリズム1- C/C++のアルゴリズム2- 物理系のアルゴリズム- バイナリの読み書き-
https://w.atwiki.jp/omoshiro2ch/pages/38.html
アルゴリズム 十問目 アルゴリズム1 ○ アルゴリズム2 --
https://w.atwiki.jp/charolles/pages/24.html
アルゴリズム 画像圧縮アルゴリズム
https://w.atwiki.jp/shomen-study7/pages/741.html
アルゴリズム (algorithm) ある方法に基づいて行えば、必ず問題解決に辿り着くという、情報処理における処理手順のこと。 問題の解決が保障されてはいるが、多くの時間と労力を要する場合いが多いことが欠点である。 これに対して、蓋然性(可能性)、類似性に基づき、必ずしも成功するとは限らないが、成功すればかなりの時間と労力を節約することができるような手続きを、ヒューリスティクス(heuristics)という。 各手続きの例としては、以下のようなものがある。 EX) 電話帳を使用して自分の親戚を見つけたい場合。 アルゴリズム的手続き : 電話帳の始めから一人ずつ電話をかけていく。 ヒューリスティクス的手続き : 自分と同じ姓の人から順に電話をかけていく。 saya
https://w.atwiki.jp/masuhara/pages/52.html
再帰とは 世界最古のアルゴリズム・ユークリッド互除法で最大公約数① 世界最古のアルゴリズム・ユークリッド互除法で最大公約数② 世界最古のアルゴリズム・ユークリッド互除法で最大公約数③ ゲーマーでなくても知っておきたいアルゴリズム集 ゲームのアルゴリズム40 迷路のアルゴリズム マリオのジャンプアルゴリズム
https://w.atwiki.jp/t-style/pages/13.html
ここを編集 EMアルゴリズム(Expectation-Maximization Algorithm) 確率モデルが観測できない変数(潜在変数/隠れ変数)に依存する場合に最尤法を実施するためのアルゴリズム。非常に多くの応用に使え、変分ベイズ法などの基礎を成すのでとっても大事なアルゴリズム。 推定の流れ このアルゴリズムでは、現在のパラメータ()と観測変数()から得られる情報を使って、潜在変数()の条件付き確率()を求めるステップ(E-Step)と、観測変数の事後確率の期待値を最大化するフェーズ(M-Step)の二段階の処理を繰り返しながらパラメータを最適化する。 つまり、尤度関数()の最大化を一発で計算したいところなのだが、それは難しいので、今のを使って計算されるを利用して、尤度関数の期待値()の最大化という問題に置き換えている。実際には、最後の式を2つ目のを構成する各変数について偏微分して0になる値を探すなどを行って更新することになる。 詳細な定式化(間違ってるかも) パラメータを、観測変数を、潜在変数をとする。 目的は、観測変数のパラメータに対する確率の最大化。ところが、潜在変数があるのでの周辺化で置き換えて話を進められるようにする。そこでベイズの公式による式変形を行う。 さて、ここで天下りながら分布を導入する。これは潜在変数の事後分布の近似分布である。式変形のミソは、この分布との間の違い(距離)が現れるように前式を変形していくことである。そこで、まず右辺の分子分母をで割る。 次に両辺に対数をとる。 さらに両辺にをかけてに関し周辺化を行う。 左辺において、はに関係せず、は1となる。 右辺の第一項を、第二項をとかくと、下記式を得ることができる。 この式において最適化で変更できるのはとである。EMアルゴリズムは、この2つの視点で交互に最大化する。 まずEステップでは、は0以上なので、を最小化することでを最大化する。KL距離の定義よりはのとき最小化となる。すなわち、を固定しにを設定すればよい。 次いでMステップでは、を固定しに関して最大化する。すなわち、下記式をに関して最大化する。ここで、Eステップ時点で利用したの値は、として固定されている。 上述において、はの下界をなしており、Eステップではこの下界を最大化するを手に入れている。一方、Mステップでは、がに関して最大化されるわけだが、このとき新しいを使ったと今までのとの間に新たな違い(距離)が生まれる。そのため、EステップとMステップを繰り返すことで徐々にを最大化していく必要がある。 実装例 言語 Python 2.6 + scipy + matplotlib 問題設定 2つの正規分布からなる2次元の混合正規分布に対して平均、分散、負担率を推定する。 詳細はソース参照。 ソース Main.py EM.py 結果 コンソール最後の部分 29 [ 0 ] Mu= [[ 21.05175707] [ 21.65353366]] Sigma= [[ 95.11897414 9.67571604] [ 9.67571604 116.52378045]] Pi= 0.674809728052 [ 1 ] Mu= [[-14.92553657] [-10.79587385]] Sigma= [[ 137.40967457 -2.5813963 ] [ -2.5813963 95.53296063]] Pi= 0.325190271948 グラフ 補足 この例ではうまくいくが、もとの正規分布の分散が大きすぎると一つの正規分布でほとんどのデータを説明し、もう一つの正規分布がごくわずか(1点)のデータを説明しようとしてしまう。このあたりは、分散の監視などが必要。 また、そもそもの収束判定には尤度関数の値の変化率を見るのが一般的。
https://w.atwiki.jp/akitaicpc/pages/87.html
ソートアルゴリズム ソート(sort)とは、データの集合を一定の規則に従って並べることのことです。日本語では整列(せいれつ)といいます。 単にソートというと、値を小さい順に並べる昇順(しょうじゅん、ascending order)を指すことが多いみたいです。 その反対に値を大きい順から並べることを降順(こうじゅん、descending order)といいます。 C++では algorithm ヘッダをインクルードすることでsort関数を使えるので、便利です。 つまりソートのアルゴリズムを知らなくてもソートできるということです。 しかし、ソートのアルゴリズムを知りたい人もいると思うので、 各ソートのアルゴリズムとコードを載せておきます。 -説明 例えばvector int vc;に対してvcの要素のすべてを昇順にソートしたいなら sort( vc.begin() , vc.end() ); と書くだけでソートが完了します。 数値だけでなく、文字列(std string)であれば辞書順にソートされます。 次がソートの例です。 #include iostream #include vector #include algorithm using namespace std; int main(){ int n,a; vector int vc; cin n; for(int i=0 ; i n ; i++ ){ cin a; vc.push_back( a ); } sort( vc.begin() , vc.end() ); cout "ソートしました" endl; for(int i=0 ; i vc.size() ; i++ ){ cout "a[" i "] " a[i] endl; } } 比較的有名なソートアルゴリズム バブルソート? 挿入ソート? 選択ソート? クイックソート? マージソート? マイナーなソートアルゴリズム? ボゴソート? ボゾソート? シェーカーソート? コムソート? ノームソート? シェルソート? 2分木ソート? ライブラリソート? ヒープソート? イントロソート? バケットソート? 鳩の巣ソート? 分布数えソート? 逆写像ソート? ...
https://w.atwiki.jp/phktech_tips/pages/23.html
線形補間とか円弧補間駆動についての備忘録 線形補間の行い方 DDAもといブレゼンハムのアルゴリズムを利用する http //dencha.ojaru.jp/programs_07/pg_graphic_07.html 四捨五入させた方が直線補間っぽくなる. (0,0)から(10,1)までを移動させた場合の軌跡 四捨五入していない場合は最後の移動でyが動く. 四捨五入の場合はxの中間でyが動く ソースコードのリンク⇒ www34.atwiki.jp/phktech_tips 直線補間ルーチンの拡張 上で示したソースはdx dyでかつdx,dyが共に正でないと正常に動かない.任意の条件で直線補間が可能になるようにルーチンを拡張する. ポイント 移動量が最大の軸を主軸,それ以外の軸を従軸とする.主軸をインクリメントする度に従軸もインクリメントするかの判定を行う