예를 들어, abc --> a, b, c, ab, bc, ac, abc

#include <stdio.h>
#include <string.h>


void swap(char *p1, char *p2)
{
     char t;

     t = *p1;
     *p1 = *p2;
     *p2 = t;
}


void perm(char *in, int st, int en)
{
    int j = 0;

    if( st == en) {
        for( j = 0; j < en; j++)
            printf("%c", in[j]);
        printf("\n");
    }
    else {
        /* in[st]에서 in[en]까지에 둘 이상의 순열이 있으면 이것을 순환적으로 생성 */
        for( j = st; j < en; j++) {
            SWAP(&in[st], &in[j]);
            perm(in, st+1, en);
            /* 인덱스 i와 인덱스 j의 데이터 위치의 위치 교환을 위해 원래 위치로 복귀*/
            SWAP(&in[st], &in[j]);
        }
    }

}
블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,
주어진 Query로 각 Document가 해당 Query에 적합할 확률을 베이지언 룰을 활용하여 계산하는데,
독립가정을 전제로 베이지언 룰을 이용하여, 비연관문서 집합에서 질의가 포함될 확률에 대한
연관 집합에 포함될 확률을 계산하여 문서를 찾는 모델링이다.

장점 : 문서들이 질의에 대하여 적합할 확률의 순서에 내림 차순으로 랭크된다.
단점 : 비연관 문서와 연관 문서 집합의 초기의 결과 집합을 가정해야만 한다.
         불린 모델과 같이 가중치가 없어서 색인어의 빈도수에 대한 가중치를 부여할 수가 없다. (오카피 모델에서 적용)
       색인어들에 대한 상호 독립 가정을 전제로 한다.


블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,
불리언 모델은 간결하며, 빠르지만 문서 유사도를 계산할 수 없다는 단점이 있다.
불리언 모델은 사용자 질의 처리를 위한 단순한 방법을 제공한다.
검색서비스에서도 사용자 질의 처리기는 불리언 모델을 사용해서 분석하고
검색결과는 Vector Space Model을 사용하는 형식으로 구성이 된다.

즉, Extended Boolean Model은
Boolean Model을 기반으로 해서 Vector Space Model(VSM)의 유사도 계산 기법을 이용하여 가중치를 부여할 수 없다는 단점을 해결하는데 초점이 맞추어져 있다.

Document Term Weight간의 유클리드 거리를 구해서 유사도를 찾아내며
이것은 Vector Space Model(VSM)의 TF*IDF 모델을 사용해서 구한다.

자세한 내용은 파일을 다운받아 보시길...

1. Definition
2. Boolean OR
3. Boolean AND
4. Normalized
5. P-Norm
6. AND OR 조합
7. Features

블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,

이 모델은 집합이론에 근거한 불리언 로직을 이용해서 질의어와 문서를 색인어의 집합으로 표현하는 모델이다.

불리언 모델은 사용자 쿼리로부터 주어진 Term을 포함한 문서를 찾는다고 하면,
해당 문서가 Term을 포함하고 있는지(true), 아닌지(false)에 대한 정보만을 가지고 문서를 찾아낸다.
매우 단순하고 효율적이며 빠른 구현이 가능하나, 사용자의 의도를 정확하게 파악하지 못하는 단점도 있다.

자세한 내용은 파일 다운 받아 보시길...

1. Definition
2. Query
3. Extension of Query
4. Limitations

블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,

정보검색 개요를 작성한지 한참 만에 벡터 스페이스 모델에 대해서 정리를 했습니다.

벡터 스페이스 모델은 불리언 모델, 확률 모델과 더불어 검색 모델에 있어서 아주 중요한 부분입니다.

Term vector model이라고도 불리우며 정보 필터링, 정보검색, 색인과 유사도를 계산하기 위한 대수 모델입니다.
이 모델은 SMART Information Retrieval System에서 가장 먼저 언급이 되었으며,
무료 검색엔진인 루씬에서 이 모델을 기본적으로 사용하고 있습니다.


벡터공간 모델 상에서 각 도큐먼트들과 질문자들은 n차원 공간 속의 벡터들로 취급되며,
이때 각 차원들은 색인용어들로 표현된다.
이 기법에 의한 검색 절차는 다음과 같다.
1) 용어의 가중치는 정규화된 도큐먼트내의 빈도(TF)와 이의 역빈도수(IDF)를 조합하여 게산
2) "낮은 식별치(poor discrimination value)의 값을 지닌 용어들은 시소러스내의 저 빈도용어들로 대치되며
   구의 경우 고빈도 용어들로 대체된다.
3) 각 도큐먼트들은 이용자 질문에 대해서 그 유사성의 순위별로 출력되며, 이러한 과정은 코사인 상관도에
   의해 계산된다. (벡터 공간 내에서 이용자의 질의에 가장 근접해 있는 도큐먼트들을 직관적으로 검색해낸다.)


자세한 내용은 다운받아 보시길...

1. Definition
2. Applications
3. Examples
4. Limitations
5. Reference
6. Models based on and extending the vector space model

블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,

검색엔진의 주로 벡터 스페이스 모델에 사용되는 용어입니다.

1. TF (Term Frequency) : 하나의 문서 안에서의 Term의 출현 횟수
2. CF (Collection Frequency) : 하나의 콜렉션 안에서의 Term의 총 출현 횟수
3. DF (Document Frequency) : 하나의 콜렉션 안에서 Term이 출현한 문서의 개수
4. IDF (Inverse Document Frequency) : DF의 역수
5. TF * IDF : TF가 크고, DF가 작을수록 가중치는 커진다,
                  이것은 전체 문서에서 공통적으로 등장하는 단어들은 걸러지게 된다.
                 특정 문서에서 어떤 단어의 중요도를 평가하기 위해 사용되는 통계적인 수치.

예) 만약, 100개의 단어로 이루어진 어떤 문서에 단어 search가 3번 등장한다면,
     단어 search의 TF는 0.03 (= 3 / 100)이고,
     또한, 전체 10,000,000개의 문서 중에서 단어 search가 들어 있는 문서들의 숫자가 1,000개라면,
     DF는 0.0001 (= 1,000/10,000,000)이며 최종 TF*IDF 가중치는 300 ( = 0.03 * 1/0.0001)이 된다.

     이러한 것이 가장 기본적인 것이며, DF에 로그를 취하는 방법도 있으며, 여러가지 방법이 있을 것이다.
     만약 자연로그를 취한다면 IDF는 9.21 ( log(10,000,000/1,000))가 되고,
     TF*IDF 가중치는 0.27 (= 0.03 * 9.21)이 된다.

블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,
1. mmap이란?
   메모리의 내용을 파일이나 디바이스에 대응하기 위해서 사용하는 시스템 호출이다.

2. 메모리 관리
   프로세스 메모리는 기본적으로 다른 프로세스 메모리와 공유되지 않는다. 이것은 프로세스의 데이터를
   보호하기 위해서 반드시 필요한 기능이긴 하지만 다른 프로세스와 특정 데이터를 공유하기 위해서는
   귀찮은 기능이 되기도 한다.
   이 때문에 IPC를 사용하게 된다.
   mmap은 메모리의 특정영역을 파일로 대응시킬 수 있도록 도아준다.
   파일은 시스템 전역적인 개체이므로 다른 프로세스에서 접근가능하도록 할 수 있으면,
   이러한 mmap의 특징 때문에 IPC용도로 사용가능하다.
   (mmap이 IPC용도로 사용가능하지만 IPC 설비는 아니다.)

   ==> mmap은 프로세스의 주소공간을 파일에 대응시킨다.
        파일은 운영체제 전역적인 자원이므로 당연히 어렵잖게 다른 프로세스와 공유해서 사용할 수 있을 것이다.

3. 활용용도
   1. 메모리의 내용을 파일에 대응시킬 수 있다면 프로세스간 데이터의 교환을 위한 용도로 사용가능 할 것이다.
      접근 제어를 통해 프로세스간 공유하고자 하는 데이터를 파일에 대응시키고 이것을 읽고 쓰면 된다.
   2. 성능향상.
      고전적인 방법은 파일지정자를 얻어서 직접 입출력하는 방식으로 open, read, write, lseek와 같은 함수를
      이용하나, 상당한 비용을 지불.

4. 사용방법
   void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
   int munmap(void *start, size_t length);

   1. start
      메모리 영역에 파일을 대응시킬 시작 offset
   2. length
      start부터 length만큼 대응
   3. prot
      a. PROT_EXEC  : 페이지에 실행될 수 있다.
      b. PROT_READ  : 페이지는 읽혀질 수 있다.
      c. PROT_WIRTE : 페이지는 쓸 수 있다.
      d. PROT_NONE : 페이지를 접근할 수 없다.
   4. flags
     a. MAP_FIXED
     b. MAP_SHARED
        대응되는 객체를 다른 프로세스도 공유할 수 있게 만들어준다.
        프로세스들은 객체에 대해서 동등한 권한을 가지게 되고 이로 인해 동기화가 필요하며, 이를 위해
        msync(), munmap()가 사용
     c. MAP_PRIVATE
        --> MAP_SHARED와 MAP_PRIVATE 둘 중 하나는 반드시 사용해야 한다.
   5. fd
      file descriptor
   6. offset
      대응할 때 파일의 위치를 지정..
      파일의 처음이라면 0
    
5. 성능 비교
   http://developers.sun.com/solaris/articles/read_mmap.html
블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,

1. 개념
   이 수열은 기본적으로 자연의 황금비율을 설명할 때 가장 많이
   쓰이는 수열입니다.
   수열이 커지면 커질수록 황금비율(1.618)에 근접하게 됩니다.

   한 쌍의 토끼가 매월 한 쌍의 토끼를 낳고, 태어난 한 쌍의 토끼가
   다음 달부터 한 쌍의 토끼를 매월 낳기 시작한다면, 처음 한 쌍의
   토끼로부터 1년간 합계 몇 쌍의 토끼가 태어날 것인가?

2. 특징
   "해당 수와 전의 수를 더한 수를 다음 수로 나타낸 것"
   ex) 데이지 꽃, 코스모스/나뭇가지의 성장

3. 복잡도
   a. 루프를 이용한 구현 : O(n)
   b. 재귀를 이용한 구현 : O(n^2)

4. 구현
   a. 루프를 이용한 구현
      int forfibo(int n)
      {
           int i, tmpe = 0;
           int firstnumber = 0;
           int secondnumber = 1;

           if( n <= 1)
               return n;
          else {
               for( i = 2; i <= n; i++) {
                    temp = firstnumber + secondnumber;
                    firstnumber = secondenumber;
                    secondnumber = temp;
              }
              return secondnumber;
         }
    
}

    b. 재귀를 이용한 구현
       int refibo(int n)
      {
          
if( n <= 1)
               return ;
           else
               return  refibo(n - 1) + refibo(n - 2);
     
}

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

스트링에 대한 permutation을 구하는 알고리즘  (0) 2008.07.15
mmap (메모리맵)  (0) 2008.07.08
문자열을 뒤집는 프로그램  (0) 2008.07.08
call by value vs. call by reference  (0) 2008.07.08
C 프로그램에서 데이터형  (0) 2008.07.08
블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,
문자열을 뒤집는 프로그램의 알고리즘은 많다.
그 중 대표적인 것을 살펴보자~~

1. 메모리를 사용한 변환
   int rev()
   {
       char string[20] = "this is test";
       char reverse[20];
       int i, j = 0;

       for( i = strlen(string); i >= 0; i--)
          reverse[j++] = string[i];

      reverse[j] = '\0'; // 이 부분을 잘 빠뜨리는데 주의할 것!!

   }

2. 별도의 메모리를 사용하지 않고 변환
   int rev()
   {
       char s[20] = "this is test";
       char temp;
       int len = strlen(s);
       int i;

       for( i = 0; i < len/2 ; i++) {
          temp = s[i];
          s[i] = s[len - 1 - i];
          s[len - 1 - i] = temp;
       }

   }

   문자가 2byte를 기본으로 하는 한국어일 경우는 힘들겠죠??

3. 재귀함수 이용
   char *s = "this is test";

   void rec(void)
  {
      if( *p == NULL) // 종결조건
         return;

      p++; // 전진방법
      rec();
      p--; // 수행방법
      putchar(*p);

      return;
   }

   * recursive(재귀함수) 코딩하는 방법에서 꼭 갖추어야 할 요건
     1. 전진방법
     2. 종결조건
     3. 수행방법

4. 스택 이용
    void rev(char string[])
    {
       int i;
       int top = 0;

       for( i = 0; s[i] != '\0'; i++)
          PUSH(&top, s[i]);

       for( i = 0; s[i] != '\0'; i++)
          s[i] = POP(&top);

    }

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

mmap (메모리맵)  (0) 2008.07.08
피보나치 수열  (2) 2008.07.08
call by value vs. call by reference  (0) 2008.07.08
C 프로그램에서 데이터형  (0) 2008.07.08
프로세스의 메모리 구조  (4) 2008.07.08
블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,
1. call by value
   쉽게 말해서 값에 의한 전달입니다.
   흔히 함수의 반환 값이나 함수 전달 인자로 값을 넘겨 줍니다.
   단순히 값만 복사되어서 해당 함수로 넘어갑니다.
   작은 값이라면 상관없지만, 큰 정보를 넘길 경우 오버헤드가 발생할 수 있습니다.

   ex)  swap_value(int a, int b)
         {
               int temp = a;
               a = b;
               b = temp;
         }

         호출자에게는 전혀 영향을 미치지 않고 호출 당한 함수 내에서만 유효.

2. call by pointer(address)
   포인터에 의한 전달, 주소에 의한 전달입니다.
   즉, 해당 함수나 변수의 주소를 이용해서 전달하는 방식입니다.
   값을 복사하지 않기 때문에 오버헤드는 적지만, 포인터를 사용하기가 좀 까다롭다는 단점이 ㅇㅆ습니다.

   ex) swap_address(int *a, int *b)
        {
             int *temp = &a;
             a = &b;
             b = &temp;
         }


3. call by reference
   레퍼런스에 의한 전달. 참조에 의한 전달이라고 합니다.
   즉 참조를 사용하기 때문에 포인터 방식보다 간편하고 쉽습니다.
   단, 값전달 방식과 구분이 모호하다는 단점이 있습니다.

   ex) swap_ref(int &a, int &b)
        {
            int temp = a;
            a = b;
            b = temp;
         }


좀 정리를 하자면,
인자로 념겨받은 뒤 그 함수 내에서 끝나고 값을 넘겨준 함수에서의 값에 영향을 미치지 못한다면
그것은 call by value이며 그렇지 않은 경우는 call by reference입니다.

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

피보나치 수열  (2) 2008.07.08
문자열을 뒤집는 프로그램  (0) 2008.07.08
C 프로그램에서 데이터형  (0) 2008.07.08
프로세스의 메모리 구조  (4) 2008.07.08
기억류 auto, register, static, extern에 대한 설명.  (0) 2008.07.08
블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,