データ構造

in  

データ構造とはデータを格納する入れ物の構造のことです。適切なデータ構造を選ぶ事でデータの扱いが効率的になります。

データ構造

アルゴリズムはデータを扱うため、データの構造は非常に重要です。代表的なデータ構造を挙げます。

配列

添字を使って参照できるデータ構造で、プログラミング言語では添字の最初の数字は0であることが多いです。PythonではListを用いて配列を表すことができます。

PythonではListの代わりにより効率的なarrayモジュールを利用することもできます。ただしarrayモジュールは格納する型を定義するので、同じ型のデータしか格納できません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import array as arr

def tolist(*args):
    return list(args)

def toarray(lis: list):
    return arr.array('i', lis)

if __name__ == "__main__":
    
    lis = tolist(1, 3, 2, 4, 7, 6, 8, 5)
    print('list')
    print(lis[0])
    print(lis[1])
    print(lis[2])
    print(lis[3])
    print(lis[4])
    print(lis[5])

    a = toarray(lis)
    print('\narray')
    print(a[0])
    print(a[1])
    print(a[2])
    print(a[3])
    print(a[4])
    print(a[5])
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
list
1
3
2
4
7
6

array
1
3
2
4
7
6

PythonのListと似たデータ構造としてTupleもあります。こちらはListと違いイミュータブルになるという違いがあります。


スタック

最後に入れたデータが最初に取り出されるデータ構造のことです。データは格納した順序とは逆の順序で取り出されるます。このようなデータ構造のことをLIFO(Last In First Out)とも呼びます。

スタックに対する操作としてデータを格納する push とデータを取り出す pop が必要になります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Stack:
    def __init__(self) -> None:
        self.lis = []

    def pop(self):
        if self.lis:
            return self.lis.pop()
        return None

    def push(self, elem) -> None:
        self.lis.append(elem)



if __name__ == '__main__':
    stack = Stack()
    stack.push(1)
    stack.push(2)
    stack.push(3)
    stack.push(4)

    print(stack.pop())
    print(stack.pop())
    print(stack.pop())
    print(stack.pop())
    print(stack.pop())
1
2
3
4
5
4
3
2
1
None

キュー

最初に入れたデータが最初に取り出されるデータ構造のことです。データは格納した順序通りに取り出されます。このようなデータ構造のことをFIFO(First In First Out)とも呼びます。

キューに対する操作としてデータを格納する enqueue とデータを取り出す dequeue が必要になります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Queue(object):

    def __init__(self) -> None:

        self.stack1 = []
        self.stack2 = []

    def enqueue(self,element) -> None:
        self.stack1.append(element)

    def dequeue(self):

        if not self.stack2:
            while self.stack1:
                self.stack2.append(self.stack1.pop())

        if not self.stack2:
            return None

        return self.stack2.pop()

if __name__ == '__main__':
    queue = Queue()

    queue.enqueue(1)
    queue.enqueue(2)
    queue.enqueue(3)
    queue.enqueue(4)

    print(queue.dequeue())
    print(queue.dequeue())
    print(queue.dequeue())
    print(queue.dequeue())
    print(queue.dequeue())
1
2
3
4
5
1
2
3
4
None

Share