知っおおくべき10皮類のデヌタ構造+ビデオず挔習

Netologyブログ専甚のフリヌランスの゚ディタヌであるEkaterina Malakhovaは、デヌタ構造の䞻芁なタむプに関するBeau Carnesの蚘事を修正したした。

「悪いプログラマヌはコヌドに぀いお考えたす。 優れたプログラマヌは、デヌタ構造ずそれらの関係に぀いお考えたす。

デヌタ構造は゜フトりェア開発プロセスで重芁な圹割を果たし、開発者ぞのむンタビュヌでよく質問されたす。 良いニュヌスは、本質的に、デヌタを敎理および保存するための特別な圢匏にすぎないこずです。

この蚘事では、最も䞀般的な10個のデヌタ構造を瀺したす。 それぞれに぀いお、ビデオずJavaScriptでの実装の䟋を瀺したす。 緎習できるように、新しいfreeCodeCampカリキュラムのベヌタ版からいく぀かの挔習も远加したした。

䞀郚のデヌタ構造には、Big O衚蚘の時間的な耇雑さが含たれおいるこずに泚意しおください。 時間の耇雑さは実装によっお異なる堎合があるため、これはそれらすべおに適甚されるわけではありたせん。 Big O衚蚘に぀いお詳しく知りたい堎合は、 Briana Marieによるこのビデオをご芧ください。

蚘事では、これらのデヌタ構造のJavaScriptでの実装䟋を瀺したす。Cなどの䜎レベル蚀語を䜿甚する堎合にも圹立ちたす。JavaScriptを含む倚くの高レベル蚀語には、既に説明するほずんどのデヌタ構造の実装が既にありたす。 ただし、こうした知識は、仕事を探す際に倧きな利点ずなり、高性胜なコヌドを曞く際に圹立ちたす。

リンクリスト


リンクリストは、基本的なデヌタ構造の1぀です。 倚くの堎合、配列たたはリンクリストを䜿甚しお他の倚くの構造を実装できるため、配列ず比范されたす。 これら2぀のタむプには長所ず短所がありたす。


これがリンクリストの仕組みです。

リンクリストは、䞀緒にシヌケンスを圢成するノヌドのグルヌプで構成されたす。 各ノヌドには2぀の芁玠が含たれたす。その䞭に栌玍される実際のデヌタ任意のタむプのデヌタず、シヌケンス内の次のノヌドぞのポむンタヌたたはリンクです。 二重にリンクされたリストもありたす。各ノヌドには、リスト内の次の芁玠ず前の芁玠ぞのポむンタがありたす。

リンクリストの基本操䜜には、リスト内のアむテムの远加、削陀、怜玢が含たれたす。

JavaScriptの実装䟋

    ╔═══════════╩═════════════════╩═══════════════╗ ║  ║  ║   ║ ╠═══════════╬═════════════════╬═══════════════╣ ║ Space ║ O(n) ║ O(n) ║ ║ Search ║ O(n) ║ O(n) ║ ║ Insert ║ O(1) ║ O(1) ║ ║ Delete ║ O(1) ║ O(1) ║ ╚═══════════╩═════════════════╩═══════════════╝ 


FreeCodeCamp挔習



スタック


スタックは、芁玠の远加たたは削陀を開始時にのみ可胜にする基本的なデヌタ構造です。 曞籍のスタックのように芋えたす。スタックの真ん䞭にある本を芋たい堎合は、最初に本を削陀する必芁がありたす。

スタックはLIFOの原則に埓っお構成されおいたす埌入れ先出し、「埌入れ先出し」。 これは、スタックに最埌に远加したアむテムが最初にスタックを終了するこずを意味したす。


これがスタックの仕組みです

スタックでは、芁玠の远加プッシュ、芁玠の削陀ポップ、およびスタックの内容の衚瀺ピップの3぀の操䜜を実行できたす。

JavaScriptの実装䟋

    ╔═══════════╩═════════════════╩═══════════════╗ ║  ║  ║   ║ ╠═══════════╬═════════════════╬═══════════════╣ ║ Space ║ O(n) ║ O(n) ║ ║ Search ║ O(n) ║ O(n) ║ ║ Insert ║ O(1) ║ O(1) ║ ║ Delete ║ O(1) ║ O(1) ║ ╚═══════════╩═════════════════╩═══════════════╝ 


FreeCodeCamp挔習



キュヌ


この構造は、食料品店のキュヌずしお衚すこずができたす。 最初に来た人に奉仕する最初の人-すべおが人生のようです。


これはキュヌです

キュヌは、FIFOの原則先入れ先出し、「先着順」に埓っお配眮されたす。 これは、以前に远加されたすべおのアむテムが削陀された埌にのみアむテムを削陀できるこずを意味したす。

キュヌを䜿甚するず、2぀の基本操䜜を実行できたす。キュヌの最埌に芁玠を远加 enqueue および最初の芁玠を削陀 dequeue したす。

JavaScriptの実装䟋

    ╔═══════════╩═════════════════╩═══════════════╗ ║  ║  ║   ║ ╠═══════════╬═════════════════╬═══════════════╣ ║ Space ║ O(n) ║ O(n) ║ ║ Search ║ O(n) ║ O(n) ║ ║ Insert ║ O(1) ║ O(1) ║ ║ Delete ║ O(1) ║ O(1) ║ ╚═══════════╩═════════════════╩═══════════════╝ 


FreeCodeCamp挔習



倚くの



それはたくさんのように芋えたす

倚くの堎合、デヌタ倀を繰り返すこずなく特定の順序で保存したせん。 芁玠の远加ず削陀だけでなく、2぀のセットに同時に適甚できるさらに重芁な機胜がいく぀かありたす。


JavaScriptの実装䟋


FreeCodeCamp挔習



地図


マップは、キヌず倀のペアでデヌタを保存する構造です。各キヌは䞀意です。 連想配列たたは蟞曞ずも呌ばれるこずがありたす。 マップは、デヌタをすばやく芋぀けるためによく䜿甚されたす。 次のこずを実行できたす。




これはマップの構造です

JavaScriptの実装䟋



FreeCodeCamp挔習




ハッシュテヌブル





これがハッシュテヌブルずハッシュ関数の仕組みです

ハッシュテヌブルは、キヌず倀のペアを含むマップのような構造です。 ハッシュ関数を䜿甚しお、デヌタブロックの配列のむンデックスを蚈算し、目的の倀を芋぀けたす。

通垞、ハッシュ関数は入力ずしお文字列を受け取り、数倀を出力したす。 同じ入力に察しお、ハッシュ関数は同じ数を返さなければなりたせん。 2぀の異なる入力が同じ結果でハッシュされるず、衝突が発生したす。 目暙は、このような堎合を最小限にするこずです。

したがっお、キヌず倀のペアをハッシュテヌブルに入力するず、キヌはハッシュ関数を通過しお数倀になりたす。 将来、この番号は実際のキヌずしお䜿甚され、特定の倀に察応したす。 同じキヌを再床入力するず、ハッシュ関数がそれを凊理し、同じ数倀結果を返したす。 この結果は、関連する倀を芋぀けるために䜿甚されたす。 このアプロヌチにより、平均怜玢時間が倧幅に短瞮されたす。

JavaScriptの実装䟋

   - ╔═══════════╩═════════════════╩═══════════════╗ ║  ║  ║   ║ ╠═══════════╬═════════════════╬═══════════════╣ ║ Space ║ O(n) ║ O(n) ║ ║ Search ║ O(1) ║ O(n) ║ ║ Insert ║ O(1) ║ O(n) ║ ║ Delete ║ O(1) ║ O(n) ║ ╚═══════════╩═════════════════╩═══════════════╝ 


FreeCodeCamp挔習



バむナリ怜玢ツリヌ




バむナリ怜玢ツリヌ

ツリヌは、ノヌドで構成されるデヌタ構造です。 次のプロパティが固有です。


バむナリ怜玢ツリヌには、2぀の远加のプロパティがありたす。


バむナリ怜玢ツリヌを䜿甚するず、アむテムをすばやく怜玢、远加、削陀できたす。 これらは、各操䜜の時間がツリヌ内の芁玠の総数の察数に比䟋するように配眮されたす。

JavaScriptの実装䟋

      ╔═══════════╩═════════════════╩══════════════╗ ║  ║  ║  ║ ╠═══════════╬═════════════════╬══════════════╣ ║ Space ║ O(n) ║ O(n) ║ ║ Search ║ O(log n) ║ O(n) ║ ║ Insert ║ O(log n) ║ O(n) ║ ║ Delete ║ O(log n) ║ O(n) ║ ╚═══════════╩═════════════════╩══════════════╝ 



FreeCodeCamp挔習



プレフィックスツリヌ


プレフィックスロヌド枈みツリヌは、怜玢ツリヌの䞀皮です。 デヌタはラベルに保存され、各ラベルはツリヌ内のノヌドを衚したす。 このような構造は、たずえば、オヌトコンプリヌト機胜などのために、単語を保存し、それらをすばやく怜玢するためによく䜿甚されたす。



これがプレフィックスツリヌの仕組みです

蚀語接頭蟞ツリヌの各ノヌドには、単語の1文字が含たれたす。 単語を䜜成するには、䞀床に1文字ず぀、朚の枝をたどる必芁がありたす。 ツリヌは、文字の順序が他の単語ず異なる堎合、たたは単語が終了する堎合に分岐し始めたす。 各ノヌドには、文字デヌタず、単語の最埌かどうかを瀺すブヌル倀が含たれたす。

むラストを芋お、蚀葉を構成しおみおください。 垞に最䞊䜍のルヌトノヌドから開始し、䞋に移動したす。 このツリヌには、ボヌル、バット、人圢、do、dork、dorm、send、senseの単語が含たれおいたす。

JavaScriptの実装䟋


FreeCodeCamp挔習



バむナリヒヌプ


バむナリヒヌプは別のツリヌのようなデヌタ構造です。 その䞭で、各ノヌドには2぀以䞋の子孫しかありたせん。 これは完党なツリヌでもありたす。぀たり、その䞭のすべおのレベルはデヌタで完党に占有され、最埌のレベルは巊から右に埋められたす。


したがっお、最小および最倧ヒヌプが配眮されたす

バむナリヒヌプは最小たたは最倧にできたす。 最倧ヒヌプでは、ノヌドのキヌは垞にその子孫のキヌ以䞊です。 最小限のヒヌプでは、すべおが逆になりたす。ノヌドのキヌは、その子孫のキヌ以䞋です。

同じレベルのノヌドの順序ずは察照的に、バむナリヒヌプ内のレベルの順序は重芁です。 この図は、3番目のレベルの最小ヒヌプでは、倀が順䞍同になるこずを瀺しおいたす10、6、および12。

JavaScriptの実装䟋


     ╔═══════════╩══════════════════╩═══════════════╗ ║  ║   ║   ║ ╠═══════════╬══════════════════╬═══════════════╣ ║ Space ║ O(n) ║ O(n) ║ ║ Search ║ O(n) ║ O(n) ║ ║ Insert ║ O(1) ║ O(log n) ║ ║ Delete ║ O(log n) ║ O(log n) ║ ║ Peek ║ O(1) ║ O(1) ║ ╚═══════════╩══════════════════╩═══════════════╝ 

FreeCodeCamp挔習



カりント


グラフは、ノヌド頂点ずそれらの間の接続゚ッゞのコレクションです。 それらはネットワヌクずも呌ばれたす。

゜ヌシャルネットワヌクはこの原則に埓っお線成されたす。ノヌドは人であり、゚ッゞはそれらの関係です。



グラフは、指向型ず非指向型の2぀の䞻なタむプに分けられたす。 無向グラフの堎合、ノヌド間の゚ッゞには方向がありたせんが、指向グラフの゚ッゞには方向がありたす。

ほずんどの堎合、グラフは2぀の圢匏のいずれかで衚されたす。それは、隣接リストたたは隣接行列のいずれかです。


隣接行列グラフ

隣接リストは、1぀のノヌドが巊偎にあり、他のすべおのノヌドが接続されおいる右偎の芁玠のリストずしお衚すこずができたす。

隣接行列は、数字のあるグリッドで、各行たたは列はグラフ内の個別のノヌドに察応したす。 行ず列の亀点には、接続の存圚を瀺す番号がありたす。 れロは、それが存圚しないこずを意味したす。 ナニット-接続があるこず。 各結合の重みを瀺すために、1より倧きい数倀が䜿甚されたす。

グラフ内の゚ッゞず頂点を衚瀺するための特別なアルゎリズム、いわゆるトラバヌサルアルゎリズムがありたす。 䞻なタむプには、 幅優先怜玢ず深さ 優先怜玢が含たれたす 。 あるいは、グラフの1぀たたは別の頂点がルヌトノヌドにどれだけ近いかを刀断するために䜿甚できたす。 以䞋のビデオは、JavaScriptで幅優先怜玢を行う方法を瀺しおいたす。

JavaScriptの実装䟋

     () ╔═══════════════╩════════════╗ ║  ║  ║ ╠═══════════════╬════════════╣ ║ Storage ║ O(|V|+|E|) ║ ║ Add Vertex ║ O(1) ║ ║ Add Edge ║ O(1) ║ ║ Remove Vertex ║ O(|V|+|E|) ║ ║ Remove Edge ║ O(|E|) ║ ║ Query ║ O(|V|) ║ ╚═══════════════╩════════════╝ 



FreeCodeCamp挔習



さらに詳しく


以前にアルゎリズムやデヌタ構造に出䌚ったこずがなく、ITのバックグラりンドがない堎合、Grokking Algorithmsは最高の本です。 この蚘事では、この蚘事で取り䞊げたデヌタ構造の䞀郚を含め、楜しいむラスト著者はEtsyの䞻芁な開発者を䜿甚しお提瀺されおいたす。

Netologyの線集者から


ビッグデヌタコヌスのNetologyリクルヌト

1. プログラム「ビッグデヌタ倧芏暡なデヌタセットの操䜜の基本」

誰のために゚ンゞニア、プログラマヌ、アナリスト、マヌケティング担圓者-ビッグデヌタテクノロゞヌを掘り䞋げ始めたばかりの人。


クラス圢匏オンラむン。

参照による詳现→ http://netolo.gy/dJd

2. プログラム「デヌタサむ゚ンティスト」

誰のためにビッグデヌタで働いおいる、たたはそれをしようずしおいるスペシャリスト、およびデヌタサむ゚ンスの分野でキャリアを積むこずを蚈画しおいる人。 トレヌニングには、少なくずも1぀のプログラミング蚀語できればPythonを知っおいお、高校の数孊できれば倧孊でプログラムを芚えおおく必芁がありたす。

コヌストピック


クラス圢匏オフラむン、モスクワ、デゞタル10月センタヌ。 Yandex Data Factory、Rostelecom、Sberbank-Technology、Microsoft、OWOX、Clever DATA、MTSの専門家が教えおいたす。

リンクの詳现。

Source: https://habr.com/ru/post/J334914/


All Articles