ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [묘공단] 코딩 테스트 합격자 되기 4주차
    [묘공단] 코딩 테스트 합격자 되기 책 정리 2024. 5. 6. 22:14

    이 글은 책 코딩테스트 합격자 되기 - 자바편 (골든래빗 - 김희성저)의 내용이 포함되어있습니다.

     

    해시

    - 해시는 해시 함수를 사용하여 변환한 값을 인덱스로 삼아 키와 값을 저장해서 빠른 데이터 탐색을 제공하는 자료구조 이다

    - 해시는 키를 이용해서 데이터 탐색에서 빠르다는 장점이 있다

     

     

    특징

     

    - 키 자체가 해시 함수에 의해 값이 있는 인덱스가 되므로 값을 찾기 위한 탐색 과정이 없다

    - 단방향으로만 검색할 수 있는 대신 빠르게 원하는 값을 검색 할 수 있다

    - O(1)으로 동작

    - 값을 적절하게 변환해야 인덱스로 사용 가능

     

     

     

    해시 함수

     

    우선 해시 함수를 구현할 때 고려할 사항

     

    1. 해시 함수가 변환한 값은 인덱스로 활용해야 하므로 해시 테이블의 크기를 넘으면 안된다

    2. 해시 함수가 변환한 값의 충돌은 최대한 적게 발생해야 한다

    -> 서로 다른 두 키에 대해 해싱 함수를 적용한 결과가 동일한 것을 의미

     

     

    나눗셈법

     

    - 키를 소수로 나눈 나머지를 활용한다

    수식 -> h(x) = x mod k (x 는 키 , k 는 소수)

    # 소수를 사용하는 이유

    - 해시 값의 충돌을 줄이기 위해

    - 해시 테이블의 크기가 k로 고정된다

     

    단점은 매우 큰 소수를 구하는 효율적인 방법이 없어서 필요한 경우 기계적인 방법으로 구해야 한다

     

     

     

    곱셈법

     

    - 나눗셈과 비슷하게 모듈러 연산활용

    - 소수 사용은 안한다

    수식 -> h(x)=(((xA) mod 1)m)  (m은 해시테이블 크기, A는 황금비 0.6183)

     

    - 수식 처럼 키에 황금비를 곱해서 소수 부분을 취해 m을 곱하여 정수부분만 취한 값으로 매핑한다

     

     

    지금까지 숫자로만 했지만 키의 자료형이 문자열일 때에 대해서 알아 보겠습니다

     

     

     

    문자열 해싱 

     

    - 문자열의 값을 숫자로 변환하고, 이것을 다항식의 값으로 변환

     

    -> p를 31로 정한 이유는 홀수이면서 메르센 소수이기 때문

     

    - 문자열이 길 수록, 함수 값이 필요한 해시테이블에 비해서 매우 커져서 오버플로우가 발생할 가능성 있음

     

     

    충돌 처리

    - 서로 다른 키에 대해서 해시 함수의 결과값이 같으면 collsion(충돌) 이라고 한다

    - 해시 테이블을 관리할 때는 반드시 충돌 처리를 해야 한다

     

     

    1) 체이닝 처리

    • 충돌이 발생하면 해당 버킷리스트에 링크드 리스트로 같은 해시값을 가지는 데이터를 연결
    • 단점
      - 해시테이블 공간 활용성 저하
      - 검색 성능 저하 : N개의 링크드리스트 검색은 O(N)

     

    2) 개방주소법

    • 빈 버킷을 찾아 충돌한 값 저장
    • 해시 테이블을 최대한 활용하므로 체이닝보다 메모리를 더 효율적으로 사용한다

    ① 선형 탐사 방식

    • 충돌이 발생하면, 다른 빈 버킷을 찾아 일정한 간격으로 이동 (보통 1씩 이동)


    ② 이중 해싱 방식

    • 해시함수 2개 사용
    • 두번째 해시함수는, 첫번째 해시함수에서 충돌이 발생하면 해당 해시값을 기준으로 위치를 결정
    • 클러스터를 줄이기 위해 m을 제곱수나 소수로 사용

     

    해시맵

    - 해시맵을 위한 HashTable 클래스와 HashMap 클래스가 있다

    두 클래스는 유사하지만 HashTable 클래스는 자바의 초기 버전과 호환성을 위해 남겨두었을 뿐 최근에는 잘 사용되지 않는다

     

    구분 정의  설명
    연산 valueType put (keyType key , valueType value) 해시맵에 데이터를 저장
    valueType get (keyType key) key값에 대한 value 값 반환
    valueType remove (keyType key) key에 해당하는 데이터 삭제
    boolean contains (keyType key) key가 있다면 true, 없으면 false 반환
    void clear() 모든 데이터 삭제
    상태 int isEmpty() 해시맵이 비어있는지 비어있다면 true, 데이터가 있ㅇ으면 false 반환
    int size() 데이터 갯수 반환

     

     

     

     

     

     

    출처

     

    https://goldenrabbit.co.kr/product/javapass/

     

    [되기] 코딩 테스트 합격자 되기(자바 편) - 골든래빗

    신입 사원 코딩 테스트를 준비하고 계신가요? 코딩 테스트는 문제만 열심히 푼다고 통과할 수 없습니다. 시험은 전략적으로 준비해야 합니다. 《코딩 테스트 합격자 되기》(자바 편)은 신입 사

    goldenrabbit.co.kr

     

Designed by Tistory.