unta   1년 전

C에서 직접 해시 맵을 구현해서 풀이를 해보고 있습니다.

그런데 보기에는 잘못될 구석이 없고 테스트 케이스에서도 정상적으로 동작하는 것을 확인했는데 33% 부근에서 Out of Bound 처리가 되어서 제가 놓친 부분이 있을까 싶어 질문 올립니다.


조건문과 exit(1)을 이용하면 특정 구문에서 조건이 만족할 때 NEZC를 발생시켜 문제가 되는 지점을 추측해볼 수 있습니다.

이를 이용해 배열의 인덱스가 초과될 법한 부분을 확인해 보았지만 그럴 듯한 결론을 내지 못하고 있습니다.

문제가 될 것 같은 부분을 대강 추려보자면,

    해싱에서 TABLE_SIZE 이상의 인덱스를 반환 -> % 연산으로 범위를 제한하므로 문제 없음.

    닫힌 주소 기법에 의한 sub_index의 SUB_TABLE_SIZE 이상의 인덱스 -> 주어진 입력의 개수에 맞추어 설정했으므로 문제 없음.

    기타 문자열 관련 인덱스 문제 (최대 20일 때 '\0'를 고려하지 않고 문자열의 길이를 20으로 설정 등) -> 추가로 확인했지만 문제 없음.

    + 배열의 크기 등을 넉넉하게 설정하여 재시도해도 동일한 문제 발생.

으로 감을 못잡고 있는 상태입니다.


감사합니다.

Out of Bounds 발생: http://boj.kr/ba525453095047c1...

동일한 내용을 C++의 라이브러리를 활용해 풀이: http://boj.kr/fb159725fefc4816...

unta   1년 전

위의 글을 쓰면서 문득 해시값이 오버플로로 인해 음수가 될 수도 있다는 생각을 했습니다.

확인해보니 오버플로가 발생하여 인덱스가 음수가 됨을 확인하고 unsigned 형을 이용해 문제를 해결했습니다.

그렇다면 hash 함수에서 음수가 발생하지 않도록 조치하는 방법에는 어떤 것이 있을까요?

(첨부한 소스는 unsigned를 이용해 문제를 해결한 소스입니다.)

*사용한 hash 함수는 백준 문제 중 하나인 Hashing에서의 함수를 이용했습니다.

해당 문제에서도 오버플로를 방지하는 차원에서 mod 연산자를 이용했습니다. 때문에 더 큰 입력에 대해서도 큰 문제가 없을 거라고 생각했는데 아니었군요.

해결한 C 소스: http://boj.kr/b567a3eeda964aad...

Hashing: http://boj.kr/b567a3eeda964aad...

댓글을 작성하려면 로그인해야 합니다.