トップ30のデータ構造とアルゴリズムインタビューの質問と回答[初心者と経験者向け]
公開: 2021-08-31データ構造とアルゴリズムは、コンピュータサイエンスとエンジニアリングの世界で最も重要な主題の1つです。 ソフトウェアエンジニアリングのインタビューに参加する場合は、データ構造とアルゴリズムに特化した一連の質問に必ず直面する可能性があります。これは、それらが非常に重要であるということです。
アルゴリズムは、コンピュータサイエンスとデータサイエンスで発生するすべての中核にあります。 機械学習からAI、ブロックチェーンまで–すべてのテクノロジーはアルゴリズムで実行されます。 また、アルゴリズムが機能するにはデータ構造が必要です。 したがって、データ構造とアルゴリズムの知識を組み合わせることで、面接中に群衆から目立つようになります。
ただし、課題は、DSAが広範なドメインであるということです。 ここでは、学習が止まることはなく、理解する必要のある新しい開発が常にあります。 データ構造とアルゴリズムを扱う場合は継続的なスキルアップが必須ですが、本日は、技術面接のエースに役立つDSAの基礎について説明します。
目次
トップデータ構造とアルゴリズムインタビューQ&A
- 「データ構造」について何を理解していますか?
データ構造は、データを体系的に定義、保存、およびアクセスするために使用される手法として定義できます。 それらは、あらゆるアルゴリズムの最も重要なコンポーネントを形成します。 データ構造のタイプに応じて、さまざまな種類のデータが格納され、さまざまな方法でアクセスできます。 アルゴリズムが結果を返すには、一連のデータ構造を整理された効率的な方法で操作および操作して、最終結果を得る必要があります。
- ファイル構造とデータ構造をどのように区別できますか?
ファイル構造では、データは標準のファイルストレージポリシーに従ってディスクに保存され、外部のサードパーティアプリケーションとは互換性がありません。 一方、データ構造では、データはディスクとRAMの両方にカスタマイズされたストレージポリシーで保存され、これらは外部アプリとの互換性が高くなります。
- 幅広いタイプのデータ構造は何ですか?
データ構造は、大きく2つのカテゴリに分類できます。
- 線形:これでは、すべての要素が順番に格納され、検索は線形に行われます。 配置は非階層的であり、各要素には1つの後続要素と1つの先行要素があります。 例–配列、リンクリスト、スタック、キューなど。
- 非線形:ここでは、ストレージは線形シーケンスで発生しません。つまり、すべての要素に必ずしも1つの後続要素と先行要素があるとは限りません。 代わりに、非線形データ構造の要素は、非線形の方法で2つ以上のアイテムに接続されます。 例–ツリー、グラフ、ヒープ。
4.データ構造の主な使用分野は何ですか?
データ構造は、考えられるコンピューティングのすべての分野、特にアルゴリズムとアルゴリズムの最適化でかなり必要です。 データ構造が広く使用されている他のいくつかの領域は次のとおりです。
- オペレーティングシステムの設計
- 数字的分析
- 機械学習とAI
- コンパイラの設計と開発
- データベース管理
- 字句解析
- グラフィカルプログラミング
- アルゴリズムの検索と並べ替えなど。
- スタックデータ構造を説明し、その使用領域について説明します。
スタックは、「トップ」と呼ばれる端の1つからのみ挿入と削除を許可する単純な順序付きリストです。 これは再帰的なデータ構造であり、スタックの最上位の要素について通知する「top」要素へのポインターがあります。 要素の取得戦略に基づいて、スタックは後入れ先出しとも呼ばれます。これは、スタックにプッシュされた最後の要素が一番上にあり、最初にポップアウトされるためです。 スタックデータ構造のいくつかの使用法は次のとおりです。
- バックトラック
- メモリ管理
- 関数の戻りと呼び出し
- 発現評価
- スタックで実行できる操作は何ですか?
スタックデータ構造は、次の3つの操作をサポートします。
- push()—要素をスタックの一番上の位置に挿入します。
- pop()—スタックの一番上から1つの要素を取り出します。
- peek()—スタックから出さずに、スタックの一番上にある要素をチェックするだけです。
- 接尾辞式について何を理解していますか?
後置式は、演算子がオペランドの後に続く式です。 これは、部分式を括弧にグループ化する必要がなく、演算子の優先順位を考慮する必要もないため、用語の計算に非常に役立ちます。 式a+bは、接尾辞では単にab+として表されます。
- 2D配列要素はどのようにメモリに格納されますか?
2次元配列の要素は、次の2つの方法のいずれかでメモリに格納できます。
- Row-Major:この方法では、最初に配列のすべての行が連続してメモリに格納されます。 最初に1行目が完全に格納され、次に2行目が最後の行まで格納されます。
- 列メジャー:これでは、配列のすべての列がメモリに継続的に格納されます。 最初に1列目が完全に格納され、次に2列目が格納されます。
- リンクリストのデータ構造を定義します。
リンクリストは、ランダムに保存されたオブジェクトであるノードのコレクションです。 各ノードには、データフィールドとリンクフィールドの2つの内部要素があります。 データフィールドには特定のノードが持つ値が保持され、リンクフィールドにはこのノードがリンクされている次のノードへのポインタがあります。 状況に応じて、リンクリストは線形および非線形の両方のデータ構造と見なすことができます。
- リンクリストは配列よりもどのように優れていますか?
リンクリストは、次の点で配列よりも優れています。
- 配列サイズは実行時に固定され、後で変更することはできませんが、要件に応じて、リンクリストをリアルタイムで拡張できます。
- リンクリストはメモリに連続して格納されないため、静的に格納される配列よりもはるかにメモリ効率が高くなります。
- リンクリストに格納できる要素の数は、使用可能なメモリスペースのみに制限されますが、要素の数は配列のサイズによって制限されます。
- Cプログラミング言語では、異種リンクリストを実装するためにどのポインターを使用しますか?
名前が示すように、異種リンクリストはさまざまなデータ型を保持します。 その結果、ここでは通常のポインタを使用できません。 したがって、Voidポインターは、任意のタイプの値を指すことができるため、通常、このようなシナリオで使用されます。
- 二重リンクリストとは何ですか?
名前が示すように、二重リンクリストは、後続ノードと先行ノードの両方にリンクされたノードを持つリンクリストです。 その結果、二重リンクリストのノードには2つではなく3つのフィールドがあります。
- データフィールド
- 次のポインタ(次のノードを指すため)
- 前のポインタ(前のノードを指すため)
- キューのデータ構造とそのアプリケーションのいくつかを説明します。
キューは、REARおよびFRONTと呼ばれる1つではなく2つの端からの要素の挿入と削除を可能にする順序付きリストです。 挿入はフロントエンドから行われ、削除はリアエンドから行われます。 この結果、キューはしばしば先入れ先出し(FIFO)と呼ばれます。 データ構造としてのキューの一般的なアプリケーションは次のとおりです。
- CPU、プリンター、ディスクなどの単一共有リソースの待機リスト用。
- データの非同期転送の場合、ファイルIO、ソケット、パイプの例。
- ほとんどのメディアプレーヤーアプリケーションのバッファとして。
- 中断を処理するためのオペレーティングシステム。
- 配列を使用してキューを実装することのいくつかの欠点を挙げてください。
配列を使用してキューを実装するときに発生する主な欠点は2つあります。
- 配列は静的なデータ構造であるため、メモリの管理ミス。配列を使用してキューを実装すると、キューの多くの機能が削除されます。
- 配列のサイズは配列の定義中に定義されるため、サイズに問題があります。 したがって、配列のサイズよりも多くの要素をキューに追加したい場合、それは不可能です。
- 要素を循環キューに挿入するには、どのような条件を満たす必要がありますか?
循環キューへの挿入に関するいくつかの関連条件は次のとおりです。
- (rear + 1)%maxsize == front->の場合、これはキューがいっぱいであることを意味します->これ以上挿入できません。
- Rear!= max – 1の場合、rearの値はmaxsizeにインクリメントされ、新しい値が後端に挿入されます。
- フロント!=0およびリア==max -1 –>の場合、これはキューがいっぱいではないことを意味します。 したがって、rearの値は0に設定され、新しい要素が循環キューの後端に挿入されます。
16.デキューとは何ですか?
Double-Ended Queueまたはdequeは、後部と前部の両端からの挿入と削除を容易にする要素の順序付けられたセットです。 その結果、これはキューのデータ構造よりもさらに柔軟になります。
- ツリーデータ構造を定義し、いくつかのタイプのツリーを一覧表示します。
ツリーは、さまざまなノードを含む非線形の再帰的なデータ構造です。 1つの特定のノードは、他のすべてのノードが出現するツリーのルートとして指定されます。 ルートを除いて、他のすべてのノードは子ノードと呼ばれます。 ツリーデータ構造には、大きく分けて次の種類があります。
- 一般的な木
- 二分木
- 二分探索木
- 森
- 式ツリー
- トーナメントツリー
- バブルソートはどのように機能しますか?
バブルソートは、最もよく使用されるソートアルゴリズムの1つであり、隣接する要素を比較し、それらの値に基づいて位置を交換することにより、配列で使用されます。 それがどのように機能するかを視覚化することは、水面から浮かぶ泡や大きな実体が沈むようなものであるため、バブルソートと呼ばれます。
読む: Cのデータ構造と使い方は?
- 利用可能な最速のソートアルゴリズムはどれですか?
マージソート、クイックソート、バブルソートなど、さまざまなソートアルゴリズムを利用できます。 これらの中から、入力データ、アルゴリズムがデータを処理した後の反応、およびデータの保存方法に基づいてパフォーマンスが大きく異なるため、客観的に最速の特定のアルゴリズムを1つ選択することはできません。
- 二分木とは何ですか?
二分木は、各ノードが最大2つの子を持つことができる特殊なタイプのツリーです。 物事を簡単にするために、バイナリツリーは一般に3つの互いに素なセット(ルートノード、右サブツリー、および左サブツリー)に分割されます。
- BSTと比較して、AVLツリーをさまざまな操作でどのように使用できますか?
AVL木は高さのバランスが取れた木であるため、片側から木が歪むことはありません。 高さhのBSTで実行されるすべての操作にかかる時間はO(h)です。 ただし、これは、BSTが歪むという最悪のシナリオではO(n)になる可能性があります。 AVLは、木の高さを制限することにより、この制限を排除するのに役立ちます。 そうすることで、すべての操作に上限を課し、O(log n)の最大値になります。ここで、n=ノードの数です。
- Bツリーのプロパティは何ですか?
次数mのBツリーには、次のプロパティが含まれています。
- M-wayツリーのすべてのプロパティ。
- B_treeのすべてのノードには、最大m個の子があります。
- ルートとリーフを除くすべてのノードには、少なくともm/2個の子があります。
- ルートノードには、少なくとも2つの子ノードが必要です。
- すべてのリーフノードは、同じ水平レベルにある必要があります。
- グラフのデータ構造について何を理解していますか?
グラフ(G)データ構造は、順序集合G(V、E)として定義できます。ここで、Vは頂点の集合を表し、Eは接続を形成するエッジです。 基本的に、グラフは、ノードが親子関係だけでなく、ノード間の複雑な関係を維持できる循環ツリーと考えることができます。
- グラフデータ構造を参照して、サイクル、パス、および回路を区別します。
サイクル、パス、および回路の違いは次のとおりです。
- パッチは、制限なしにエッジで接続された隣接する頂点の順序です。
- サイクルは、最初の頂点が最後の頂点と同じである閉じたパスです。 サイクルでは、特定の頂点を2回訪問することはできません。
- 回路は、サイクルのように、最初の頂点が最後の頂点と同じである閉じたパスです。 ただし、回路内の特定の頂点には複数回アクセスできます。
- クラスカルのアルゴリズムはどのように機能しますか?
クラスカルのアルゴリズムは、グラフをフォレストと見なし、その各ノードを個別のツリーと見なします。 ツリーは、すべてのオプションの中でコストが最小であり、最小スパニングツリー(MST)のプロパティに違反していない場合にのみ、別のツリーに接続すると言われます。
関連:データ構造の二分木
- プリムのアルゴリズムはどのようにしてスパニングツリーを見つけますか?
プリムのアルゴリズムは、ノードを単一のツリーと見なすことによって機能します。 次に、必要なスパニングツリーに変換する必要がある特定のグラフからスパニングツリーに新しいノードを追加し続けます。
- 最小スパニングツリー(MST)とは何ですか?
重み付きグラフのMSTは、重みが最小のツリーですが、すべての頂点にまたがっています。
- 再帰関数とは何ですか?
定義上、再帰関数はそれ自体をコールバックするか、それを呼び出す関数を直接呼び出します。 すべての再帰関数にはいくつかの基本基準があり、その後、関数はそれ自体の呼び出しを停止します。
- 補間検索技術とは何ですか?
補間検索手法は、バイナリ検索方法を変更したものです。 補間検索アルゴリズムは、目的の値のプロービング位置で機能します。
- ハッシュとは何ですか?
ハッシュは、キーと値のペアの範囲を配列のインデックスに変換するために使用される非常に便利な手法です。 ハッシュテーブルは、キーと値のペアを提供するだけでデータインデックスを簡単に見つけることができる連想データストレージを作成するときに便利です。
結論は
データ構造は、コンピュータサイエンスで発生する他のすべての基盤です。 コンピュータサイエンスのより複雑なアプリケーション、つまりデータサイエンス、機械学習、人工知能、IoTはすべて、データ構造とアルゴリズムの上に構築されています。
したがって、新時代の分野でキャリアを積みたいと考えている初心者の場合は、データ構造とアルゴリズムを習得することから始めることをお勧めします。 または、初心者向けに設計されたデータサイエンスのエグゼクティブPGプログラムのコースを確認することもできます。 ゼロから学び、データサイエンスのエキスパートになりましょう。 今日登録してください!
一般的にどの職務がデータ構造とアルゴリズムの質問をするのか?
ソフトウェア開発やエンジニアリングの役割を担っている場合は、DSAスキルが確実にチェックされます。 それとは別に、データサイエンスの仕事に応募する場合、または機械学習に挑戦したい場合は、DSAを知っていることが求められます。
データ構造とアルゴリズムを理解するためにプログラミングを知る必要がありますか?
いいえ、必ずしもそうとは限りません。 DSAはほとんどが抽象的であり、アプリケーションやプログラムの舞台裏で行われていることの数学と表現、およびフローがすべてです。 プログラミングの経験があると、アルゴリズムを実装するときに役立ちますが、DSAを学習するための前提条件ではありません。
データ構造は常に静的ですか?
いいえ、データ構造は、メモリ割り当てがどのように機能するかに応じて、動的と静的の両方になります。 たとえば、配列は、定義時に連続したメモリ全体が割り当てられるため、静的なデータ構造です。 一方、リンクリストは固定サイズがなく、プログラマーの要件に応じてノード数が増える可能性があるため、動的なデータ構造です。