LittleDeveloper

Week9_해시테이블_실습(2) 본문

알고리즘(C)

Week9_해시테이블_실습(2)

lemonjelly 2021. 11. 29. 10:23

2. 개방주소법으로 정리하기

 

[HOW? by pseudo code]

Alg findElement(k)

    input bucket array A[0,..,M-1], hash function h, key k

    output element with key k

1. v<--h(k)

2. i <--0

3. while(i<M) 

     b<--getNextBucket(v, i)

     if(isEmpty(A[b]))

           return NoSuchKey

     elseif(k=key(A[b])

           return element(A[b])

     else

           i<--i+1

4. return NoSuckKey

 

Alg insertItem(k, e)

1. v<--h(k)

2. i<--0

3. while(i<M)

      b<--getNextBucket(v, i)

      if(isEmpty(A[b]))

          Set bucket A[b] to (k, e)

      else 

          i <--i+1

4. overflowException()

5. return

 

<--선형조사법-->

Alg getNextBucket(v, i)

1. return (v+i)%M

 

<--2차조사법-->

Alg getNextBucket(v, i)

1. return (v+i^2)%M

 

<--이중해싱-->

Alg getNextBucket(v, i)

1. return (v+i*h'(k))%M

 

Alg initBucketArray()

   input bucket array A[0,..,M-1]

   output bucket array A[0,...,M-1] initialized with null buckets

1. for i<--0 to M-1

         A[i].empty<--1

2. return

 

Alg isEmpty(b)

   input bucket b

   output boolean

1. return b.empty

 


 

 

STEP1) 변수 선언

int *hash, M; //해시테이블, 배열 크기 선언

STEP2) 해시 함수 & 조사 방식

int h(int x){
  return x % M;
}
int getNextBucket(int v, int i){
        return (v+i) % M; //선형조사법
}
int getNextBucket(int v, int i) {
	return (v + i*i) % M; //2차조사법
}

STEP2-1) 이중해싱인 경우

int* hashTable, M,n,q;

int h(int x) {
	return x % M;

}
int h2(int x) {
	return q - (x % q);
}

int getNextBucket(int v, int i, int k) {
	return (v + i*h2(k)%M) % M;

} 
//이중해싱

 

STEP3) 삽입

실습 2번 예시

void insertItem(int x) {
	int v = h(x, M);
	int i = 0,b;
	while (i < M) {
		b = getNextBucket(v, i); //다음 셀로 이동
		if (hash[b] == 0) { //비어있는 셀 발견
			hash[b] = x;

			for (int j = 0; j < i; j++) printf("C"); //충돌 발생
			printf("%d\n", b);
			return;
		}
		else {
			i += 1;
		}

	}
}

STEP3-1) 이중해싱 삽입 // 위와 동일

 

STEP4) 탐색

void searchItem(int x) {
	int v = h(x, M);
	int i = 0, b;
	while (i < M) {
		b = getNextBucket(v, i);
		if (hash[b] == 0) {
			printf("-1\n");
			return;
		}
		else if(hash[b]==x) {
			printf("%d %d\n", b, x); //주소와 키 출력
			return;
		}
		else {
			i += 1;
		}
	}
}

STEP4-1) 이중해싱 탐색

void searchItem(int k) {

	int v = h(k), i = 0, b;
	while (i < M) {

		b = getNextBucket(v, i,k);
		if (hashTable[b] == 0) {
			printf("-1\n");
			return;
		}

		else if (hashTable[b] == k) {
			printf("%d %d\n", b, hashTable[b]);
			return;

		}

		else i = i + 1;

	}
	printf("-1\n");

}

 

STEP5) 해시테이블 초기화 & main함수

int main() {
	int n, key;
	char ch;
	scanf("%d %d", &M, &n);
	hash = (int*)malloc(M*sizeof(int));
	for (int i = 0; i < M; i++) {
		hash[i] = 0; //0으로 초기화
	}
	while (1) {
		scanf("%c", &ch);
		
		if (ch == 'i') {
			scanf("%d", &key);
			getchar();
			insertItem(key);
		}
		else if (ch == 's') {
			scanf("%d", &key);
			getchar();
			searchItem(key);
		}
		else if (ch == 'e') {
			break;
		}
	}
	return 0;
}

 

 

 

 

 

 

 

 

'알고리즘(C)' 카테고리의 다른 글

Week11_그래프순회_DFS_실습  (0) 2021.12.02
Week10_그래프_실습  (0) 2021.12.01
Week9_해시테이블_실습(1)  (0) 2021.11.29
Week10_ 그래프  (0) 2021.11.05
Week7_해시테이블(1)  (0) 2021.10.27