Hash Table, ArrayList

2021. 7. 19. 16:22CSE/Data Structure

1. Linked List를 이용한 Hash Table 구현 (Python)

이 경우에서 최악의 경우에는 O(N)이고 최적의 경우는 O(1)이다.

class Node:
    def __init__(self, data, prevnode = None, nextnode = None):
        self.data = data
        self.prevnode = prevnode
        self.nextnode = nextnode

class LinkedList:
    def __init__(self, root = None):
        self.root = root

    def insert(self, data):
        now = self.root

        if self.root == None:
            self.root = Node(data)
        
        else:
            while now.nextnode != None:
                now = now.nextnode

            newNode = Node(data,now)

            now.nextNode = newNode

    def search(self, data):
        now = self.root

        while now != None:
            if now.data == data:
                return now
            else:
                now = now.nextnode

        return None

    def delete(self,data):
        now = self.root

        while now != None:
            if now.data == data:
                if now == self.root:
                    self.root = None
                    return True
                else:
                    now.prevnode.nextnode = now.nextnode
                    return True
            else:
                now = now.nextnode

        return False

class HashTable:
    def __init__(self,n):
        self.arrays = [LinkedList() for _ in range(n)]
        self.n = n

    def insert(self,value):
        hashvalue = hash(value)
        index = hashvalue%self.n
        self.arrays[index].insert(value)

    def search(self,value):
        hashvalue = hash(value)
        index = hashvalue%self.n
        return self.arrays[index].search(value)

    def delete(self,value):
        hashvalue = hash(value)
        index = hashvalue%self.n
        return self.arrays[index].delete(value)

 

* 또 다른 구현법으로는 Balanced Binary Search Tree를 이용하는 방법이다. 이 경우에는 O(logN)이 되고, 미리 배열의 크기를 할당하지 않아도 되기 때문에, 잠재적으로 적은 공간을 사용한다는 장점이 있다.

 

2. ArrayList 구현 (Java)

: 중간에 배열 길이를 두 배 하는 경우가 있지만, 평균적으로 각 insert는 O(1)이 소요된다.

class ArrayList {
    Object[] array = null;
    int capacity = 0;
    int size = 0;

    ArrayList(int capacity){
        this.capacity = capacity;
        array = new Object[capacity];
        this.size = 0;
    }

    boolean doubleArray(){
        try{
            Object[] newArray = new Object[capacity*2];
            this.capacity = this.capacity * 2;
            System.arraycopy(this.array, 0, newArray, 0, this.array.length);
            this.array = newArray;
        }catch(Exception e){
            return false;
        }
        return true;
    }

    boolean insertFront(Object value){
        if(this.size + 1 >= this.capacity){
            boolean result = doubleArray();
            if (result == false){
                return false;
            }
        }

        /*
        for(int i = this.size; i>=0; i--){
            this.array[i] = this.array[i-1];
        }
        */

        System.arraycopy(this.array,0,this.array,1,this.size);

        this.array[0] = value;
        this.size += 1;
        return true;
    }

    boolean insertEnd(Object value){
        if(this.size >= this.capacity){
            boolean result = doubleArray();
            if (result == false){
                return false;
            }
        }

        this.array[this.size] = value;
        this.size += 1;

        return true;
    }

    boolean insert(int index, Object value) {
        if (this.size + 1 >= this.capacity) {
            boolean result = doubleArray();
            if (result == false) {
                return false;
            }
        }

        System.arraycopy(this.array, index, this.array, index + 1, this.size - index);
        this.array[index] = value;
        this.size += 1;
        return true;
    }

    boolean delete(Object value){
        int index = 0;

        for (index = 0; index<=this.size; index++){
            if (this.array[index] == value){
                break;
            }
        }

        if (index > this.size){
            return false;
        }

        System.arraycopy(this.array,index, this.array, index-1, this.size-index);
        this.size -= 1;
        this.array[this.size] = null;
        return true;
    }
}

'CSE > Data Structure' 카테고리의 다른 글

04. Queue  (0) 2020.02.02
03. Stack  (0) 2020.01.21
02. 이진 검색(Binary Search)  (0) 2019.08.21
01. 선형 검색 (Linear Search)  (0) 2019.08.21