-
JavaScriptのAtomics.or()関数とは?使い方とサンプルコードを解説
JavaScriptのAtomicsオブジェクトは、SharedArrayBufferオブジェクトに対して安全に読み書きを行うためのアトミック(不可分)操作を提供する組み込みオブジェクトです。加算(add)、減算(sub)、AND(and)、OR(or)、XOR(xor)、読み込み(load)、書き込み(store)など、さまざまな操作が静的メソッドとして用意されています。本記事では、その中でもAtomics.or()メソッドについて、基本的な構文から実際のコード例までわかりやすく解説します。Atomics.or()とはAtomics.or()は、配列内の指定した位置にある値に対してビット単位
-
JavaScriptのAtomics.isLockFree()関数とは?使い方とサンプルコードを解説
JavaScriptのAtomicsオブジェクトは、加算(add)、減算(sub)、論理積(and)、論理和(or)、排他的論理和(xor)、読み込み(load)、書き込み(store)といったアトミック操作を静的メソッドとして提供する組み込みオブジェクトです。これらのメソッドは、SharedArrayBufferオブジェクトと組み合わせて使用され、複数のスレッド間で安全に共有メモリへアクセスすることを可能にします。 Atomics.isLockFree()とは Atomics.isLockFree()メソッドは、指定されたサイズのデータに対して、ロックを使用せずにアトミック操作を実行できるか
-
【初心者向け】JavaScriptのAtomics.load()関数の使い方を解説
JavaScriptのAtomicsオブジェクトは、加算(add)、減算(sub)、論理演算(and、or、xor)、読み込み(load)、書き込み(store)などのアトミック操作を静的メソッドとして提供するオブジェクトです。これらのメソッドは、SharedArrayBufferオブジェクトと組み合わせて使用され、複数スレッド間で共有されるデータに対して安全な操作を実現します。本記事では、Atomicsオブジェクトが持つload()関数について詳しく解説します。load()関数は、配列内の指定された位置にある値を返す関数です。Atomics.load()関数とはAtomics.load()関
-
JavaScriptのAtomics.store()関数とは?構文と使い方を実例つきで解説
JavaScriptのAtomicsオブジェクトは、add(加算)やsub(減算)、and・or・xorといったビット演算、さらにload(読み込み)やstore(書き込み)など、さまざまなアトミック操作を静的メソッドとして提供するオブジェクトです。これらのメソッドは、SharedArrayBufferオブジェクトと組み合わせて使用されます。 Atomics.store()関数は、配列内の位置(インデックス)と数値(value)を受け取り、指定された位置にその値を格納します。そして、格納した値をそのまま戻り値として返します。 構文 構文は以下のとおりです。 Atomics.store(type
-
JavaScriptのAtomics.sub()関数の使い方を解説
JavaScriptのAtomicsオブジェクトは、加算・減算・ビット演算などのアトミック(不可分)操作を静的メソッドとして提供する組み込みオブジェクトです。主なメソッドには add()、sub()、and()、or()、xor()、load()、store() などがあり、これらはすべて SharedArrayBuffer オブジェクトと組み合わせて使用します。 Atomics.sub() 関数は、指定された位置(インデックス)にある値から引数で渡した数値を減算し、その位置にあった元の値(減算前の値)を返します。複数スレッドが同じメモリ領域を共有する環境でも、競合状態(レースコンディション)
-
JavaScriptで学ぶ最小全域木(MST)とは?定義・特徴・代表アルゴリズムを解説
最小全域木(MST)とは 最小全域木(Minimum Spanning Tree:MST)または最小重み全域木とは、連結された重み付きグラフ(有向・無向いずれも可)において、すべての頂点を接続する辺の部分集合のうち、サイクル(閉路)を一切含まず、かつ辺の重みの合計が最小となるものを指します。 言い換えると、グラフ内のすべての頂点をカバーする全域木の中で、「辺の重みの総和が可能な限り小さくなる木」のことです。 MSTの主な特徴 全頂点を接続: グラフ内のすべての頂点が必ず含まれ、互いにつながっています。 サイクルなし: 閉路が存在しないため、木構造として成立します。 辺の数: 頂点数を V
-
JavaScriptで実装するプリム法:最小全域木を求めるアルゴリズムの基本と実装例
プリム法(Prims Algorithm)とはプリム法は、重み付き無向グラフから最小全域木(MST: Minimum Spanning Tree)を求めるための貪欲法(グリーディアルゴリズム)です。グラフ内のすべての頂点を含み、かつ辺の重みの合計が最小になるような辺の部分集合(木)を見つけ出します。アルゴリズムは、任意の開始頂点から木の構築を始め、1ステップごとに「木に属する頂点」と「木に属さない頂点」をつなぐ辺の中から、最もコスト(重み)の小さいものを1本追加していくことで動作します。プリム法の動作の流れ以下の図を使って、プリム法がどのように動作するのかを順番に見ていきましょう。ステップ1:
-
JavaScriptで実装するクラスカルのアルゴリズム|Union-Findで最小全域木を求める
クラスカル法(Kruskals algorithm)は、グラフから最小全域木を求めるための貪欲アルゴリズムです。このアルゴリズムは、以下の手順で動作します。 グラフ内のすべての辺を集合として作成します。 集合が空でなく、かつすべての頂点がカバーされていない間、以下を繰り返します。 集合から重みが最小の辺を取り出します。 その辺がサイクルを形成するか、あるいは単に2つの木をつなぐだけかを判定します。サイクルを形成する場合はその辺を破棄し、そうでなければ木に追加します。 処理が完了すると、最小全域木が完成します。 必要な補助データ構造 このアルゴリズムを実装するには、さらに2つのデータ構造
-
JavaScript完全グラフクラスの実装
この記事では、JavaScriptで実装された包括的なGraph(グラフ)クラスを紹介します。このクラスは、グラフ理論の主要なアルゴリズムを網羅しており、データ構造の学習や実践的なアプリケーション開発に活用できます。 概要 実装には以下のデータ構造が別モジュールとして分離されており、import文またはrequireで読み込み可能です。 Queue(キュー) - 幅優先探索用 Stack(スタック) - 深さ優先探索・トポロジカルソート用 PriorityQueue(優先度付きキュー) - ダイクストラ法・プリム法・クラスカル法用 Graphクラスの主要メソッド 基本操作
-
JavaScriptで配列に要素を追加する方法!push・unshift・spliceの使い方を解説
JavaScriptで配列に要素を追加するには、追加する位置(末尾・先頭・任意の場所)に応じて、使用すべきメソッドが異なります。この記事では、代表的な3つのパターンをコード例とともにわかりやすく解説します。配列の末尾に要素を追加する:pushメソッド配列の末尾に要素を追加するときは、pushメソッドを使います。let veggies = [Onion, Raddish]; veggies.push(Cabbage); console.log(veggies);実行結果は以下のとおりです。[Onion, Raddish, Cabbage]pushは可変長引数に対応しているため、複数の要素を一度に
-
JavaScriptで配列から要素を削除する方法|pop・shift・spliceの使い方
JavaScriptで配列から要素を削除する場面は大きく分けて3つあります。まず配列の末尾から要素を削除する方法、次に配列の先頭から要素を削除する方法、そして指定したインデックス(位置)から要素を削除する方法です。 それぞれのケースに対応した標準組み込みメソッドが用意されているため、目的に応じて使い分けることができます。ここでは、実際のコード例とともに各メソッドの使い方を順番に見ていきましょう。 配列の末尾から要素を削除する(pop) 配列の末尾から要素を削除するには、popメソッドを使用します。popは配列の最後の要素を取り除き、取り除かれた要素を戻り値として返します。 let veggi
-
JavaScriptの多次元配列の基本と使い方を徹底解説
配列の中にさらに配列を格納したい場合に活用されるのが、多次元配列です。まずは具体的な例を見てみましょう。たとえば、平日の各日について6時間ごとの気温を記録したいとします。単純に書くと、次のようになります。let monday = [35, 28, 29, 31]; let tuesday = [33, 24, 25, 29]; // ...このようなケースでは、多次元配列を使うのが適しています。多次元配列とは、その名の通り「配列の配列」のことです。先ほどの例を発展させると、各行が1日を表し、行内の各要素が気温の記録を表すことになります。let temps = [ [35, 28, 29
-
JavaScriptで配列をループ処理する方法まとめ|for文・while文・do…while文の使い方
JavaScriptには、配列をループ処理するためのさまざまな方法が用意されています。それぞれの特徴を理解して使い分けることで、より効率的で読みやすいコードを書くことができます。本記事では、代表的なループ構文の基本と実行例をわかりやすく解説します。 JavaScriptのforループ まずは基本となるforループから見ていきましょう。JavaScriptのforループには主に2つの形式があります。1つ目は「初期化式・条件式・更新式」を指定する形式です。最初に初期化ステートメントを実行し、各イテレーションのたびに更新式を実行してから条件式を評価します。条件がtrueである限り、ループは繰り返され
-
JavaScriptで理解する動的計画法(DP)の基本と2つのアプローチ
動的計画法(Dynamic Programming)とは 動的計画法(DP)は、一つの大きな問題を、より小さな部分問題へと段階的に分解していくアルゴリズム設計手法です。ここで重要なのは、各部分問題が互いに独立して解かれるわけではないという点です。小さな部分問題の結果は記憶(保存)しておき、同じような、あるいは重複する部分問題が出てきた際にその結果を再利用します。 このため、動的計画法は「問題を類似した部分問題に分割でき、その結果を再利用できる」ケースに特に有効です。多くの場合、最適化問題(最良の解を求める問題)に対して用いられます。ある部分問題を解く前に、すでに解いた部分問題の結果を確認し、そ
-
JavaScriptで学ぶフィボナッチ数列:素朴な再帰からメモ化(動的計画法)への最適化
フィボナッチ数とは フィボナッチ数とは、「最初の2つの数以降、各項がその直前の2つの数の和になる」という性質を持つ数列のことです。数列は 1, 1 から始まります。 1, 1, 2, 3, 5, 8, 13, 21, 34, … 素朴な再帰による実装 n番目のフィボナッチ数を求めるプログラムは、シンプルには次のように書けます。 function fibNaive(n) { if (n <= 1) return n; return fibNaive(n - 1) + fibNaive(n - 2); } 実際に動かして確認してみましょう。 console.log(fibN
-
JavaScriptのAVLツリークラス完全実装ガイド ― 回転操作の仕組みまで徹底解説
AVL木(Adelson-Velsky・Landis木)は、1962年にG.M. Adelson-VelskyとE.M. Landisが発表した、世界初のセルフバランシング二分探索木です。通常の二分探索木はデータの挿入順序によって木が偏り、最悪の場合、検索や挿入の計算量がO(n)まで悪化してしまいます。 AVL木では、すべてのノードにおいて左右の部分木の高さの差(バランスファクター)が−1、0、1のいずれかに保たれます。挿入などでこの条件が崩れた場合には、回転(ローテーション)と呼ばれる操作によって自動的に再バランスが行われるため、常にO(log n)の計算量を維持できるのが大きな特徴です。
-
JavaScriptのグラフ(Graph)データ構造入門:基本概念から実装まで徹底解説
グラフ(Graph)とは、複数のオブジェクトの集合を図式化したもので、一部のオブジェクト同士がリンク(線)によって接続されたデータ構造です。相互に接続されたオブジェクトは頂点と呼ばれる点で表現され、頂点同士をつなぐリンクは辺と呼ばれます。 形式的に定義すると、グラフは2つの集合のペア (V, E) として表されます。ここで V は頂点の集合、E は頂点同士を接続する辺の集合です。次のグラフを見てみましょう。 上記のグラフでは、以下のように表されます。 V = {a, b, c, d, e} E = {ab, ac, bd, cd, de} グラフの重要な用語 数学的なグラフは、データ構造と
-
JavaScriptでグラフを作成する方法|隣接リストによる有向・無向グラフの実装
本記事では、重み(ウェイト)や有向・無向の両方のグラフに対応できるGraphクラスをJavaScriptで作成します。実装には「隣接リスト」というデータ構造を採用しています。重みや有向性をサポートしておくことで、最短経路探索(ダイクストラ法)など、より高度なアルゴリズムへ発展させる際にもそのまま活用できます。 隣接リストとは 隣接リストとは、個別のリストからなる配列でグラフを表現する方法です。配列の各要素 Ai はリストになっており、頂点 i に隣接しているすべての頂点を格納しています。これにより、ノード同士の接続関係を効率よく管理することができます。 今回は、nodes(ノードの一覧)と e
-
JavaScriptで学ぶグラフ走査(グラフ探索)の基本
グラフ走査とはグラフ走査(グラフ探索とも呼ばれます)とは、グラフに含まれるすべての頂点(ノード)を訪問し、確認や更新を行う処理のことです。グラフはソーシャルネットワーク、地図上の経路、Webページ間のリンクなど、さまざまなデータ構造を表現するために使われており、その全頂点を効率よく巡回するアルゴリズムは、コンピュータサイエンスにおいて非常に重要な概念となっています。走査の順序による分類グラフ走査は、頂点を訪れる「順序」によって分類されます。代表的な手法には以下の2つがあります。深さ優先探索(DFS: Depth-First Search)ある頂点から出発し、行き止まりに達するまで可能な限り深く
-
JavaScriptで学ぶ幅優先探索(BFS)トラバーサルの仕組みと実装方法
BFS(幅優先探索)は、子ノードへ進む前に隣接する頂点を先に訪問するグラフ探索アルゴリズムです。探索の過程では「キュー」というデータ構造を使用するのが特徴です。BFSの基本的な手順BFSは以下のルールに従って動作します。隣接する未訪問の頂点を訪問し、「訪問済み」としてマークします。その頂点を表示し、キューに追加します。未訪問の隣接頂点が存在しない場合は、キューの先頭から頂点を取り出します(デキュー)。キューが空になるまで、上記のルール1とルール2を繰り返します。BFSトラバーサルの流れ(図解)実際のBFSトラバーサルがどのように進むのか、ステップごとに見ていきましょう。ステップトラバーサル説明