hotchpotch/wikipedia-multilingual-ir-pairs huggingface dataset:
共有メモリ ソフトウェアによる共有メモリ
共有メモリによるIPCは、例えばUNIX上のXサーバとアプリケーションの間で画像を転送する場合や、WindowsのCOMライブラリで CoMarshalInterThreadInterfaceInStream() 関数が返す IStream オブジェクトの内部で使われている。一般的に共有メモリが使われるアプリケーションとしてOracleなどのデータベースがある。Unix版OracleではSGAと呼ばれる共有メモリ空間にデータベースバッファキャッシュがおかれて複数のプロセスからアクセスさせて性能の向上を図っている。
動的ライブラリは一度メモリ上に置かれると、それが複数のプロセスにマッピングされ、プロセスごとにカスタマイズされるページ群（シンボル解決に違いが生じる部分）だけが複製され、通常コピーオンライトという機構で、そのページに書き込もうとしたときにコピーが行われる。
POSIX には共有メモリの標準化APIとして POSIX Shared Memory がある。これは、sys/mman.h にある shm_open という関数を使う。POSIXのプロセス間通信（POSIX:XSI拡張の一部）には共有メモリ関数として shmat、shmctl、shmdt が含まれている。
共有メモリ ソフトウェアによる共有メモリ
shm_open で生成された共有メモリは永続的であり、プロセスが明示的に削除しない限りシステム内に存在し続ける。ただしこれには欠点もあり、共有メモリを削除すべきプロセスがその前に異常終了したとき、その共有メモリがシステムのシャットダウンまで残存し続けることになる。そのような問題を避けるには、mmapを使って共有メモリを作成すればよい。2つの通信しあうプロセスが同じ名前の一時ファイルをオープンし、それに対してmmapすることでファイルをメモリにマッピングする。結果として、メモリマップされたファイル（メモリマップトファイル）への変更はもう一方のプロセスからも同時に観測できる。この技法の利点は、両方のプロセスが終了したとき、OSが自動的にファイルをクローズし、共有メモリを削除する点である。
Linuxカーネル 2.6 では、RAMディスク形式の共有メモリとして /dev/shm が導入された。より正確に言えば、誰でも書き込めるメモリ内のディレクトリであり、その容量の上限は /etc/default/tmpfs で指定できる。/dev/shm 機能サポートはカーネルの設定ファイルで指定でき、デフォルトでは無効となっている。なお、RedHat や Debian ベースのディストリビューションではデフォルトで有効になっている。
共有メモリ ソフトウェアによる共有メモリ
Android では Linux カーネルを使用しているが、IPC 関係が一部無効になっており、独自に開発した（現在はLinuxカーネルに入っている）ashmem (anonymous shared memory) を使用している。メモリが不足したときにカーネルが解放する仕組みがあり、解放されないようにするには、ashmem_pin_region() を使い指定する。
Microsoft Windowsでは、Win32 APIのCreateFileMapping()関数を使って共有メモリ（メモリマップトファイル）を作成することができる。クライアント側プロセスはOpenFileMapping()関数を使って、ホスト側プロセスにて作成済みの共有メモリのハンドルを取得することができる。共有メモリを各プロセスのアドレス空間にマッピングするにはMapViewOfFile()関数を使う。
なおWindows APIには、CreateSharedMemory() など “-SharedMemory” の名前を持つ関数があるが、これはセキュリティ関連のAPIであり、メモリ共有のためのAPIではない。これをメモリ共有のために使用すれば、リソースを大量に消費しシステムリソースを使い果たす可能性がある。
一部のC++ライブラリは、共有メモリ機能への移植性の高いオブジェクト指向的なアクセスを提供している。例えば、Boost C++ライブラリには Boost.Interprocess があり、POCO C++ Libraries には Poco::SharedMemory、Qt には QSharedMemory クラスがある。
PHP では POSIX で定義している関数群とよく似た共有メモリ用APIが存在する。
.NET Frameworkはバージョン4でSystem.IO.MemoryMappedFiles.MemoryMappedFileクラスを標準化した。.NETあるいはXamarin (Mono) を通じて、Windows以外の他のプラットフォームでも利用できる。
統計図表
統計図表（とうけいずひょう）は、複数の統計データの整理・視覚化・分析・解析などに用いられるグラフおよび表の総称である。ここで、グラフとは「図形を用いて視覚的に、複数の数量・標本資料の関係などを特徴付けたもの」を指す。この意味においてのグラフはしばしば「統計グラフ」と呼ばれる。
統計図表は、統計データの整理・分析・検定などの過程で用いられる。統計図表を駆使することで
を視覚的に理解できる。
統計図表 概要
統計図表を適切に活用すれば
など、現状把握や客観的判断を行ううえで大きな手助けとなる。統計図表を用いて、統計データの傾向などを把握することを「統計データの解釈」あるいは「資料解釈」という。
どんなときにどんなグラフを用いるのがよいのだろうか？研究やそれに準じる調査活動において統計グラフを作成する必要がある局面は
など様々な状況がありえるが、どのような場合においても、
がなければ統計グラフの作成が不可能である。これについては「統計図表を作る前に」で述べる。
統計グラフの作成は方眼紙などを用いるのが基本だが、小中学校の教育の現場を除けば、最近ではExcelなどの表計算ソフト、場合によってはOriginやカレイダグラフなどの統計ソフトを用いるほうが多いと思われる。
統計図表 統計図表を作る前に
統計図表の作成は、実験・社会調査・マーケティングなどの調査活動におけるデータの整理・分析の一環として行われる。統計グラフの作成を、調査活動自体から切り離して考えるのは難しい。何を分析するのか、何を訴えるのかによって「適切なグラフは何か」が変わってくる。一般的な見地から「正しい統計グラフを作成するための目安」（一般的な精神のほか、「棒グラフを用いるのが適切な側面」のような事例分析）を示すこと自体は可能だが、馬鹿の一つ覚えは通用しない（データマイニング参照）。それぞれの場合に応じて、工夫をこらすだけの力をもつのが必要で、そのためにはよいといわれる論文などに掲載されている統計図表を、その論旨と照らし合わせながら吟味して、目を肥やす必要がある。
統計図表 統計図表を作る前に
また、統計データそのものがない状態で、あたかもそれがあるように偽ってグラフを作成して発表しまっては、少数の例外を除き捏造である。あくまで統計グラフの作成は、データの加工手段の一つである。「目的や着眼点に沿って散在する情報を収集する」という過程なしには成立し得ない。さらに言えば、グラフ作成の前に、データ自体に何らかの統計処理を加える場合がある。データの取得・処理の妥当性については、グラフの選択やスケールなどの設定以前の問題だが、この段階で問題がある場合には、グラフ自体の価値はなくなる。ただし、データの取得・処理の妥当性についても、統計学特に実験計画法などの体系的な学問が存在するが、安易に可否を決められる問題ではない。
先にも述べたように、グラフを作成する上では、
を明確にしておく必要がある。
たとえば「ここに全国の小学生それぞれの身長・体重・学年・学校を記したデータがあります。さぁ統計グラフを作ってください」といわれたとして、データとしては膨大であるにしても、これだけの“情報”では「どのようなグラフをどのように作成するのが適切か」を決めることはできない。つまり、
などが定まらない（「統計グラフの種類と、グラフ選択の目安」参照）。たとえば
のように、同じデータを用いたとしても何を議論するのかによって適切なグラフは異なる。同じ「身長のバラつき」が見たいと言った場合でも
統計図表 統計図表を作る前に
のように、スケールの選択や場合によってはグラフの選択さえ変わってくる。無論、複数の種類のグラフを選択し得る場合もある。なお、目的が明確になったとしても、どのような問題を論じるのにはどのようなグラフがよいのかについて知らねば、どうにもならないが、これについては後述する。
グラフ作成の下準備の過程は、概ね下記のとおりである。
より一般に、グラフを作成するという問題は「『主張すべき事柄』を論証するための素材をどのような素材を集め、それをどのように配置するか」という問題の一部である。統計グラフの作成までの具体的な手順は、人それぞれで状況次第ではあるが、どのような場合においても「どのようなデータからどのような知見を得ようとするのか」がある程度定まらなければ作成できない。そのため統計グラフ作成の手順は、研究の手順とほぼ同じで、概ね
「目的や着眼点に沿って散在する情報を集約した後、それを整理・分析し、特徴・傾向を見出す」という過程を経る。当然の話だが、これらの各段階が適切に行われていることが、グラフ自体の適切・不適切を決める。
統計図表 統計グラフの種類と、グラフ選択の目安
統計グラフの分類は、人によって様々だが、よく使われるものから順に
などがある。これらそれぞれの説明は、それぞれの項目に委ねる。
統計グラフ選択の目安を以下に示す。
統計図表 実証的な研究分野における統計図表の活用
自然科学、社会科学、人文科学を問わず、統計を根拠とした実証性が求められる研究分野では、データの整理・分析の一環として、統計図表を作成する局面が多数ある。具体的には、
など様々な状況がありえる。
そして、いずれの分野においても、
といった場面が挙げられる。
変量同士の相関を議論することが主となる場合には、実際に用いられるグラフのほとんどが散布図である。そのほか等高線図や2次元分布図等の広い意味でのカラーグラフ（2D・3D）、棒グラフである。棒グラフはヒストグラムの提示に用いられるのがほとんどである。3Dグラフは、正しく使えば値の3次元的な分布を正確かつ直感的に伝えることができるため、特に最近では、権威ある査読つき論文においてもよく使われている。箇条書きにすると、以下がよく使われる。
統計処理に際し、本来的に「データは連続的な量として取得されているはず」という暗黙の前提があり、物理学・化学・工学・経済学・心理学問わず「変量同士の相関」を見るのが主な目的であるため、理想的には関数グラフのようなものを得たいという考えが暗にある。そのため圧倒的大多数において散布図を用いて
統計図表 実証的な研究分野における統計図表の活用
という処理が行われる。作成される散布図は、少数のデータから全体像を推測する場合には、「実際のデータの測定値」をそのまま散布図上に書き込むことが多い。データのラベルが離散的で、かつデータの量が充分多数で、そのデータの分布が正規分布に従っている場合には、ラベルごとの平均値のみをプロットし、それに適切なエラーバーをつける方法で作成されることが多い。
コンピュータ技術の進展により、統計グラフと画像（写真）の区別が曖昧になってきているという傾向がある。デジタル化された画像は空間座標・色の2種類の系列からなる情報の相関関係を2次元的あるいは3次元的に示したある種のカラーグラフの一種でしかなく、実際カラーグラフとして作成された等高線図などと解像度や、数字の羅列としてのデータ自体のみからでは区別がつかない。
初等教育の過程で重視される折れ線グラフは、ロードマップなどの未来技術予測などには多用されるものの、
などの理由から、ほとんどの場合は散布図にとってかわられている。
統計図表 実証的な研究分野における統計図表の活用
データのないグラフが描かれる場合もある。例えばある考えを主張する場合、それを説明するために、言葉で行うのが普通であるが、おそらくデータがあればこうなる、という形でグラフが活用されることがある。
例えば島嶼生態学における種数平衡説は、海洋島における生物の種数を島へ新たに入植する種数と島で絶滅する種数の間の平衡によって決定されると論ずるが、前者については大陸からの距離が遠くなるほど低くなる、また後者は島が小さいほど高くなるということは容易に想像できる。これをグラフ化すれば、両者の曲線が中程の特定の点で交差し、そこがその島の種数の平衡点にあたることになるだろうことが容易に理解できる。この場合、実際にその曲線がどのような形であるかは実際の調査が必要であろうが、いずれにせよ右上がり、右下がりであれば議論が成立するので、グラフを作成することは虚偽にならない範囲でそれにわかりやすさをもたらす効果がある。
統計図表 学校教育等における統計図表に関する指導
最近では統計グラフの作成・解釈はノート作成、プレゼンテーション技術、文章技術などと並び、調査活動を行ううえで必要なアカデミックスキルの一つだと考えられるようになってきた。しかし、統計グラフの作成・解釈に関する系統だった指導は、あまりおこなわれていない。
小学校における算数の時間では棒グラフや折れ線グラフ､ドットプロットの扱いを習い、中学校の数学では、単元「資料の整理」の中でヒストグラムや箱ひげ図について学習する。また､高等学校の数学の教科書には「統計」の項目があり、そこでも簡単に触れられる。また、小中高を通じて、地理の時間には、社会統計や等高線の扱いを白地図などを用いて学ぶ。小中高の理科の時間にも「実験データの整理」などという意味合いで教えられることがある。大学では、学生実験などにおいて実験ノート指導などと平行して指導される。
公務員試験などでは「資料解釈」という科目として出題される。システムアドミニストレータ試験においても「状況に応じた適切なグラフ選択」の問題が出題される。また、品質管理などの現場で教育されることがあり、品質管理関係の教材には、グラフの選択などに対して詳しい検討を行っているものがある。
木 (数学)
数学、特にグラフ理論の分野における木（き、英: tree）とは、連結で閉路を持たない(無向)グラフである。有向グラフについての木（有向木）についても論じられるが、当記事では専ら無向木を扱う（有向木については節にまとめた）。
閉路を持たない（連結であるとは限らない）グラフを森（もり、英: forest）という。木は明らかに森である。あるいは、森を一般的な場合とし、連結な森を木という、とすることもある。
木 (数学) 特徴づけ
n 個の点からなるグラフ T について次は同値である。
木 (数学) 性質
木 T には、以下のような性質がある。
上の定理から、木には必ず端末点があり、その端末点を除去すると位数の一つ小さい木が得られる。逆に言えば、位数 n の木は、位数 n − 1 の木に一つの新しい点と、これに接続する一本の新しい辺を加えて得られる。
木 (数学) 根つき木
あるノードを選んで、それを一番「上」にあると考えると、そのノードを基準として2つのノードに上下の関係を考えることが出来る（すべてのノードの組み合わせについて定義されるとは限らない）。このとき、その一番上のノードを根（ね、英: root）という。根を持つ木を単なる木と区別して根付き木という。
根つき木に関する用語は、それを家系図に見たてたものが多く使われる。
また、根つき木に関する用語として、他に以下のようなものがある。
木 (数学) n分木
n を自然数とする。葉ではない各点に対しその点の子の数が常に n であるような木をn分木(nぶんぎ; n-ary tree)という。特に二分木はいくつかのアルゴリズムと密接に関わるデータ構造である（ただし大抵は次で述べる有向木による二分木）。
木 (数学) 有向木
一般に、無向木は任意の点を根とみなすことができる。それに対し有向木は、根である点をただ1つだけ持つ。辺の向きとして、根から葉に向かっている場合と、葉から根に向かっている場合とがある。混在はできない（混在してしまうと閉路ができてしまう）。
閉路を持たない任意の有向グラフは有向非巡回グラフ（Directed Acyclic Graph、DAG）である。有向木は連結な有向非巡回グラフでもあるが、連結な有向非巡回グラフが必ずしも有向木とは限らない（DAGでは子孫あるいは親の共有がある場合がある。そうするとそれは木ではない）。
グラフ理論
グラフ理論（グラフりろん、英: Graph theory）は、ノード（節点・頂点、点）の集合とエッジ（枝・辺、線）の集合で構成されるグラフに関する数学の理論である。
グラフ（データ構造）などの応用がある。
グラフ理論 概要
グラフによって、様々なものの関連を表すことができる。
例えば、鉄道や路線バス等の路線図を考える際には、駅（節点）がどのように路線（辺）で結ばれているかが問題となる一方、線路が具体的にどのような曲線を描いているかは本質的な問題とならないことが多い。
したがって、路線図では駅間の距離や微妙な配置、路線の形状などがしばしば実際の地理上とは異なって描かれている。つまり、路線図の利用者にとっては、駅と駅の「つながり方」が主に重要な情報なのである。
このように、「つながり方」に着目して抽象化された「点とそれらをむすぶ線」の概念がグラフであり、グラフがもつ様々な性質を探求するのがグラフ理論である。
つながり方だけではなく「どちらからどちらにつながっているか」をも問題にする場合、エッジに矢印をつける。このようなグラフを有向グラフ、または、ダイグラフという。矢印のないグラフは、無向グラフという。
グラフを表現するのに、図ではなく、隣接行列を用いることがある。無向グラフの隣接行列は、対称行列になる。例えば、上のグラフは、次の隣接行列で表現できる。
日常的な問題や工学的問題の多くをグラフとして考えることができる。
グラフ理論 起源
グラフ理論は、1736年に「ケーニヒスベルクの問題」と呼ばれるパズルに対してオイラーが解法を示したのが起源のひとつとされる。この問題は、一筆書きと深く関連している。
グラフ理論 形式的な定義
集合 V, E と、E の元（げん、要素）に、二つの V を元の対で対応させる写像
の三つ組
を有向グラフという。V の元を G の頂点またはノード、E の元を G の辺または弧と呼ぶ。f(e) = (v,v) となる e ∈ E はループに対応し、f(a) = f(b) となる a, b ∈ E は多重辺に対応する。
𝔓(V) を V の冪集合とする。E の元に V の 部分集合を対応させる写像
があって、E の任意の元 e について、e の像 g(e) の濃度が1または2であるとき、三つ組
を無向グラフという。 V の元を G の頂点、E の元を G の辺と呼ぶ。g(e) の濃度が1となる e ∈ E はループに対応し、f(a) = f(b) となる a, b ∈ E は多重辺に対応する。
単純グラフに限って言えば、E を最初からある集合の部分集合と考え、写像を用いずにグラフを定義することもできる：有向グラフでは、E を V × V の部分集合、無向グラフでは、E を 𝔓(V) の部分集合で、2つの元の集合だけからなるものとすればよい。
グラフ理論 用語
以下では単にグラフといった時には無向グラフを指す。
頂点の集合は V、辺の集合は E で表す。グラフ G が先に与えられている場合には、頂点集合を V(G)、辺集合を E(G) と表すこともある。
数学以外の分野では、頂点を節点、辺を枝と呼ぶことが多い。辺を弧やリンクと呼ぶこともある。
グラフの辺に重み（コスト）が付いているグラフを、重み付きグラフと呼ぶ。乗換案内図の場合、駅間の所要時間が「重み」にあたる。重み付きグラフはネットワークとも呼ばれる（フローネットワーク, ベイジアンネットワーク, ニューラルネットワークなど）。
辺 e の両端の点を端点といい、端点は辺 e に接合（または接続）しているという。また、辺と辺がある頂点を共有しているとき、その辺どうしは隣接しているという。
2頂点間（隣接している必要はない）を経由する辺数を長さと呼び、特に最短経路における辺数を距離と呼ぶ。グラフ G の最大頂点間距離を直径と呼び、diam(G) と表す。
ある辺の両端点が等しいとき、ループ（自己ループ）という。また、2頂点間に複数の辺があるとき、多重辺という。ループも多重辺も含まないグラフのことを単純グラフといい、ループや多重辺を含むグラフのことを多重グラフという。
グラフ理論 用語
2つのグラフ G と G' について、G' の頂点集合と辺集合が共に G の頂点集合と辺集合の部分集合になっているとき、G' は G の部分グラフである、または G は G' の拡大グラフであるといい、G' ⊂ G と表す。特に、G と G' の頂点集合が等しいとき、G' は G の全域部分グラフであるという。また、G の頂点集合 V の部分集合 U を取り出して、両端点が U に属する全ての辺を辺集合とする G の部分グラフ G[U] を、誘導部分グラフという。グラフ G からある辺 e を取り除き、その辺の両端点を一つの頂点にまとめることを（辺の）縮約といい、縮約の結果得られるグラフを G/e と表す。
なお、誘導部分グラフの「誘導」はinducedの訳語である。induceの訳としてはこの「誘導する」の他に「生成する」がある。このため、誘導部分グラフのことを生成部分グラフということもある。一方、生成部分グラフは全域部分グラフのことを指すこともある。このため、生成部分グラフという語を使う際は、混乱がないか気を付ける必要がある。
グラフ理論 用語
頂点 v に接続する枝の数を次数といい、d(v) で表す。有向グラフにおいては、v に入ってくる辺数のことを入次数、v から出て行く辺数のことを出次数という。すべての頂点が同数の隣接点、つまり次数をもつグラフを正則グラフと呼ぶ。任意の頂点 v について、d(v) = k が成り立つとき、k-正則という。k-正則なグラフのことを k-正則グラフという。グラフ G が持つ頂点の次数の最小値を δ(G)、最大値を Δ(G) で表す。また、次数 0 の頂点のことを孤立点という。
隣接している頂点同士をたどった v0, e0, v1, e1, ... , en−1, vn の系列を長さ n の歩道（鎖・ウォーク）という。辺の重複を許さない歩道を路（小径・トレイル）という。頂点の重複を許さない場合、つまり、両端の2頂点の次数が1、それ以外のすべての頂点の次数が2であるグラフを、道（パス）、開いた歩道をパスという場合は単純パスという。また、始点と終点が同じ路のことを閉路（回路・循環 ・サーキット、サイクル）、始点と終点が同じ道（つまり e1, e2, ... , en, e1 という路で ei が相異なるもの）のことを閉道（サイクル）という。
任意の 2 頂点間に枝があるグラフのことを完全グラフ（完備グラフ）という。n 頂点の完全グラフは、Kn で表す。K3 は三角形と呼ばれる。また、完全グラフになる誘導部分グラフのことをクリークという。大きさ（サイズ） n のクリークを含むグラフは「n-クリークである」という。辺をもつグラフは必ず2頂点の完全グラフを含むので 2-クリークである。また n-クリークであって、直径が n 未満となるグラフを n-クランという。
グラフ理論 応用
グラフは物理学的、生物学的、社会的、および情報システムにおける多くの種類の関係と過程をモデル化するために使うことができる。多くの現実的問題はグラフによって表すことができる。現実世界のシステムへの応用を強調する時には、「ネットワーク」という用語がグラフを意味するために定義されることがある。このグラフでは、属性（例えば名前）が頂点および辺と関連付けられる。現実世界のシステムをネットワークとして表現し理解する主題はネットワーク科学と呼ばれる。
グラフ理論 応用
計算機科学において、グラフはコミュニケーション、データ編成、計算装置、計算の流れ等のネットワークを表すために使われる。例えば、ウェブサイトのリンク構造は有向グラフとして表すことができる。ここでは、頂点がウェブページを表し、有向辺があるページから別のページへのリンクを表す。同様のアプローチを、ソーシャルメディア、旅行、生物学、コンピュータチップ設計、神経変性疾患の進行のマッピング、そしてその他多くの分野における課題について取ることができる。したがって、グラフを取り扱うためのアルゴリズムの開発が計算機科学における主要な興味である。グラフの変換はグラフ書換え系によってしばしば定式化され、表現される。グラフ変換系と相補的なグラフの規則に基づくメモリー内操作に注目したシステムが、グラフ構造を持つデータのトランザクションセーフで永続的な格納と問い合わせに対応したグラフデータベースである。
数値計算の分野では、疎行列を係数とする連立1次方程式を消去法により計算して解く際に、行列の非零構造をグラフと対応づけて消去の順序をうまく選ぶことで、消去法計算の過程で発生する非零要素の数をなるべく抑える方法などが多く研究されてきた。
グラフ理論 応用
様々な形式のグラフ理論的手法は言語学において特に有用であることが証明されている。これは、自然言語がしばしば離散構造へとよく適しているためである。伝統的に、統語論と合成意味論は木構造に従い、それらの表現力は、階層的グラフによってモデル化される構成性の原理に密接に関係する。主辞駆動句構造文法といったより現代的な手法は型付き素性構造（これは有向非巡回グラフである）を用いて自然言語の構文をモデル化する。語彙意味論内、特に計算機へ応用としては、単語の意味のモデル化は、与えられた単語が関連する単語の観点から理解される時により容易である。したがって意味ネットワークは計算言語学において重要である。今で、哲学（例えば、格子グラフを用いる最適性理論）や形態論（例えば有限状態トランスデューサを用いる有限状態形態論）におけるその他の手法は、グラフとしての言語の解析において一般的である。実際、この数学の分野の言語学への有用性は、TextGraphs、WordNetやVerbNetといった様々な "Net" プロジェクトのような組織を生んできた。
グラフ理論 応用
グラフ理論は化学および物理学において分子を研究するためにも使われる。凝縮系物理学では、シミュレーションした複雑な原子構造の3次元構造は、原子のトポロジーに関連したグラフ理論的性質に関する統計量を集めることによって定量的に研究することができる。また、ファインマンの計算のグラフと規則は、理解したい実験的数字と密接に関係した形式で量子場理論を要約する。化学では、グラフは分子についての自然な模型を作り、ここでは頂点が原子、辺が結合を表わす。このアプローチは分子構造の計算処理（分子エディタからデータベース探索まで）において特に使われる。統計物理学では、グラフは系の相互作用している部位間の局所的つながりや、こういった系における物理的過程のダイナミクスを表わすことができる。同様に、計算論的神経科学では、グラフは様々な認知過程を生じさせるために相互作用する脳領域間の機能的結合を表わすために使うことができる。ここでは、頂点が脳の異なる領域を表わし、辺がそれらの領域間の結合を表わす。グラフ理論は電気回路網の電気的モデリングにおいて重要な役割を果たす。ここで、重みはネットワーク構造の電気的性質を得るために有線部分の抵抗と関連付けられる。グラフは多孔質材料のミクロスケールチャネルを表わすらために使うこともできる。ここでは、頂点が孔を表わし、辺が孔間をつなぐより小さなチャネルを表わす。化学グラフ理論は分子をモデル化する手段として分子グラフを使用する。
グラフ理論 応用
グラフ理論は社会学においても、例えば、特に社会ネットワーク分析ソフトウェアを使って俳優の名声を見積ったり、うわさの広がりを調査したりする手段として広く使われている。社会ネットワークの傘の下に、多くの異なる種類のグラフがある。知り合い関係グラフと友情関係グラフは人々が知り合いかどうかを記述する。影響グラフは特定の人々が他者の振る舞いに影響するかどうかをモデル化する。最後に、協調グラフは2人の人物が、映画で一緒に演技するといったある特定のやり方で協力するかどうかをモデル化する。
同じく、グラフ理論は生物学および保全の取り組みにおいて有用である。ここでは、頂点が特定の種が存在（または生息）する地域を表わすことができ、辺は地域間の移動経路または移動を表わす。この情報は、繁殖パターンを見る時や、病気や寄生虫の広がり、移動が他の種にどのように影響しうるかを追跡するために重要である。
グラフ理論はコネクトミクスでも使われる。神経系はグラフとして見ることができる。ここで、節点はニューロンであり、辺はニューロン間のつながりである。
数学では、グラフは幾何学ならびに結び目理論といったトポロジーの特定の分野において有用である。代数的グラフ理論は群論と密接なつながりを持つ。代数的グラフ理論は動的系や複雑性を含む多くの分野に応用されている。
グラフ構造は、グラフのそれぞれの辺に重みを割り当てることによって拡張することができる。重み付きグラフは、対ごとのつながりが何らかの数値を持つ構造を表わすために使われる。例えば、グラフが道路網を表わすとすると、重みは各道路の長さを表わすことができるだろう。それぞれの辺に関連した複数の重み（距離、旅行時間、金銭的コストなど）が存在するかもしれない。このような重み付きグラフはGPSおよび飛行時間と費用を比較する旅行計画探索エンジンをプログラムするために一般的に使われる。
グラフ理論 備考
2022年から日本で導入される高等学校新学習指導要領の数学C（公式配布されるのは2024年4月）には「図、表、統計グラフ、離散グラフ及び行列などを用いて、日常の事象や社会の事象などを数学的に表現し、考察すること」とあり、日本では初めてグラフ理論にかかわる分野が高等学校の数学教科書に掲載される予定である。ただし、その分野を入試に出題する大学は殆どない。
データ構造
データ構造（データこうぞう、英: data structure）とは、コンピュータプログラミングでの、データの集まりの形式化された構成である。格納された各データの参照や修正といった管理を容易にするための構成である。一定の関係性を持たせたデータ型のコレクションであり、データ値に適用するための関数や手続きも格納されることがある。データの代数的構造とも言われる。
データ構造 概要
ソフトウェア開発において、データ構造についてどのような設計を行うかは、プログラム（アルゴリズム）の効率に大きく影響する。そのため、さまざまなデータ構造が考え出されている。多くのプログラムの設計において、データ構造の選択は主要な問題である。これは大規模システムの構築において、実装の困難さや質、最終的な性能は最良のデータ構造を選択したかどうかに大きく依存してきたという経験の結果である。
多くの場合、データ構造が決まれば、利用するアルゴリズムは比較的自明に決まる。しかし場合によっては、順番が逆になる。つまり、与えられた仕事をこなす最適なアルゴリズムを使うために、そのアルゴリズムが前提としている特定のデータ構造が選択される。いずれにしても適切なデータ構造の選択は極めて重要である。この洞察は、多くの定式化された設計手法やプログラミング言語において、データ構造がアルゴリズムよりも重要な構成要素とされていることにも現れている。現代的なプログラミング言語は異なるアプリケーションにおいてデータ構造の安全な再利用を可能とするように、実装の詳細をインターフェースの背後に隠蔽するための、モジュール化のしくみを備えている。C++やJavaなどのオブジェクト指向プログラミング言語はクラスをこの目的のために用いている。
データ構造 概要
データ構造は専門的な、あるいは非専門的な（すなわち、あらゆる）プログラミングにとって非常に重要なので、C++におけるSTLや、Java API、および.NET Frameworkのようなプログラミング言語の標準ライブラリや環境において多くのデータ構造が利用可能となっている。データ構造が実装を表すのかそれともインターフェースを表すのかについての議論は多少ある。どのように見えるのかは相対的な問題であるのかもしれない。データ構造は関数同士の間のインターフェイスとして見ることもできるし、データ型に基づいて構成されたストレージにアクセスする方法を実装したものとして見ることもできる。
Python
Python（パイソン）はインタープリタ型の高水準汎用プログラミング言語である。
Python 概要
Pythonは1991年にグイド・ヴァン・ロッサムにり開発されたプログラミング言語である。
最初にリリースされたPythonの設計哲学は、ホワイトスペース（オフサイドルール）の顕著な使用によってコードの可読性を重視している。その言語構成とオブジェクト指向のアプローチは、プログラマが小規模なプロジェクトから大規模なプロジェクトまで、明確で論理的なコードを書くのを支援することを目的としている。
Pythonは動的言語で、動的型付き言語であり、ガベージコレクションがある。構造化（特に手続き型）、オブジェクト指向、関数型プログラミングを含む複数のプログラミングパラダイムをサポートしている。Pythonは、その包括的な標準ライブラリのため、しばしば「バッテリーを含む」言語と表現されている。
Pythonのインタプリタは多くのOSに対応している。プログラマーのグローバルコミュニティは、自由かつオープンソース  のリファレンス実装であるCPythonを開発および保守している 。非営利団体であるPythonソフトウェア財団は、PythonとCPythonの開発のためのリソースを管理・指導している。
Pythonはインタプリタ上で実行することを前提に設計している。以下の特徴をもっている:
Python 言語
Pythonには、読みやすく、それでいて効率もよいコードをなるべく簡単に書けるようにするという思想が浸透しており、Pythonコミュニティでも単純で簡潔なコードをよしとする傾向が強い。
Pythonの本体は、ユーザがいつも必要とする最小限の機能のみを提供する。基本機能以外の専門機能や拡張プログラムはインターネット上にライブラリとして提供されており、別途ダウンロードして保存し、必要なツールはこのツールキットからその都度呼び出して使用する。
Pythonでは「あることをなすのに唯一の良いやり方があるはず」という哲学がある（参考: Perl「やり方は一つじゃない」）。
Pythonではプログラムの文書化（ソフトウェアドキュメンテーション）が重視されており、言語の基本機能の一部となっている。
PythonのドキュメントはPEP（Python Enhancement Proposal、ペップ）と呼ばれる。
インデントが意味を持つ「オフサイドルール」が特徴的である。
以下に、階乗（関数名：factorial）を題材にC言語と比較した例を示す。
Pythonのコード:
わかりやすく整形されたC言語のコード:
Python 言語
この例では、Pythonと整形されたC言語とでは、プログラムコードの間に違いがほとんど見られない。しかし、C言語のインデントは構文規則上のルールではなく、単なる読みやすさを向上させるコーディングスタイルでしかない。そのためC言語では全く同じプログラムを以下のように書くこともできる。
わかりにくいC:
Pythonではインデントは構文規則として決められているため、こうした書き方は不可能である。Pythonではこのように強制することによって、ソースコードのスタイルがその書き手にかかわらずほぼ統一したものになり、その結果読みやすくなるという考え方が取り入れられている。これについては賛否両論があり、批判的立場の人々からは、これはプログラマがスタイルを選ぶ自由を制限するものだ、という意見も出されている。
インデントによる整形は、単に「見かけ」だけではなく品質そのものにも関係する。例として次のコードを示す。
間違えたC:
このコードはC言語の構文規則上は問題無いが、インデントによる見かけのifの範囲と、言語仕様によるifの実際の範囲とが異なっているため、プログラマの意図が曖昧になる（前者は"y = 0;"がif文に包含され、後者は"{}"がないため"y = 0;"がif文に包含されない）。この曖昧さは、検知しにくいバグを生む原因になる。例としてはApple goto failが挙げられる。
Python 言語
ソースコードを読む際、多くの人はインデントのような空白を元に整列されたコードを読み、コンパイラのように構文解析しながらソースを読むものではない。その結果、一見しただけでは原因を見つけられないバグを作成する危険がある。
Pythonではインデントをルールとすることにより、人間が目視するソースコードの理解とコンパイラの構文解析の間の差を少なくすることで、より正確に意図した通りにコーディングすることができると主張されている。
Pythonは動的型付けシステムをもつ。同時に任意の型ヒントを持っており外部ツールによる静的型チェックを可能にしている。
値自身が型を持っており、変数はすべて値への参照である。
基本的なデータ型として、論理型・整数型・浮動小数点数型・複素数型・文字列型・バイト列型・関数型がある。整数型は（メモリの許す限り）無制限の桁数で整数計算が可能である。浮動小数点数型を整数型にキャストすると、小数点以下が切り捨てられる。
Python 言語
組み込みのコンテナ型として、リスト型、タプル型、辞書型、集合型がある。リスト型および辞書型はミュータブル、タプル型はイミュータブルである。集合型には変更可能なものと変更不能なものの2種類がある。タプル型とリスト型は、多くのプログラミング言語では配列と呼ばれるものに類似している。しかし、Pythonではタプル型は辞書のキーとして使うことができるが、リスト型は内容が変わるため辞書のキーとして使うことはできないという理由から、これら2つの型を区別している。
多くのオブジェクト指向プログラミング言語と同様、Pythonではユーザが新しく自分の型を定義することも可能である。この場合、組み込み型を含む既存の型を継承して新たな型（クラス）を定義する事も、ゼロから全く新しい型を作り出す事も出来る。
Pythonは基本的にメソッドや関数の引数に型を指定する必要がない。そのため、ダック・タイピングという、内部で必要とする演算子やメソッドに対応していれば、関数やオブジェクトの設計時点で意図していなかったオブジェクトを引き渡すことも可能である。
Pythonは型ヒントの構文を用意している。これはプログラマ向けの注釈および外部ツールによる静的型チェックに用いられる。
例として、文字列型の値を受け取って文字列型の値を返す関数は次のようにアノテーションできる。
Python 言語
TypedDict 型は特定のキーとバリュー型をもった辞書オブジェクトを表現する型である。
TypedDict 型の定義にはクラス継承構文が用いられるが、この型を持つオブジェクトはランタイムにおいて純粋な dict インスタンスになる。つまり型ヒント専用の型であり、ランタイム型とは区別される。
Pythonはガベージコレクションを内蔵しており、参照されなくなったオブジェクトは自動的にメモリから破棄される。CPythonでは、ガベージコレクションの方式として参照カウント方式とマーク・アンド・スイープ方式を併用している。マーク・アンド・スイープ方式のみに頼っている言語では、オブジェクトがいつ回収されるか保証されないので、ファイルのクローズなどをデストラクタに任せることができない。CPythonは参照カウント方式を併用することで、循環参照が発生しない限り、オブジェクトはスコープアウトした時点で必ずデストラクトされることを保証している。なおJythonおよびIronPythonではマーク・アンド・スイープ方式を採用しているため、スコープアウトした時点で必ずデストラクトされることが前提のコードだとJythonやIronPythonでは正しく動かない。
Python 言語
イテレータを実装するためのジェネレータが言語仕様に組み込まれており、Pythonでは多くの場面でイテレータを使うように設計されている。イテレータの使用はPython全体に普及していて、プログラミングスタイルの統一性をもたらしている。
Pythonでは扱えるデータの全てがオブジェクトである。単純な数値といった基本的なデータ型をはじめ、組み込みのコンテナ型、組み込み関数など、これらは全て統一的な継承関係をもつオブジェクトであり「型」をもっている。これらの組み込み型とユーザ定義型は区別されず、組み込み型を継承したクラスを定義できる。上の「データ型」の項で述べたように Pythonは静的な型チェックを持たないため、Javaのようなインターフェイスという言語上の仕組みは必要とされない。
クラスの継承 (inheritance) メカニズムでは、複数の基底クラスを持つことができ（多重継承）、導出されたクラスでは基底クラスの任意のメソッドをオーバライド（override; 上書き）することが可能である。
Python 言語
また、オブジェクトには任意のデータを入れることができる。これらのメソッドやデータは、基本的に、すべてpublicであり、virtual（仮想）である。ただし、先頭にアンダースコアをもつメンバをprivateとすることができる。これは単なるマナーであるが、アンダースコアを2つもつ場合は、クラスの外部からメンバの名前を隠された状態（mangle; 難号化）とすることでカプセル化を実現できる。また、利用者定義演算子が機能として用意されておりほとんどの組み込み演算子（算術演算子（arithmetic operator）や添字表記）はクラスインスタンスで使うために再定義することが可能となっている。
Pythonには「電池付属 ("Battery Included")」という思想があり、プログラマがすぐに使えるようなライブラリや統合環境をあらかじめディストリビューションに含めるようにしている。このため標準ライブラリは非常に充実している。
サードパーティによるライブラリも豊富に存在する（参考: Python#エコシステム）。
Pythonは様々な組み込み型（built-in types）をサポートする。
Python 言語
Mapping型はハッシュ可能な値を任意のオブジェクトへ対応付ける型である。対応する具象クラスは dict である。抽象基底クラスに collections.abc.Mapping があり、抽象メソッドとして __getitem__, __iter__, __len__ が定義されている。__getitem__ をもったcollectionとも言える。
最初のPythonでは1バイト単位での文字列型のみ扱い、ひらがな・(全角) カタカナおよび漢字のようなマルチバイト文字はサポートしていなかったが、その後のPython 2.0からはUnicode文字型が新たに導入された。
Python 3.0では、Python 2.xにおける文字列型がバイト列型に、またUnicode文字列型が文字列型に変更された。これにより、文字列をPython 3.0で扱う際には後述の変換処理を必ず行う必要がある。ファイル入出力などでエンコードを明示しなければ、標準エンコードを用いて暗黙に行われる場合も多い。これにより多言語の扱いを一貫したものにしている。
Pythonでは文字のエンコードとUnicodeの内部表現を明確に区別している。Unicode文字はメモリ中に保持される抽象的なオブジェクトであり、画面表示やファイルへの入出力の際には変換ルーチン（コーデック）を介して特定のエンコーディングのバイト列表現との間で相互に変換する。また、ソースコード中の文字コードを認識する機能があり、これによって異なる文字コードで書かれたプログラムの動きが異なるリスクを解消している。
Pythonでは変換ルーチンをモジュールとして追加することで、さまざまなエンコーディングに対応できるようになっている。日本語の文字コード（EUC-JP, Shift_JIS, MS932, ISO-2022-JP）に対応したコーデックも作成されている。Python 2.4からは、日中韓国語用のコーデックが標準でディストリビューションに含まれるようになったため、現在では日本語の処理に関する問題はほとんどなくなった。ただしGUIライブラリであるTkinterや統合開発環境のIDLEは、プラットフォームにもよるが、まだきちんと日本語に対応していないものもある。
ソースコードの文字コードには、ASCIIと互換性があり、Pythonが対応しているものを使用する。ソースコードのデフォルトエンコーディングは、Python 3.xではUTF-8（ソースコード以外のPython 3のデフォルトエンコーディングは複雑になっている）、Python 2.xではASCIIであるが、デフォルトエンコーディング以外の文字コードを使う場合は、ソースファイルの1行目か2行目に一定の書式でコメントとして記述することになっており、しばしば以下のようにEmacsやVimなどのテキストエディタにも認識可能な書式で記述される（次の例は Emacs が認識できる書式）。
Python 実行環境
Pythonはインタプリタ型言語であり（ほとんどの場合）プログラムの実行に際して実行環境（ランタイム）を必要とする。以下はランタイム（実装）およびそれらが実装されているプラットフォームの一覧である。
Pythonの最初のバージョンはAmoeba上で開発された。のちに多くの計算機環境上で動作するようになった。
Pythonには複数の実装（ランタイム又はコンパイラ）が存在する。
最新の Python 仕様には追従していないが開発が続けられているランタイム・コンパイラとしては以下が挙げられる。
Python エコシステム
Pythonはパッケージ管理ソフト・ライブラリ・レポジトリなどからなるエコシステムを形成している。
Pythonのパッケージ管理はpip・pipenv・poetry・rye・uv・EasyInstallなどのパッケージ管理システムによっておこなわれる。バイナリパッケージのフォーマットにはwheelがあり、これをインタフェースとしてビルドシステムとパッケージ管理システムの分離が可能になっている。
Python Package Index（PyPI）と呼ぶ公式のパッケージリポジトリが存在する。
パッケージ管理および実行環境管理を含めた統合開発環境としてはAnacondaが存在する。
Pythonは多様なコミュニティライブラリによって支えられている。
Python エコシステム
Webアプリケーションフレームワーク
Bottle（ボトル） - https://bottlepy.org/docs/dev/
CherryPy（チェリーパイ） - https://cherrypy.org/
Django（ジャンゴ） - https://www.djangoproject.com/
Flask（フラスク） - http://flask.pocoo.org/
FastAPI（ファストエーピーアイ） - https://fastapi.tiangolo.com/ja/
Pyramid（ピラミッド） - https://pylonsproject.org/projects/pyramid/
Plone（プローン） - https://plone.org/
Tornado (Webサーバ)（トルネード） - https://sites.google.com/site/tornadowebja/
Cyclone（C10K問題対応)（サイクロン） - http://cyclone.io/
Python 利用
Pythonは全世界で使われているが、欧米の企業でもよく使われている。大企業ではマイクロソフトやAppleなどのパッケージソフトウェア企業をはじめ、Google、 Yahoo!、 YouTube などの企業も利用している。また携帯電話メーカーのノキアでは、S60シリーズでPythonアプリケーションが動く。研究機関では、NASAや日本の高エネルギー加速器研究機構でPythonが使われている。
適応範囲はデータサイエンス、Webプログラミング、GUIベースのアプリケーション、CAD、3Dモデリング、数式処理など幅広い分野に及ぶ。
NumPy、SciPyなどの高速な数値計算ライブラリの存在により、データサイエンスや科学技術コンピューティングにもよく用いられる。NumPy、SciPyの内部はC言語で書かれているので、動的スクリプト言語の欠点の一つである動作速度の遅さを補っている。NumbaやJAXを使うと、Python のコードがLLVMにJITコンパイルして利用可能であり、非常に高速な計算ができる。TensorFlow などのライブラリにより GPU 上で高速に計算するライブラリも充実している。
Python 利用
JetBrainsとPythonソフトウェア財団による共同調査によると、2017年10月現在、Pythonの最も主要な用途は何かというアンケートの結果によると、27%がデータサイエンス（そのうち18%がデータ解析、9%が機械学習）である。
DjangoやFlaskといったWebアプリケーションフレームワークが充実しているため、Webアプリケーション開発用途にも多く使われている。JetBrains とPythonソフトウェア財団による共同調査によると、2017年10月現在、26%の人が最も主要な用途としてWeb開発を選んだ。
スクリプト言語としての特性から、従来Perlやシェルスクリプトが用いられることの多かったシステム管理用のスクリプトとして複数のOSで採用されている。また、異なる言語で書かれた多数のモジュールの機能を貼り合わせるグルー言語（糊の言語）として利用する例も多い。実際、多くの商用アプリケーションでPythonは組み込みのスクリプト言語として採用されている。
JetBrainsとPythonソフトウェア財団による共同調査によると、2017年10月現在、9%の人が最も主要な用途としてDevOps、システム管理、自動化スクリプトを上げた。
Python 利用
Pythonは本来は教育用を目的として設計されたわけではないが、その単純さから子供が最初に学ぶプログラミングにおける教育用の言語としての利用が増えている。グイド・ヴァンロッサムはPython設計以前に教育用言語であるABCの開発にかかわり、教育用としての利用について期待感を示したこともあり、方針として非技術者向けといった利用を視野に入れているとされることもある。
私の大好きなPython利用法は、騒ぎ立てずに、言語教育でプログラミングの原理を教えること。それを考えてくれ――次の世代の話だね。-- スラド『 Guido van Rossum へのインタビュー』
情報処理推進機構（IPA）は国家試験の基本情報技術者試験では2020年の春期試験からCOBOLを廃止してPythonを追加した。
日本の高等学校情報科「情報Ⅰ」の教員向け研修教材の中で、プログラミング用言語としてPythonが使われている。
Python 利用
ただし、Pythonの言語は言語自身に組み込まれている型とそれに付随するメソッドの多いことなどから、C言語に較べると遙かに多くの憶えなければならない事柄があることになる。持つ機能の一部だけに限定して教育に用いるならば、憶えなければならない事柄を減らすことができる。しかし言語の機能をすべて知っていないと他人の書いたプログラムを正しく理解することが出来ない可能性が生じる。Python言語の変数自身には型が無いことから、プログラム上で扱われているデータ・オブジェクトの型が何であるかは実行時に動的に決まるので、それを読み解いて把握しなければプログラムが行っている処理の内容を正しく把握することが難しいことがしばしばある（正しい注釈を付けてプログラムを書くことが重要である）。
また、Pythonの文法は僅か1行でも処理を記述できるほどに簡潔なので、まだプログラミングについてよく知らない子供でも取り組みやすい言語であると言える。
Pythonはその文法の簡潔さにより、 誰が書いても似たようなコードになりやすい性質があるので、学習が進むにつれて大人が作成したコードを理解できるようになる。
また、文法が簡潔なのでコードを記述している最中に混乱することが少なくなり、子供が途中で諦めてしまう傾向が少ない点も教育用として利用される理由でもある。
Python 利用
Pythonはプロスポーツの分析によく使われている。メジャーリーグベースボール（野球）、イングリッシュプレミアリーグ（サッカー）、ナショナルバスケットボールアソシエーション（バスケットボール）、ナショナルホッケーリーグ（アイスホッケー）、インディアンプレミアリーグ（クリケット）の実際のデータセットからのスポーツ分析は、ベストセラーの本と映画であるマネーボールによって示される現実世界の成功によって部分的に推進され、人気が高まっている研究分野として浮上している（セイバーメトリクス）。チームとプレーヤーのパフォーマンスデータの分析は、フィールド、コート、氷上だけでなく、ファンタジースポーツプレーヤーやオンラインスポーツギャンブルのリビングルームでもスポーツ業界に革命をもたらし続けている。実際のスポーツデータを使用した予測スポーツ分析の原則を使用して、プレーヤーとチームのパフォーマンスを予測する。
Python 利用
Pythonを使ってデータをプログラミングする方法を示したり、マネーボールのストーリーの背景にある主張を検証したり、マネーボールの統計の進化を調べたりすることが可能である。公開されているデータセットから野球のパフォーマンス統計を計算するプロセスを案内される。実行期待値マトリックスを使用して導出された、より高度な測定値（Wins Above Replacement（WAR）など）に進む。これらの統計を使用して、独自のチームおよびプレーヤーの分析を行うことができるようになる。