
形式言語理論やコンピュータプログラミングにおいて、連結とは、文字列、ファイル、リスト、音声や動画などの連続するオブジェクトを端から端まで結合する操作のことです。例えば、「snow」と「ball」を連結すると「snowball」になります。文字列理論とも呼ばれる連結理論の特定の形式化においては、文字列連結は基本概念です。
連結とは、2つ以上の連続するオブジェクトを結合して新しいオブジェクトを作成することであり、通常は元のオブジェクトを変更することはありません。
追加とは、シーケンシャルなオブジェクトの末尾に要素を追加することによって、そのオブジェクトを変更することです。したがって、a をbに追加するということは、 b を、元のbの値とaの連結値と等しくなるように変更することを意味します。しかしながら、一部の高水準プログラミング言語、特に関数型言語や論理型言語では、元のリストや配列をappend変更せずに連結する操作として、 が用いられます。
先頭に追加するとは、連続するオブジェクトの先頭に要素を追加することによって、そのオブジェクトを変更することです。したがって、aをb の先頭に追加するとは、 b をaとbの元の値を連結したものに等しくするように変更することです。
多くのプログラミング言語では、文字列連結は二項中置演算子で表されますが、一部の言語では演算子なしで記述されます。これはさまざまな方法で実装されています。
+C# の例:"Hello, " + "World"値は です"Hello, World"。.PHP 、Visual Basic [ 1 ]、SQL [ 2 ] [ 3 ] 、 D [ 4 ]などの専用&演算子。再利用に比べての利点としては、言語によっては、文字列への暗黙的な型変換のサポートや、数値配列/リストの連結とベクトルの加算の区別などが挙げられる。||~+"Hello, " "World"値は です"Hello, World"。$"{hello}{world}"。C# の例: 、ここstring hello = "Hello, ";で、string world = "World";String.format("%s%s", "Hello, ", "World")多くの科学出版物や規格では、連結演算子の表記法として が使用されています||。[ 5 ]
このappend手続きは、引数として0個以上の(連結)リストを受け取り、それらのリストを連結したものを返します。
( ' ( 1 2 3 ) ' ( a b ) ' () ' ( 6 )) ;出力: (1 2 3 ab 6)このappend手順では最後の引数を除いてすべての引数を完全にコピーする必要があるため、リストに対して時間計算量と空間計算量はどちらもO( n )です。要素。そのため、コード内で不適切に使用すると、非効率の原因となる可能性がある。
このnconc手順(Schemeappend!では と呼ばれる)は と同じ機能を実行しますが、破壊的に実行されます。つまり、各引数(最後の引数を除く)のcdr を変更し、次のリストを指すようにします。append
Appendは を用いて再帰的に容易に定義できるcons。以下は、引数が 2 つだけの Scheme による簡単な実装例である。
( define append ( lambda ( ls1 ls2 ) ( if ( null? ls1 ) ls2 ( cons ( car ls1 ) ( append ( cdr ls1 ) ls2 )))))追加機能はfold-rightを使用して実装することもできます。
( define append ( lambda ( a b ) ( fold-right cons b a )))論理プログラミング言語Prologにappendは、以下のように実装できる組み込み述語が備わっています。
append ([], Ys , Ys ). append ([ X | Xs ], Ys ,[ X | Zs ]) :- append ( Xs , Ys , Zs ).この述語は追加に使用できるだけでなく、リストを分割するためにも使用できます。
?- append ( L , R ,[ 1 , 2 , 3 ])解が得られます。
L = [], R = [1, 2, 3] ; L = [1]、R = [2, 3] ; L = [1, 2], R = [3] ; L = [1, 2, 3], R = []
Mirandaでは、Hughes(1989:5-6)によるこの右折り畳みは、2つの引数に対して、上記のScheme実装と同じ意味論(例)を持っています。
ab を追加する = cons ba を減らす
ここで、reduceはMirandaがfoldに付けた名前であり、consは2つの値またはリストからリストを構築します。
例えば、
append [1,2] [3,4] = reduce cons [3,4] [1,2] = (cons [3,4] を減算) (cons 1 (cons 2 nil)) = cons 1 (cons 2 [3,4])) (consをconsに、nilを[3,4]に置き換えます) = [1,2,3,4]
Haskellでは、この右畳み込みは上記のSchemeの実装と同じ効果を持ちます。
append :: [ a ] -> [ a ] -> [ a ] append xs ys = foldr ( : ) ys xsこれは基本的にHaskellの演算子の再実装です++。
Perlでは、push関数はappendメソッドと同等であり、次のように使用できます。
my @list ; push @list , 1 ; push @list , 2 , 3 ;最終的な結果は、[1, 2, 3]を含むリストです。
unshift関数はリストの末尾ではなく先頭に要素を追加します。
my @list ; unshift @list , 1 ; unshift @list , 2 , 3 ;最終的な結果は、[2, 3, 1]を含むリストです。
ファイルを開く際は、「>>」モードを使用して上書きではなく追記してください。
open ( my $fh , '>>' , "/some/file.txt" ); print $fh "Some new text\n" ; close $fh ;ファイルハンドルを開閉する際には、必ず戻り値を確認する必要があることに注意してください。
Pythonでは、リストメソッドextendまたは中置演算子とを使用し+て+=リストを追加します。
>>> l = [ 1 , 2 ] >>> l . extend ([ 3 , 4 , 5 ]) >>> l [1, 2, 3, 4, 5] >>> l + [ 6 , 7 ] [1, 2, 3, 4, 5, 6, 7]リストに単一のappend要素を追加するリストメソッドと混同しないでください。
>>> l = [ 1 , 2 ] >>> l 。追加( 3 ) >>> l [1, 2, 3]Bashでは、append redirectは、次のような一連のシェルコマンドのように、ストリームを何かに追加するために「>>」を使用することです。
echoこんにちは世界!>text ; echoさよなら世界!>>text ; cat text 最初のコマンドで書き込まれたテキストファイルに「Goodbye world!」というストリームが追加されます。「;」は、指定されたコマンドが同時ではなく順番に実行されることを意味します。したがって、テキストファイルの最終的な内容は次のようになります。
こんにちは、世界!さようなら、世界!連結リストを基本データ構造として採用している他の高水準プログラミング言語では、が採用されています。リストを連結するには、演算子として、Haskellではを、OCamlでは を使用します。他の言語では、 または記号を使用して、文字列、リスト、または配列を非破壊的に連結します。append++@+++
プログラミングにおいて、文字列連結は一般的に実行時に行われます。これは、文字列の値が通常実行時まで不明であるためです。しかし、文字列リテラルの場合は、コンパイル時に値が既知であるため、文字列連結はコンパイル時に、文字列リテラル連結または定数畳み込み(実行時最適化の可能性あり)のいずれかによって実行できます。
形式言語理論およびパターンマッチング(正規表現を含む)では、文字列の連結操作は、次のように文字列の集合に対する操作に一般化されます。
2 つの文字列セットS 1とS 2に対して、連結S 1 S 2 は、 vがS 1の文字列、wがS 2の文字列である形式のすべての文字列で構成されます。形式的には、S 1 S 2 = { vw : v ∈ S 1、 w ∈ S 2 }となります。多くの著者は、文字列セットと単一の文字列の連結、およびその逆も使用しており、これらは同様にS 1 w = { vw : v ∈ S 1 }およびvS 2 = { vw : w ∈ S 2 }で定義されます。これらの定義では、文字列vwは、導入セクションで定義された文字列vとwの通常の連結です。
例えば、F = { a, b, c, d, e, f, g, h }、R = { 1, 2, 3, 4, 5, 6, 7, 8 }の場合、FR はチェス盤のすべての座標の代数表記の集合を表し、e Rはキングファイルのすべての座標の集合を表します。
この文脈では、文字列の集合はしばしば形式言語と呼ばれます。連結演算子は通常、単純な並置(乗算と同様)として表現されます。
アルファベット上の文字列は、連結演算によって、自由モノイドと呼ばれる結合的な代数構造を形成する。単位元は空文字列である。
連結と交替を含む文字列の集合は半環を形成し、連結は交替に対して分配されます。交替の単位元(0番目の要素)は空集合であり、連結の単位元(1番目の要素)は空文字列のみを含む集合です。
電話システムのプログラミングでは、連結を使用してユーザーに動的な音声フィードバックを提供します。たとえば、「時刻」を音声で知らせる時計では、連結を使用して適切な録音を連結して再生することで正しい時刻を伝えます。たとえば、「この音の時点で、時刻は」、「8」、「30」、「5」、「および」、「20」、「5」、「秒」などです。
録音自体は別々に存在するが、それらを順番に再生することで、聞き手にとって文法的に正しい文章となる。
この技術は、番号変更のアナウンス、ボイスメールシステム、または発信者に動的なフィードバックを提供するほとんどの電話アプリケーション(例:moviefone、tellmeなど)でも使用されています。
あらゆる種類のコンピュータ化された公共放送システムのプログラミングでは、動的な公共アナウンス(例えば、空港でのフライト情報)のために連結処理を用いることもできます。システムは、数字、路線や航空会社、目的地、時刻などの音声データを録音してアーカイブし、特定の順序で再生することで、施設全体にアナウンスされる文法的に正しい文章を作成します。
リレーショナルデータベース設計の原則の一つは、データテーブルのフィールドはテーブルの対象の単一の特性を反映するべきであり、つまり連結された文字列を含めてはならないということです。レポートで連結が必要な場合は、レポート実行時に連結する必要があります。例えば、特定の顧客の住所を表示する場合、データには建物番号、通り名、建物サブユニット番号、都市名、州/県名、郵便番号、国名が含まれる可能性があります。例えば、「123 Fake St Apt 4, Boulder, CO 80302, USA」のように、7つのフィールドが結合されます。しかし、顧客データテーブルでは、連結された文字列を格納するために1つのフィールドを使用すべきではありません。むしろ、7つのフィールドの連結はレポート実行時に行われるべきです。このような原則が存在する理由は、これらの原則がなければ、大量のデータの入力と更新がエラーを起こしやすく、労力を要するものとなるからです。都市、州、郵便番号、国を個別に入力することで、データ入力の検証(例えば、無効な州略語の検出など)が可能になります。その後、これらの個別の項目を使用してレコードを並べ替えたり、インデックスを作成したりできます。例えば、「ボルダー」という都市名を持つすべてのレコードを抽出できます。
レクリエーション数学では、多くの問題が、ある基数における数の連結に関する数の性質に関係しています。例としては、ホームプライム(与えられた数の素因数の増加連結を繰り返し因数分解することによって得られる素数)、スマランダッシュ・ウェリン数(最初の素数の連結)、チャンパーノウン定数とコープランド・エルデシュ定数(それぞれ正の整数と素数の十進表現によって形成される実数)などがあります。