ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 원형큐 / 해시테이블 의사코드 정리
    @ 16. 1 ~ 17. 1/면접관련 2017. 1. 5. 07:05

    순환 대기열을 위해서는 적어도 두 개의 멤버 변수들이 필요하다. 하나는 대기열의 시작을 가리키는 색인이고,

    또 하나는 대기열 안에 들어 있는 항목들의 개수 이다.

    int m_front //시작가리키는 색인

    int m_count //대기열 안에 들어있는 항목들의 개수


    인큐함수

    최초의 빈 색인을 찾고 거기에 새 항목을 넣기만 하면된다. 최초의 빈 색인은 다음 공식으로 구할 수 있다.

    index = m_first + m_count;

    그러냐 이 공식은 index가 배열의 끝을 넘어갈 수가 있다. 만약에 0 ~ 7인덱스를 가지고 있는 크기의 큐라면

    567을 추가하고 8을 추가하게 될때 m_first + mcount = index가 8이 되므로. (0 + 8) 유효한 색인이 아니다 그래서

    8을 다시 0인덱스로 해야한다 그래서 나머지 연산자가 필요한것임..

    (m_first + m_count) % m_size(이 사이즈는 크기 - 1이 된다 인덱스 때문에..) 이렇게 하면 항상 0 ~ 7범위의 인덱스가 나오게 된다.

    그리고 인큐가 되면 m_count ++를 올리게 된다.


    디큐함수

    이건 간단함. 대기열이 비어있지 않으면 시작 색인을 1증가시키면 된다. 배열의 끝을 넘게 된다면 다시 0으로 설정한다.


    front함수

    가장 간단하다 m_front가 가리키는 항목을 반환하면 된다.




    연결 리스트를 사용하는 chaining 해쉬 테이블은 연결 리스트의 단점도 그래도 물려받아, 작은 데이터들을 저장할 때 연결 리스트 자체의 오버헤드가 부담이 되고 traverse의 캐쉬 효율도 좋지 않다. 대체 자료구조로서 최악의 경우에 O(n)이 아닌 O(log n)의 검색 복잡도를 보장하는 self-balancing tree를 고려해 볼 필요도 있다. 

    그러나 해쉬 테이블이 꽉 찰 정도로 운영되거나 상당히 높은 확률로 충돌이 발생하지 않는다면(저렇게 되지 않도록 하는 것이 가장 좋다), 통상적으로 리스트의 길이는 대부분 상당히 짧으며 모든 버켓이 2개 이상의 개체를 가지지도 않기 때문에 연결 리스트를 이용한 chained 해쉬 테이블로도 충분히 효과적이다


    그리고 데이터의 크기가 작을 때는 space 오버헤드를 줄이고 캐쉬 효율을 높이기 위해 연결 리스트 대신 dynamic array를 쓸 수도 있다


    http://egloos.zum.com/sweeper/v/925740


    유명한 해쉬함수의 종류

    https://seed.kisa.or.kr/iwt/ko/intro/EgovHashFunction.do


    문자열 해싱방법(단순)

    unsigned long int stringHash(const char* p_string)

    {
        unsigned long int hash = 0;

    int i;

    int length = strlen(p_string);


    for(int i =0; i < length; ++i)
    {

    hash += ((i * 1) * p_string[i]);

    }

    return hash;

    }

    각 문자열의 자리 인덱스를 이용해서 값을 계산 누적 활용하는것.



    해시 테이블에 자료를 넣을때는 자료와 그에 대한 키를 함께 넣어야 한다.

    해시 테이블에서 어떤 자료를 찾을 경우에는 자료의 키로 해시 테이블을 검색하고 그 키가 있는 곳의 자료를 얻는다.


    해시 테이블이 왜 소수여야 하는가?

    http://asfirstalways.tistory.com/332


    그래서 해시 테이블의 기본 자료클래스를 만들때 키값과 데이터를 포함해서 만든다.

    class hashEntry

    {

    public:

    int m_key;

    int data;

    };


Designed by Tistory.