study2015. 1. 29. 11:05

문자열 검색 알고리즘 간단히 설명하면 문자열을 검색할 때 앞에서 부터 하는게 아니라 뒤에서 부터 시작하는 알고리즘이다.

비교를 하다가 문자가 다르다는 것을 알았다면, 그 문자가 검색키 문자열에 포함되어 있다면 그 만큼 이동함.

그 문자가 포함되어 있지 않다면 검색키 문자열 길이만큼 점프.

자세한건 아래 참고.

http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm

간단하게 C언어로 구현해 보았다.

#include <stdio.h>


#define MAXLEN 1000


int mystrlen(char *m)

{

int n = 0;

while (*m != '\0') {

*m++;

n++;

}

return n;

}


bool compareString(char s[], char k[], int idx, int keyLen, int* jumpIdx)

{

int last = keyLen-1;

bool matchFlag = true;


for (int i = (idx + last); i >= 0; i--)

{

//printf("s[%d]=(%c), key[%d]=(%c)\n", i, s[i], last, k[last]);


if (s[i] == k[last])

{

if (last == 0)

{

*jumpIdx = keyLen;

return true;

}

}

else {

for (int j = last-1; j >=0; j--)

{

if (k[j] == s[i])

{

*jumpIdx = keyLen-j-1;

return false;

}

}


*jumpIdx = keyLen;

return false;

}


last--;

}

return false;

}


void main()

{

char source[MAXLEN] = "tomato dog cat radio good";

char key[10] = "cat";

int keyLen = mystrlen(key);

for (int i = 0; source[i] != '\0';)

{

int jump = 0;


//printf("\n==>\n");

//for (int j = 0; j < keyLen && source[i + j] != '\0'; j++)

//{

// printf("%c", source[i + j]);

//}


//printf("\n");

//for (int j = 0; j < keyLen ; j++)

//{

// printf("%c", key[j]);

//}


//printf("\n==<\n");


bool a = compareString(source, key, i, keyLen, &jump);

if (a)

printf("match");


i += jump;

}

printf("n=%d", mystrlen(key));


printf("\n");

}





Posted by 평면우주
study2015. 1. 9. 15:39

#include <stdio.h>
#define MAX_LEN 10

void swap(int*a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}

int partition(int d[], int l, int r) //l is left, r is right.
{

int first = l;
int pivot = d[first];
++l; //shift.

while (l < r)

{
while (d[l] <= pivot)
++l;
while (d[r] > pivot)
--r;

if (l < r)
swap(&d[r], &d[l]);
else
break;
}

swap(&d[first], &d[r]);
return r;
}


int partition2(int d[], int l, int r) // p is pivot index.

{

int last = d[r];
int sortIdx = l;

for (int i = l; i <= r-1; i++)

{

if (d[i] <= last)
{
swap(&d[i], &d[sortIdx]);
sortIdx++;
}
}

swap(&d[sortIdx], &d[r]);
return sortIdx;

}

void qsort(int d[], int l, int r)

{
printf("l=%d, r=%d\n", l, r);

if (r > l){
//int idx = partition(d, l, r);
int idx = partition2(d, l, r);
qsort(d, l, idx - 1);
qsort(d, idx + 1, r);
}
}


int main()

{

int i = 1;

int j = 2;

int data[MAX_LEN] = { 3, 7, 8, 5, 2, 1, 9, 5, 4, 6};
qsort(data, 0, MAX_LEN-1);

for (int k = 0; k < MAX_LEN; k++)
     {
    printf("%d,", data[k]);

}

printf("\n%d\n", i);

}


분할 정복 알고리즘의 대표적인 소팅 알고리즘 partition 값을 구하는 방법은 전통적인 알고리즘 버젼과 MIT에서 제안한 방법 2가지 모두 구현해 보았다.

Posted by 평면우주
bicycle2014. 6. 2. 09:57

자전거로 출근 중 갑자기 자전거에서 잡소리가 나기 시작했다.


불규칙적으로 딱... 딱... 거리는 소리.


패달링을 하지 않고, 타력 주행 중에서도 소리가 난다. 


BB는 패달링을 해야지 잡소리가 나는 거라서 BB쪽 문제는 아닐거라고 확신하고.


처음엔 스포크 쪽에서 문제가 생긴거 아닐까? 점검했지만 스포크도 정상이고 휠 정렬도 양호한 상태였음.


바디도 물론 정상. 


심지어는 자전거를 끌고 가도 가끔 소리가 났다. 


딱딱 소리도, 보통은 딱..딱 이어서 나고, 종 종 딱... 한번만 나기도 했다.


휠 분해를 해서 점검을 하는데, 베어링이 이상하다는 것을 알게됨.


zipp 303 188 허브+ 바디 에는 베어링이 모두 4개가 들어 가는데 (2개는 허브, 2개는 바디.) 허브쪽 베어링을 손으로 굴리면 걸리는 느낌이 났다.


zipp 188 hub는 스위스에서 만든 61803 type 베이링을 쓴다. (http://www.zipp.com/support/identify/bearings.php)


이베이에서 zipp 베어링 가격이 2개 한 세트에 40달러. 2 세트 필요하니 총 80 달러에 살 수 도 있지만. 


한국 옥션에서 베어링을 검색 1개에 3천원 짜리 독일 61830 베어링을 구입했다.  (총 12000 원 + 2500(배송비)


샾에서 베어링을 교체했더니 소리가 싹 사라졌다. 


만약 위와 같은 사례라면 베어링도 의심 해보길.






Posted by 평면우주