ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 연결 리스트를 이용한 순차 검색
    Computer Science/Data Structure 2021. 9. 24. 12:31

    Symbol Table이란?

    (키, 값) 쌍이 모인 자료구조

    특정 키와 그 키에 해당되는 값의 쌍을 삽입할 수 있다.

    키가 주어질 때, 관련된 값을 검색할 수 있다.


    연결 리스트를 이용한 Symbol Table의 동작 방법


    구현 방법

    노드의 구성
    class Node<K, V> {
    	K key;
    	V value;
    	Node<K, V> next;
    
    	public Node(K key, V value, Node<K, V> next) {
    		this.key = key;
    		this.value = value;
    		this.next = next;
    	}
    }

    ㆍ 노드는 키, 값, 다음 노드를 가리키는 참조로 구성되어 있다.

     

    Symbol Table의 기본 구성
    public class SequentialSearchST<K, V> {
    	private Node<K, V> first;
    	int N;
    }

    ㆍ 첫 번째 노드에 대한 참조 변수인 first가 있다.
    ㆍ 연결 리스트의 노드 수에 대한 변수인 N이 있다.

     

    get() 메서드
    public V get(K key) {
    	for (Node<K, V> x = first; x != null; x = x.next)
    		if (key.equals(x.key))
    			return x.value;
    
    	return null;
    }

    ㆍ 연결 리스트를 처음부터 스캔한다.
    ㆍ 검색하고자 하는 키를 찾았으면 키에 대응하는 값을 리턴한다.
    ㆍ 찾지 못했으면 null을 리턴한다.

     

    put() 메서드
    public void put(K key, V value) {
    	for (Node<K, V> x = first; x != null; x = x.next)
    		if (key.equals(x.key)) {
    			x.value = value;
    			return;
    		}
    	first = new Node<K, V>(key, value, first);
    	N++;
    }

    ㆍ 연결 리스트를 처음부터 스캔한다.
    ㆍ 만약 해당 키가 있을 경우 값만 바꾼다.
    ㆍ 해당 키가 없을 경우 새로운 (키, 값) 쌍을 추가하고, 전체 노드의 수를 1 증가시킨다.

     

    delete() 메서드
    public void delete(K key) {
    	if (key.equals(first.key)) { 
    		first = first.next;
    		N--;
    		return;
    	}
    
    	for (Node<K, V> x = first; x.next != null; x = x.next) {
    		if (key.equals(x.next.key)) {
    			x.next = x.next.next;
    			N--;
    			return;
    		}
    	}
    }

    ㆍ 첫 번째 노드의 키가 삭제할 키와 일치한다면 첫 번째 노드를 삭제한다.
    ㆍ 첫 번째 노드를 삭제하지 않는 경우는 연결 리스트를 처음부터 스캔하고, 삭제할 노드를 찾는다.

     

    keys() 메서드
    public Iterable<K> keys() {
    	ArrayList<K> keyList = new ArrayList<K>(N);
    
    	for (Node<K, V> x = first; x != null; x = x.next)
    		keyList.add(x.key);
    	return keyList;
    }

    ㆍ 연결 리스트의 Iterable을 반환하는 메서드이다.
    ㆍ 연결 리스트의 처음부터 끝까지 순회하며, 키를 ArrayList에 추가한다.
    ㆍ 마지막에는 연결 리스트의 모든 키가 추가된 ArrayList를 반환한다.

     

    contains() 메서드
    public boolean contains(K key) {
    	return get(key) != null;
    }

    ㆍ get( ) 메서드의 반환 값을 판단하여 키의 포함 여부를 알아낸다.

     

    isEmpty() 메서드
    public boolean isEmpty() {
    	return N == 0;
    }

    ㆍ 연결 리스트의 노드 개수를 판단하여 빈 연결 리스트인지 알아낸다.

     

    size() 메서드
    public int size() {
    	return N;
    }

    ㆍ 연결 리스트의 노드 개수를 반환함으로써 연결 리스트의 크기를 알아낸다.


    참고 문헌 및 자료

    R.Sedgewick and K. Wayne, Algorithms (4th Ed.), Addison-Wesley.

    E. Horowitz, S. Sahni, S. Anderson-Freed, Fundamentals of Data Structures in C, Silicon Press, 2nd Edition.

    https://algs4.cs.princeton.edu/31elementary/


     

    GitHub - qlsdud0604/algorithm-study: 자료구조 및 알고리즘 공부 기록 공간

    :books: 자료구조 및 알고리즘 공부 기록 공간. Contribute to qlsdud0604/algorithm-study development by creating an account on GitHub.

    github.com

     

    728x90

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

    AVL 트리  (0) 2021.09.24
    이진 검색 트리  (0) 2021.09.24
    배열을 이용한 이진 검색  (0) 2021.09.24

    댓글

Designed by Tistory.