#include <iostream>
#include <cstring>
#include <chrono>
#include <climits>

using namespace std;
//namespace chrono = std::chrono;

//시간 측정용 클래스입니다.
class Timer
{
public:
    void start() //타이머를 가동합니다.
    {
        start_point = chrono::system_clock::now();
    }

    void stop() //타이머를 중단합니다.
    {
        stop_point = chrono::system_clock::now();
    }

    void clear() //값을 초기화합니다.
    {
        start_point = chrono::time_point<chrono::system_clock>::min();
        stop_point = chrono::time_point<chrono::system_clock>::min();
    }

public:
    template<class seconds_t>
    long long get_time() const //측정 메서드의 템플릿입니다.
    {
        return chrono::duration_cast<seconds_t>(stop_point - start_point).count();
    }

    long long get_nano() const //나노세컨드 단위입니다.
    {
        return get_time<chrono::nanoseconds>();
    }

    long long get_micro() const //마이크로세컨드 단위입니다.
    {
        return get_time<chrono::microseconds>();
    }

    long long get_milli() const //밀리세컨드 단위입니다.
    {
        return get_time<chrono::milliseconds>();
    }

    long long get_seconds() const //세컨드 단위입니다.
    {
        return get_time<chrono::seconds>();
    }

    long long get_minutes() const //분 단위입니다.
    {
        return get_time<chrono::minutes>();
    }

    long long get_hours() const //시간 단위입니다.
    {
        return get_time<chrono::hours>();
    }

private:
    chrono::time_point<chrono::system_clock> start_point; //시작지점입니다.
    chrono::time_point<chrono::system_clock> stop_point; //중단지점입니다.

public:
    Timer() = default;
    Timer(const Timer&) = default;
    Timer(Timer&&) = default;
    Timer& operator= (const Timer&) = default;
    Timer& operator= (Timer&&) = default;
    virtual ~Timer() = default;

};

const char* mystrstr (const char * str1, const char * str2)
{
    char *cp = (char *) str1;
    char *s1, *s2;

    if ( !*str2 ) // *str2 != '\0' 
        return((char *)str1);

    while (*cp) // cp != NULL
    {
        s1 = cp;
        s2 = (char *) str2;


        while ( *s1 && *s2 && !(*s1-*s2) ) // (*s1 != '\0') && (*s2 != '\0') && (*s1 == *s2)
                s1++, s2++;

        if (!*s2) // *s2 == '\0'
                return(cp);

        cp++;
    }
    return(NULL);
}

const char* bf_match(const char* txt, const char* pat){
	int pt=0, pp=0;

	while(txt[pt] && pat[pp]){
		if(txt[pt]==pat[pp])
			pt++, pp++;
		else{
			pt=pt-pp+1;
			pp=0;
		}
	}

	if(!pat[pp])
		return txt+(pt-pp);

	return NULL;
}

const char* kmp_match(const char* txt, const char* pat){
	int pt=1, pp=0, skip[1024];

	skip[pt]=0;

	while(pat[pt]){
		if(pat[pt]==pat[pp])
			skip[++pt]=++pp;
		else if(pp==0)
			skip[++pt]=pp;
		else
			pp=skip[pp];
	}

	pt=pp=0;

	while(txt[pt] && pat[pp]){
		if(txt[pt]==pat[pp])
			pt++, pp++;
		else if(pp==0)
			pt++;
		else
			pp=skip[pp];
	}

	if(!pat[pp])
		return txt+(pt-pp);

	return NULL;

}

const char* bm_match(const char* txt, const char* pat){
	int pt, pp, txt_len=strlen(txt), pat_len=strlen(pat);

	int skip[UCHAR_MAX + 1];

	for(pt=0; pt<=UCHAR_MAX; pt++)
		skip[pt]=pat_len;

	for(pt=0; pt<pat_len-1; pt++)
		skip[pat[pt]]=pat_len-pt-1;

		

	while(pt<txt_len){
		pp=pat_len-1;
		while(txt[pt]==pat[pp]){
			if(!pp)
				return txt+pt;

			pp--;
			pt--;

		}
		pt+=(skip[txt[pt]] > pat_len-pp) ? skip[txt[pt]] : pat_len-pp;
	}

	return NULL;
}

int main() {
	// your code goes here
	const char* txt="KinggodZero";
	const char* pat="godZ";

	int len=strlen(pat);

	cout<<"원본 텍스트 : "<<txt<<'\n';

	Timer timer;
	timer.start();
	const char* rslt1=mystrstr(txt, pat);
	timer.stop();

	cout<<"mystrstr 함수\n";
	if(rslt1){
		cout<<"찾은 패턴 : ";
		for(int i=0;i<len;i++)
			cout<<rslt1[i];
		cout<<'\n';
	}
	else
		cout<<"패턴을 찾지 못하였습니다.\n";

	cout<<"수행시간 (nano second) : "<<timer.get_nano()<<" nanoseconds\n";

	timer.start();
	rslt1=strstr(txt, pat);
	timer.stop();

	cout<<"\nstrstr 함수\n";
	if(rslt1){
		cout<<"찾은 패턴 : ";
		for(int i=0;i<len;i++)
			cout<<rslt1[i];
		cout<<'\n';

	}
	else
		cout<<"패턴을 찾지 못하였습니다.\n";

	cout<<"수행시간 (nano second) : "<<timer.get_nano()<<" nanoseconds\n";

	timer.start();
	rslt1=bf_match(txt, pat);
	timer.stop();

	cout<<"\nbf_match 함수\n";

	if(rslt1){
		cout<<"찾은 패턴 : ";
		for(int i=0;i<len;i++)
			cout<<rslt1[i];
		cout<<'\n';
	}
	else
		cout<<"패턴을 찾지 못하였습니다.\n";

	cout<<"수행시간 (nano second) : "<<timer.get_nano()<<" nanoseconds\n";

	timer.start();
	rslt1=kmp_match(txt, pat);
	timer.stop();

	cout<<"\nkmp_match 함수\n";

	if(rslt1){
		cout<<"찾은 패턴 : ";
		for(int i=0;i<len;i++)
			cout<<rslt1[i];
		cout<<'\n';

	}
	else
		cout<<"패턴을 찾지 못하였습니다.\n";

	cout<<"수행시간 (nano second) : "<<timer.get_nano()<<" nanoseconds\n";

	timer.start();
	rslt1=bm_match(txt, pat);
	timer.stop();

	cout<<"\nbm_match 함수\n";

	if(rslt1){
		cout<<"찾은 패턴 : ";
		for(int i=0;i<len;i++)
			cout<<rslt1[i];
		cout<<'\n';
	}
	else
		cout<<"패턴을 찾지 못하였습니다.\n";

	cout<<"수행시간 (nano second) : "<<timer.get_nano()<<" nanoseconds\n";

	return 0;
}


'C,C++ 코드' 카테고리의 다른 글

single linked list  (0) 2018.12.25
하노이 탑 코드  (0) 2018.12.23
인라인 코드 테스트  (2) 2018.12.22
진자 운동 코드  (0) 2018.12.22
퀵 정렬 함수  (0) 2018.12.16
Posted by Semi Developer

블로그 이미지
C++ 코드 저장용도
Semi Developer

태그목록

Yesterday
Today
Total

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함