一般的に使用されるデータ構造の配列とリンクリスト

1。概要

           コンピューターで実行されているプログラムは、実際にはデータの流れです。簡単に言えば、あるコンテナから別のコンテナに、データに対応するデータを保存および取得するための2つの操作があります。したがって、データ構造を選択するための最も基本的な要件は、インストールできることです。そうすれば、アクセスしやすくなります。たとえば、野菜を購入するためにバスケットを使用し、水を取り出すためにバケットを使用する必要があります。データに適切なコンテナを選択することも同様に重要です。データ構造とアルゴリズムは、プログラマーがプログラマーである理由と見なすことができます。私は、このデータ構造を言いやすくするようにしています。Ollieは与える。

2.時間の複雑さ

           時間の複雑さは、厳密には時間ではなく、プログラム実行の頻度、および通常は最悪の条件下での頻度を簡略化して表したものです。ここではBigO表記が使用されており、基本的な手順は次のとおりです。

           1.周波数関数T(n)を計算します

           2.最上位の項を保持し、係数を削除します

           3.定数は1です

           一般的に使用される時間の複雑さは、定数次数O(1)、対数次数O(logn)、線形次数O(n)、線形対数次数O(nlogn)、二乗次数O(n ^ 2)、三次次数Oです。 (n ^ 3)、k二乗次数O(n ^ k)、指数次数O(2 ^ n)

1.線形テーブル

               線形テーブルはデータストレージの概念であり、その中心的なアイデアは、キューイングのように要素を1つずつつなぎ合わせるというものです。連続メモリスペース(シーケンシャルストレージ構造)または不連続メモリスペース(チェーンストレージ構造)の場合があります。

                

2.アレイ

          配列はメモリ内の連続したスペースであり、スペースのサイズが決定されると、変更することはできません。ご覧のとおり、この配列を使用して、線形テーブルの順次ストレージ構造を実装できます。次の図に示すように、配列から要素を取り出したい場合、複雑さはO(N)です。

                         

3.リンクリスト

     1.単一のリンクされたリスト

             リンクリストは不連続なストレージスペースであるため、そのサイズは動的に変更できます。では、リンクリスト文字列の要素を一緒にする方法は?したがって、各場所には2つの変数が含まれている必要があります。1つは現在の要素の値を格納し、もう1つは次の要素のアドレスを格納します。このようにして、各ノードは次のノードに到達し、すべてのノードを全体として接続できます。リンクリストは柔軟性が高く、要素へのアクセスの複雑さはO(N / 2)です。以下では、pythonコードを使用して、基本的な追加、削除、および変更のチェックを実装する一方向リストを実装します。

class Node(object):
    def __init__(self,elem):
        self.elem = elem
        self.next = None
class SingleLinkList(object):
    def __init__(self,node=None):
        #双下划线开头表示私有成员,不可以直接访问,必须通过class进行访问
        self.__head = None
    #计算长度
    def length(self):
        cur = self.__head
        count = 0
        while cur.next != None:
            cur = cur.next
            count += 1
        return count
    #判断是否为空
    def is_empty(self):
        return self.__head == None
    #头部添加,将链表的头部设置为该元素,元素的next为原来的头部
    def add(self,item):
        node = Node(item)
        node.next = self.__head
        self.__head = node
    #遍历
    def travel(self):
        cur = self.__head
        while cur != None:
            print(cur.elem,end=' ')
            cur = cur.next  
    #尾部添加,直接将最后一个元素的next指向新的元素
    def append(self,item):
        node = Node(item)
        if self.is_empty():
            self.__head = node
        else:
            cur = self.__head
            while cur.next != None:
                cur = cur.next
            cur.next = node
    #固定位置添加,找到插入的前一个位置元素
    #将该元素next设置值为新元素 新元素的next设置为该元素原来的next
    def inert(self,pos,item):
        if pos<0:
            self.add(item)
        elif pos >  self.length()-1:
            self.append(item)
        else:
            per = self.__head
            count = 0
            while count <  pos-1:
                count += 1
                per = per.next
            node = Node(item)
            node.next = per.next
            per.next = node   
    #删除方法 
    #如果是头部,则删除,将头部指向下一个元素
    #如果不是头部,删除,然后将上一个元素的next指向该元素的next
    def remove(self,item):
        cur = self.__head
        per = None
        while cur != None:
            if cur.elem == item:
                if cur == self.__head:
                    self.__head = cur.next
                else:
                    per.next = cur.next
                break
            else:
                per = cur
                cur = cur.next
    #查找方法
    def search(self,item):
        cur = self.__head
        while cur:
            if cur.elem == item:
                return True
            else:
                cur = cur.next
        return  False
li = SingleLinkList()
li.append(3)
li.append(4)
li.append(5)
li.append(6)
li.append(7)
li.inert(2,100)
li.remove(5)
print(li.search(100))
li.travel()

2.循環リンクリスト

       循環リンクリストは、一方向リストの拡張です。一方向リストを、手をつないで前に並んでいる子供たちのグループと比較すると、次に、双方向のリンクされたリストは、サークルでゲームをしている子供たちのグループです。特定の実装も非常に単純です。tail要素の次の属性をリンクリストのhead要素にポイントできます。

       

3.二重にリンクされたリスト

       名前が示すように、二重にリンクされたリストには2つの方向があります。つまり、要素ごとに2つのポインターがあります。1つの要素は前面を指し、1つの要素は背面を指します。特定の実装では、各要素に3つの変数があり、1つは前の要素を記録し、もう1つは後の要素を記録します。

               

 

4.まとめ

          この記事は、データ構造に関する私の先駆的な仕事です。データ構造は、メモリ内のデータのさまざまな格納方法に対応する、データのコンテナとして理解できます。線形構造を使用してデータを格納する線形テーブルの概念を導入しました。1つはシーケンシャルリニアストレージです。つまり、データは連続メモリスペースを使用します。1つは、不連続なメモリ空間を使用する連鎖線形ストレージ方式です。この保管方法はより柔軟性があり、占有スペースのサイズを事前に知る必要はありません。最後に、単一リンクリスト、二重リンクリスト、循環リンクリストなどのリンクリストを紹介しました。この線形保存方法は、比較的理解しやすく、比較的単純です。これは私の最初の日です、そして私はまだ私が真実に気づいたとは言いません。タオイズムとシュシュに関しては、まだアカデミックな段階です。私にとっての現在のデータ構造は、コンピューターのパイプラインである血管を流れる血液のようなものです。彼らはコーディネートして派遣し、ダンスのように美しく流れ、人々を興奮させました!

5.ナンセンス

          私は友達がとても好きで、不確かな生活も好きです。どんな生活にも魅力があり、スポーツカーを運転する楽しさは今でも想像もできません。しかし、私が知っていることは、誰もが幸せを感じる能力はほんのわずかだということです。誰もが利用できないものを切望する必要があります。簡単に利用できないほど、私たちは幸せになります。したがって、退屈な幸福の無限のループに入るのではなく、単にそれらを捨てる方が良いです。勉強したり進歩したりしないのは時間の無駄だと言う人もいますが、退屈な勉強は本当に私たちの生活を無駄にします。あなたは一生を尽くし、ある分野のピラミッドの頂上に立っていました。振り返ってみると、私はまだ価値がないと感じています。私たちの貴重な若々しい年と比較して、これらの壊れたものは何ですか?人生で最も悲しいことは、私たちには人生、エネルギーの源、そして世界のすべてのものの本質の知恵の泉があるということですが、私たちはそれをどうするかわかりません。退廃と怠惰が自分自身の罠に陥った場合、自己規律と勤勉は天と地の罠に陥りますか?いつか自分の人生にふさわしいものが見つかると確信しています。一歩近づく限り、人生を無駄にすることはありません。

[MAD / RanXiang]海軍の戦闘シーンRanXiangミックスカットカリブ海の海賊テーマソングWorldofWarshipsプロモーションビデオ編集

 

おすすめ

転載: blog.csdn.net/gaobing1993/article/details/108666410