1. 序章

コンピュータサイエンスのコンテキストでのデータ構造とアルゴリズムは、これらの概念がプログラミングで果たす重要な役割のために不可欠です。 ほとんどのソフトウェアプログラムはこれらの概念を使用してデータを操作するため、コードを正しく理解するには、これらの方法を研究することが重要です。

これらのアイデアについて学び、実装するために、それぞれが必要なタスクを実行できる多くの異なるプログラミング言語から選択することができます。 私たちのニーズに最適なツールを選択するために、このチュートリアルでは、データ構造の背後にある主なアイデアと、今日最も人気のあるプログラミング言語でのそれらの適応について説明します。

2. 概要

データ構造は、コンピュータのメモリスペースを数学的に整理し、その中の値に効率的にアクセスできるようにする方法です。このように、構造の作成と削除は慎重に行われるため、データ構造とアルゴリズムが一緒に議論されることがよくあります。アルゴリズムをガイドします。 ほとんどの場合、データ構造の最も基本的なタスクを実行するためのメソッドを実装します。 これらのタスクは、次のカテゴリにグループ化できます。

  • 挿入
  • 消す
  • 要素を検索する

これらのタスクを完了するために、ポインタと動的メモリ割り当てを使用してメモリを管理します。 オブジェクト指向プログラミングでは、メモリの管理は、コンストラクタとデストラクタを介してクラスレベルで行われることがよくあります。 不要なときに使用済みスペースを解放するというこの一般的な考え方は、ガベージコレクションと呼ばれます。 理想的には、タスクを完了するために必要なものだけを変更する効率的なアルゴリズムを形成しようとします。

最後に、これらの操作の有効性は、時間と空間の複雑さの分析を通じて計算できます。

3. 単純なリンクリスト

プログラミング言語ごとに長所と短所があることに注意することが重要です。 最も一般的なプログラミング言語で簡単な3項目の単純なリンクリストを実装し、それらの違いを詳しく説明することで、これを示します。このリンクリストは、データノードで構成される基本的なデータ構造です。 各ノードは、いくつかの情報と次のノードへのポインタを保持します。

構造の構築についてのみ説明し、挿入、削除、リストサイズのチェックなど、完全な実装に必要な他の多くの機能は省略します。

構造は次のようになります。

3.1. C

すべての変数とオブジェクトの型を明示的に指定する必要がある強い型の言語から始めます。組み込みシステム、データベース、およびドライバー開発でよく使用されます。

まず、メイン関数を作成できます。 Cはオブジェクト指向ではないため、クラスを定義する代わりに構造体を使用できます。 NodeおよびLinkedList構造がどのように見えるかの例を次に示します。

typedef struct node_t {
    char * data;
    struct node_t * next;
} node;
typedef struct SLinkedList {
    node* head;
} linkedList;

次に、ノードをリンクします。

node1->next = node2;

これらの手順を使用して、 LinkedList 構造を作成し、そのヘッドポイントを最初のノードに設定できます。

Cでは、コーディングを明示的に行う必要があります。これにより、最初から実装する方法を学びたい人にとっては完璧な言語になります。 ただし、これはオブジェクト指向ではないため、コードの後半で使用したメモリの割り当てを手動で解除する必要があります。 ここにはガベージコレクションはありません。文字列などを操作するには、ライブラリを含める必要があることにも注意してください。

3.2. C ++

この言語は、多くのオペレーティングシステムの一部として、また効率的なビデオゲームや機械学習ツールの作成に広く使用されています。 これは、Cのオブジェクト指向バージョンと見なすことができます。 これは、C ++が抽象化、ポリモーフィズム、カプセル化、および継承をサポートすることを意味します。

その結果、構造をクラスに置き換えることができます。 ここでの利点は、メモリスペースを割り当ておよび割り当て解除する関数をコンストラクタとデストラクタに配置できることです。 これらはオブジェクトを生成および破棄する関数であり、自動的に呼び出されます。

さらに、C ++はカプセル化をサポートしているため、パブリック指定子とプライベート指定子を定義できます。 これにより、変数へのアクセス制御が追加されます。 ノードクラスは次のようになります。

class Node {
public:
    char * data;
    Node* next;

    Node() {
        data = NULL;
        next = NULL;
    }
  
};

そしてLinkedList

class SLinkedList {
public:
    SLinkedList(Node* firstnode) {
        head = firstnode;
    }
private:
    Node* head;
};

head ポインターは、 private[ X166X]対照的に、この実装ではNodenext変数がカプセル化されていないため、他の値を割り当てることでリンクリストが破損する可能性があります。

C ++の構文は、いくつかの例外を除いて、Cと比較的似ていることがわかります。 C ++は強く型付けされたままですが、Cよりも簡潔です。

3.3. Java

Javaは、C++に基づく高級言語です。 これはC++と同じフィールドで使用されており、構文が非常に似ていることもわかります。 この言語には、外部ライブラリを含める必要がなく、最初からより多くの関数が含まれていることに注意してください。

この言語では、文字列を操作するためにライブラリを含める必要もありません。 C ++の場合と同様に、クラスを定義することでコードを開始できます。 今回は、NodeクラスをLinkedList内にネストできます。

class SLinkedList {
    class Node {
        string data;
        Node next;
        Node(string d) {
            data = d; 
        }
    }
    SLinkedList (Node start) {
    head = start;
    }
}

コンストラクターをクラスに直接実装できます。 ノードのクラスを作成し、コンストラクター関数にテキストを含めると、newキーワードを使用してノードを定義できます。 次に、リンクリストを実装するときにこれを再び使用できます。

SLinkedList mylist = new SLinkedList(new Node ("First"));

最も重要なことは、説明したCベースの言語(C、C ++、Java)は、ソフトウェアのクロスプラットフォーム実装に理想的です。ほとんどのマシンには、OSに必要なランタイムがすでに備わっているからです。

3.4. Python

Pythonは、機械学習からWebアプリケーションまで、さまざまな分野で使用されているもう1つの高級言語です。 言語は大まかに入力されているため、このためのポインターとそのための文字列を使用していることを指定する必要はありません。

Javaの場合と同様に、文字列を操作するために何もインポートする必要はありません。

まず、クラスを定義できます。

class Node:
    def __init__(self, dataval = None):
        self.dataval = dataval
        self.nextval = None

特に、ここでのインデントは非常に重要であり、関数の順序を定義します。

コンストラクターでデフォルト値を直接定義することもできます。 次に、コンストラクターを呼び出すだけで、ノードSLinkedListを作成できます。

Node1 = Node("First")
List1 = SLinkedList(Node1)

最後に、次のノードをオブジェクトに割り当てることで、ノードをリンクできます。

Node1.nextval = Node2

これにより、理解しやすい単純で簡潔な構文が作成されます。 セミコロンは各命令の後に必要ではなく、コードのインデントは関数とループの構造を定義するため、重要であることに注意することが重要です。 また、コンストラクタとデストラクタがメモリを割り当てて解放するため、メモリスペースを管理するためにコマンドを使用する必要はありません。 Pythonは私たちのためにガベージコレクションのほとんどを行います。

つまり、Pythonはタスクを簡素化するために多くのことを行う言語であり、長所と短所があります。

たとえば、Pythonの配列は自動的にリンクリストとして扱われます。 そのため、同じ配列にさまざまなデータ型を追加できます。 別のメモリ空間へのポインタを保持するだけです。 これはCの場合には当てはまりません。配列は、連続したメモリ空間に同じタイプの要素しか保持できないためです。 これにより、Cのメモリへのアクセスが大幅に高速化されますが、さまざまなデータ型を挿入できなくなります。

つまり、クラスを定義したくない場合、またはこのリンクリストを最初から実装したくない場合は、まったく同じものを1行にまとめることができます。

Positions = ["First","Second","Third"]

さらに、あらゆる種類の事前定義されたメソッドを使用して、配列の長さを取得し、配列に追加し、カウントし、削除し、挿入することができます。

3.5. Javascript

Javascriptは、主にWeb開発で使用されるプログラミング言語です。この言語では、Pythonよりも細部への注意が少し重要になります。

クラスを宣言することから始めることができます。

class Node {
    constructor(text) {
        this.position = text;
        this.next = null;
    }
}
class LinkedList {
    constructor(head = null) {
        this.head = head
    }
}

上記のコードスニペットを見ると、関数を定義するために角かっこを使用する必要があり、マシンへの各命令を終了するためにセミコロンを使用する必要があることがわかります。 コンストラクターは、他の言語とは対照的に、かなり明示的に定義されています。 また、コンストラクターの前にpositionまたはnextを定義する必要はありません。

Javaと同様に、ノードを作成するための構文はC++に似ています。

let node1 = new Node("First");

最後に、Pythonの場合とは異なり、C ++の場合と同様に、newキーワードを使用してメモリスペースを管理していることもわかります。

4. 概要

前述のように、これらの言語はすべて、基本的なデータ構造タスクを実行できます。 最適な言語を選択するには、プログラムの内容と方法を正確に話し合うことが役立ちます。各言語がどのように見えるかをより広く理解できたので、より正確に決定を下すことができます。

私たちが気にしているのは:

  • 各基本プロセスの非常に正確で低レベルの理解、または組み込みシステムで作業したい:C
  • 機械学習:C++またはPython
  • Web:JavascriptまたはPython
  • ゲーム開発:C ++、Java、またはPython
  • ガベージコレクションが少なく、ガベージコレクションが多い、書きやすいもの Python

要約すると、以下の任意の表でさまざまな言語を比較しています。

   

5. 結論

たとえば、GoやSwiftなど、この記事で触れなかった言語は他にもたくさんあります。 ただし、これらの多くは構文的にCまたはC++に似ています。 したがって、上記の言語を知っていると、他の言語を学ぶ上で有利なスタートを切ることができます。 最も重要なことは、単にどこかから始めることです!