タグ

algorithmに関するsyou6162のブックマーク (107)

  • 404 Blog Not Found:アルゴリズム百選 - 二分探索(binary search)

    2007年12月04日08:30 カテゴリアルゴリズム百選Math アルゴリズム百選 - 二分探索(binary search) 今回は二分探索を取り上げます。 検索:コンピューターの最もよくある利用法 「二分探索って何?」「ググレカス」と言われないためにこの記事は存在するのですが、Webの検索に限らず、「目的のデータを見つけて取り出す」というのは、およそコンピューターの利用法で最もポピュラーなものです。 配列:コンピューターがデータを扱う根的な方法 そのデータはコンピューターのなかでどう置かれているかというと、非常に単純です。デジタル化されたデータ=数値が一定間隔で並んでいるだけです。こういうデータ構造を、配列(array)といい、この数値一個一個のことを要素(element)と言います。 現代のコンピューターでは、最小要素はバイト(byte)と呼ばれています。このバイトの中には0と1

    404 Blog Not Found:アルゴリズム百選 - 二分探索(binary search)
  • algorithm - 最近点検索 : 404 Blog Not Found

    2009年04月28日23:30 カテゴリMathLightweight Languages algorithm - 最近点検索 後のデザートにちょうどよいサイズの問題。 二次元の値(x, y)をもつ集合P から任意の点p の近似点を検索するアルゴリズムを考えています 高速、低負荷で検索するにはどうしたらいいでしょうか? 条件は次の通りです .. - 人力検索はてな 条件は次の通りです 集合Pはあらかじめ、任意の順番でソートしておける 点pの近似点にする条件は、margin範囲内で一番近いものとするが、margin値はそのときどきで変わる まずは素直に答えを。 点集合は、あらかじめ原点からの距離順にソートしておく。 その集合を、検索したい点の原点からの距離を使って二分探索(binary search)する。 二分探索は exact match でなくてもいいので、この方法でOKです。O(

    algorithm - 最近点検索 : 404 Blog Not Found
  • スライド 1

    ゲノム情報科学研究教育機構講義 ネットワーク解析特論 ネットワーク計算の諸問題 渋谷 東京大学医科学研究所ヒトゲノム解析センター (兼)情報理工学系研究科コンピュータ科学専攻 tshibuya@ims.u-tokyo.ac.jp http://www.hgc.jp/~tshibuya 今日の内容 ネットワーク計算の諸問題 渋谷 ネットワークを扱った様々な情報科学的な問題 Google マルコフモデル 渋滞シミュレーション 遺伝子制御ネットワーク 遺伝子発見 強連結分解 最短路問題 トポロジカルソート DPより速いアラインメントの厳密解法 A*アルゴリズム、両方向ダイクストラ法 マルチプル・アラインメントの最適解 Google ネットワーク計算の諸問題 渋谷 有名なサーチエンジン 1998年、Larry Page と Sergey Brin が創業 膨大なページデータから的確な

  • <4D6963726F736F667420506F776572506F696E74202D208FEE95F18C9F8DF593C1985F20303789F196DA20368C8E313493FA814095B68E9A97F18FC68D8782C98AEE82C382AD915395B68C9F8DF532>

  • Succinct なトライの実験に用いたソースコード - やた@はてな日記

    いつものように,Google Code にアップロードしました.プロジェクトの名前は sumire-tries になっています.名前を sumire にした理由は,なんとなくです…. ドキュメントは準備中ですが,基的な使い方は後述します. Google Code Archive - Long-term storage for Google Code Project Hosting. 右のメニューにある Featured downloads からアーカイブをダウンロードして,よくある手順を踏めば動作確認できます. ./configure make make check ヘッダのみで構成されているため,make install でインストールしなくても,ヘッダを格納しているディレクトリ(include/)をコピーすれば使えます. トライを構築する手順は,以下のようになっています. 基礎となる

    Succinct なトライの実験に用いたソースコード - やた@はてな日記
  • http://chasen.org/~taku/blog/archives/2005/10/treehh_1.html

    syou6162
    syou6162 2009/10/31
    ほうほう
  • 連載:検索エンジンを作る|gihyo.jp … 技術評論社

    運営元のロゴ Copyright © 2007-2024 All Rights Reserved by Gijutsu-Hyoron Co., Ltd. ページ内容の全部あるいは一部を無断で利用することを禁止します⁠。個別にライセンスが設定されている記事等はそのライセンスに従います。

    連載:検索エンジンを作る|gihyo.jp … 技術評論社
  • ALGORITHM NOTE 長方形探索: 最大長方形の面積 Largest Rectangle

    n × n のマス目のそれぞれに 1 または 0 が記してあり、その中から 1 だけから成る最大の長方形の面積を求めて下さい。 これは前に考えた正方形探索の応用で、今回は最大の長方形を探します。この問題も正方形探索で用いたアルゴリズムを応用して動的計画法で解くことができますが、正方形探索ほど単純な式では解決できません。左上角から右下角に向かって個々の要素を計算していく過程で、既に計算された左と上の要素を利用していきますが、長方形探索の場合、W[i][j] の値はそこから左上方向に向かってできる正方形の辺の長さではなく、そこから左上方向に向かってできる全ての長方形の情報を記録する必要があります。このアルゴリズムの詳しい解説が、プログラム・プロムナードに掲載されています。このアルゴリズムは、現在の要素を求めるために重複を避けながら左と上の要素をマージしたりと、プログラムがやや複雑になります。

  • ALGORITHM NOTE デブンキー一家の大活躍

    問題 パソコン甲子園2008 08 n 個の都市がり、それらが m の橋で繋がっています。各橋の維持費(コスト)が決められています。どの都市にでも行くことができるように橋を残しつつ、橋の維持費の合計が最小になるように、いくつかの橋を壊したときの、維持費の合計を求めて下さい。 001 #include<iostream> 002 using namespace std; 003 #define REP(i, e) for ( int i = 0; i < e; i++ ) 004 #define MAX 100 005 static const int INFTY = (1<<21); 006 int G[MAX][MAX], n; 007 008 int prim(){ 009 int P[MAX], D[MAX]; 010 bool V[MAX]; 011 REP(i, n) { D[

  • ALGORITHM NOTE ヒストグラム中の最大の長方形の面積

    データの離散型分布を表すヒストグラム(柱状グラフ)は、長方形を共通の基線上に並べた多角形として描画されます。これらの長方形は同じ幅を持ちますが、異なる高さのものを含みます。ヒストグラムを表す多角形に含まれる最大の長方形の面積を求めて下さい。入力は各データに対応する長方形の高さの列に対応した n 個の要素からなる1次元配列とします。(source: ACM/ICPC University of Ulm Local Contest) 以下のように、2重ループによって長方形の範囲を選び、そこにできる最大の長方形の面積を計算して更新していけば、全体での最大の面積を求めることができます。これはO(n2)のアルゴリズムです。 001 int getRectangleAreaBF( int size, int buffer[] ){ 002 int maxv = 0; 003 for ( int i =

  • ALGORITHM NOTE 最大正方形の面積 正方形探索

    縦に n 行、横に n 列並べられた n × n のタイルがあります。いくつかのタイルには印(汚れ)が着いています。印のついていない(綺麗な)タイルだけから成るような最大の正方形の辺の長さを求めて下さい。各タイルの大きさは 1 × 1 メートルとします。 力任せのアルゴリズム タイルの数が小さければこの問題は以下に示すループの入れ子で解くことができます。 2重ループによって候補となる正方形の左上角(i, j)を決める ループによって(i,j)から右下方向にできる正方形の幅 width を決める 2重ループによって決められた範囲が正方形であるかチェックし、そうならば maxWidth を更新する 001 int size; 002 char G[MAX][MAX]; 003 004 int getLargestSquareBF(){ 005 int maxWidth = 0; 006 for

  • ALGORITHM NOTE 最長増加部分列 Longest Increasing Subsequence

    東西に並んだ高さの異なるnの木があります。あるキコリがこれらの木を、西から東の方向へ木の高さが小さい順に並ぶように、いくつかの木を切り倒すことにしました。木の数を最大にするにはどの木を切れ(残せ)ばようでしょうか? このような単純な(くだらない)問題でも、考えられる組み合わせを全て調べようとすると、それは各木を選ぶか選ばないかの組み合わせになるので、計算量はO(2n)となってしまいます。 この問題は、与えられた数列の最長増加部分列 Longest Increasing Subsequence (LIS) を求めることに帰着します。 最長増加部分列とは、与えられた数列 S S = a1, a2 , , , an の増加部分列 ( すべてのi, j (i < j)について ai < aj を満たす部分列 ) の中で長さが最大のものをいいます。 例えば、 S = 4 1 6 2 8 5 7 3

  • ALGORITHM NOTE 反復深化 Iterative Deepening

    単純な深さ優先探索では初期状態から最終状態までの最短経路を求めることは不可能でした。しかし、深さを制限した深さ優先探索(深さ制限探索)を繰り返すことによって最短経路を求めることができます。つまり深さの制限 d を増加させながら深さ制限探索を繰り返します。このアルゴリズムを反復深化といいます。 反復深化及び深さ制限探索では高速化を図るために探索空間(探索木)の枝を刈ることが重要になります。探索アルゴリズムでは、現在の状態 n から最終状態までの最短経路コスト h を見積もることができれば枝を刈ることができます。つまり、現在の状態の深さ g に「ここからあと最低でも h 回の状態変化は必要だろう」というコストh を加えた値が深さの制限 d を超えた場合、そこで探索を打ち切ることができます。h は見積もりであって正確な値である必要はありません。h の値が大きいほど探索の速度は上がりますが、大きく

  • ALGORITHM NOTE 幅優先探索 Breadth First Search

    幅優先探索はグラフにおける幅優先探索と同様に動作し(グラフのノードを状態とみなします)、幅広く状態変化を行います。つまり、現在の状態から可能な全ての状態変化を行い新しい状態を作ります。この探索をシステマティックに行うために、状態変化によってつくられた新しい状態をキューに追加し、探索を展開するためにキューの先頭の状態からさらに状態変化を繰り返します。一度生成した状態を再び作らないために、生成された状態を全て記録する必要があります。幅優先探索は、問題に解が存在すれば初期状態から最終状態までの最短の経路を求めます。 それでは、8パズルを幅優先探索で解いてみましょう。 プログラムの説明 以下のプログラムは、例えば 2 8 3 x 1 5 4 7 6 というような、'x' をスペースとみなしたパズルを読み込み、 ldruuldlu という、l = left, r = right, u = up, d

  • ALGORITHM NOTE Sum of Different Primes

    [問題] ACM/ICPC Asia Regional 2006 Yokohama: Problem D [難易度] ★★☆ [解説] 動的計画法(DP)で解けます。 ナップザック問題をDPで解く仕組みを応用します。 T[i][j][k] を 1 ~ i 番目の素数のうち k 個を用いて j を表す組み合わせの数 とすると、 T[i][j][k] = T[i-1][j][k] + T[i-1][j-primes[i]][k-1] となります(primes[i]は i 番目の素数を示す)。 サンプルプログラム 001 #include<iostream> 002 #include<vector> 003 using namespace std; 004 #define PMAX 187 005 #define NMAX 1120 006 #define KMAX 14 007 008 int

  • ALGORITHM NOTE Gap

    001 #include<iostream> 002 #include<stdio.h> 003 #include<queue> 004 #include<map> 005 using namespace std; 006 007 class Gap{ 008 public: 009 short buffer[4][8]; 010 short pos[50]; 011 short space[4]; 012 013 Gap(){} 014 015 bool solved(){ 016 for ( int i = 0; i < 4; i++ ){ 017 for ( int j = 1; j < 7; j++ ){ 018 if ( buffer[i][j] != (i+1)*10 + (j+1) ) return false; 019 } 020 } 021 return true; 02

  • ALGORITHM NOTE 連結成分 Connected Components

    001 #define MAX 1000 002 int size; 003 int adjMatrix[MAX][MAX]; // graph structure 004 bool visited[MAX]; 005 int group[MAX]; 006 007 void visit( int currentNode, int id ){ 008 visited[currentNode] = true; 009 group[currentNode] = id; 010 011 for ( int nextNode = 0; nextNode < size; nextNode++ ){ 012 if ( !adjMatrix[currentNode][nextNode] ) continue; 013 if ( !visited[nextNode] ){ 014 visit( nextN

  • ALGORITHM NOTE マージソート Merge Sort

    マージソートの流れの論理的な構造は、ツリー(木)となっていますが、実装するためにツリーのデータ構造を用いる必要はありません。しかし、データを配列で処理する場合、マージソートはその倍のメモリ空間を必要とすることが、マージソートの欠点でもあります。実装は以下のように非常にシンプルな構成となります。 void main(){ mergeSort( 配列全体 ); } void mergeSort( 部分配列 ){ if ( 部分配列の要素数が1以下 ) return; mergeSort( 部分配列の前半 ); mergeSort( 部分配列の後半 ); merge( 部分配列 ); } void merge( 部分配列 ){ すでにソートされている部分配列の前半と後半を昇順に統治(マージ)する. } マージソートのプログラムは、mergeSort と merge の2つの部分から構成されていま

  • ALGORITHM NOTE ナップザック問題 Knapsack Problem

    大きさ w と価値 v を持った品物が N 個あり、これらを大きさ W のナップザックに入れたいとします。このとき、大きさの合計が W を超えず、価値の合計が最大になるような品物の組み合わせを求めたい。これがナップザック問題です。各品物を「選択する」か「選択しない」かの組み合わせなので、厳密には0-1ナップザック問題ともいいます。(各品物が複数個ある場合は、0123ナップザック問題と呼ばれます) この問題を力任せで解こうとすれば、N 個の品物を「選択する」か「選択しないか」の全組み合わせを全て調べることになるので、計算効率は O(2N) となります。N が数十個でも、実用的な時間では計算できません。 品物の大きさ w、ナップザックの大きさ W がともに整数であれば、ナップザック問題は動的計画法により O (NW) の効率で厳密解を求めることができます。 C[i][w] が、大きさ w のナ

  • ALGORITHM NOTE Zigzag

    ACM-ICPC 2008 Aizu, Problem J: Zigzag 解説の通り Dijkstra で解いてみました。 与えられた点を通る2つの直線の組み合わせについて、交点を求め, その交点と入力された点の集合について TSP を解くような感じです。 状態は S[現在の点(入力された点のみ)][前にいた点][通った点の状態(入力された点のみ)] になります。 ただし、無駄な交点を作ってしまうとTLEになります。 コードは, Dijkstra の部分のみです。 void dijkstra(){ priority_queue<QState> PQ[5]; bool C[10][MAX][SMAX]; rep(i, nnode) rep(j, n) rep(k, (1<<nnode)) C[i][j][k]= false; rep(s, nnode) rep(i, P[s].size)