박오이님
무미건조한 개발자
박오이님
전체 방문자
오늘
어제
  • 뭥미 (101)
    • 프로젝트 (8)
      • 자가 보호 (3)
      • 주식 시장 분석 도구 (5)
    • 보안 (7)
      • 개론 (2)
      • 웹 (2)
      • 시스템 (2)
    • 개발 (69)
      • C++ (12)
      • Win32 (7)
      • MFC (2)
      • 자료구조 (8)
      • 알고리즘 (22)
      • 백준 (9)
      • 프로그래머스 (4)
      • LeetCode (0)
      • 개발자 면접 준비 (4)
      • OpenGL (1)
    • 서적 (13)
      • Effective C++ (9)
      • Effective Modern C++ (4)
    • 관심사 (4)
      • 재테크 (4)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • Functional
  • 윈도우프로그래밍
  • 백준 #알고리즘 #플로이드와샬 #DFS #BFS #C #C++
  • vcpkg
  • 동빈나
  • 알고리즘
  • 합집합찾기
  • 최소간선비용
  • CPP
  • C++
  • 프로세스메모리
  • std
  • 윈도우시스템프로그래밍
  • JSON
  • 코딩컨벤션
  • 개발
  • 플로이드와샬알고리즘 #최단경로 #백준 #알고리즘 #개발 #C #C++
  • jsoncpp
  • DFS #BFS #알고리즘 #프로그래밍 #코딩테스트 #코딩 #C++ #C
  • EffectiveC++
  • 나동빈 #알고리즘 #동빈나
  • 안경잡이개발자
  • 에라토스테네스의 체 #알고리즘 #개발 #C #C++ #소수 #소수판별
  • 에라토스테네스의 체 #C #C++ #개발 #알고리즘 #BFS #DFS #백준 #백준알고리즘
  • 시스템프로그래밍
  • 나동빈
  • 윈도우
  • 크루스칼알고리즘
  • 윈도우개발자
  • C

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
박오이님

무미건조한 개발자

개발/알고리즘

라빈 카프(Rabin-Karp)알고리즘

2019. 6. 14. 19:19

일반적인 경우 빠르게 작동하는 간단한 구조의 문자열 매칭 알고리즘이다.

 

라빈 카프알고리즘의 특징 중 해시를 사용한다는 것이다.

 

여기서 해시를 알고가야하는데,

해시는 일반적으로 긴 데이터를 짧은 데이터로 바꿔주는 특징을 가지고 있다.

참고로 단순 해시 알고리즘의 경우는 연산 속도는 O(1) 달하고 있다.

 

라빈 카프 알고리즘은 문자열의 해시 값을 비교하여 그 일치 여부를 검사하는 알고리즘.

 

0. 각 문자의 아스키코드 값에 2의 제곱 수를 차례대로 곱하여 더해준다.

--> 이러한 경우에는 강한 충돌성을 보여준다.

충돌이 발생하면? 포인터를 이용해 연결 자료구조를 이용해 해결한다고 한다.

 

문자열을 시작 인덱스에서 한칸 한칸 옆으로 옮겨가며 해시값을 구하고, 패턴의 해시값을 비교한다.

--> 한칸 한칸 옆으로 옮겨가면서 해시값을 구하면 얼마나 오래걸릴까? 생각을 할 수 있다.

 

긴 글 해시 값 = 2 * (긴 글 해시 값 - 가장 앞에 있는 문자의 수치) + 새롭게 들어온 문자의 수치

 

#include <iostream>

using namespace std;

void findString(string parent, string pattern)
{
	int parentSize = parent.size();
	int patternSize = pattern.size();

	int parentHash = 0, patternHash = 0, power = 1;

	for (int i = 0; i <= parentSize - patternSize; i++)
	{
		if (i == 0)
		{
			for (int j = 0; j < patternSize; j++)
			{
				parentHash += parent[patternSize - 1 - j] * power;
				patternHash += pattern[patternSize - 1 - j] * power;
				if (j < patternSize - 1)
				{
					power *= 2;
				}
			}
		}
		else
		{
			parentHash = 2 * (parentHash - parent[i - 1] * power) + parent[patternSize - 1 + i];
		}

		if (parentHash == patternHash)
		{
			bool finded = true;
			for (int j = 0; j < patternSize; j++)
			{
				if (parent[i + j] != pattern[j])
				{
					finded = false;
					break;
				}
			}

			if (finded)
			{
				printf("%d번째에서 발견했습니다.\n", i+1);
			}
		}
	}
}

int main(void)
{
	string parent = "ababacabacaabacaaba";
	string pattern = "abacaaba";

	findString(parent, pattern);

	return 0;
}

'개발 > 알고리즘' 카테고리의 다른 글

너비 우선 탐색(Breadth First Search, BFS)  (0) 2019.06.25
그리디(Greedy) 알고리즘  (0) 2019.06.14
KMP(Knuth-Morris-Pratt)알고리즘  (0) 2019.06.14
계수 정렬(Counting Sort)  (0) 2019.06.13
힙 정렬(Heap Sort)  (0) 2019.06.12
    '개발/알고리즘' 카테고리의 다른 글
    • 너비 우선 탐색(Breadth First Search, BFS)
    • 그리디(Greedy) 알고리즘
    • KMP(Knuth-Morris-Pratt)알고리즘
    • 계수 정렬(Counting Sort)
    박오이님
    박오이님
    긍정도 아니고 부정도 아닌 0

    티스토리툴바