알고리즘의 적정성

  • 알고리즘의 적정성

  • ex 1> 일반적으로
    • R : 결과
    • D : 입력 데이터
      • 필요 메모리 : 5M
    • A : 방법 A 
      • 걸리는 시간 : 2초 
      • 필요 메모리 : 10M
    • B : 방법 B
      • 걸리는 시간 : 20초
      • 필요 메모리 : 2M
  • D에서 R이라는결과를 얻기위해서 방법 A와 방법 B가 있습니다.
    A와 B로 만들어진 AR과 BR은 서로 똑같다고 가정합니다.(AR===BR)
  • 경우1>
    시스템의 제한된 메모리는 20M일 경우
    • 이경우 A를 사용하는 쪽이 좋습니다.
      A와 D의 필요 메모리(15M)는 제한 메모리폭(20M)을 넘어서지 않고, 걸리는 시간은 2초로 B의 20초보다 짧습니다.
      알로리즘은 원하는 시간안에 결과물을 출력하도록 하는 것이 목적이기 때문에 시간이 짧을 수록 올바른 알고리즘이 될 가능성이 높습니다.
  • 경우2>
    시스템의 제한된 메모리가 10M인 경우
    • 이럴 경우 A는 동작조차 할 수 없습니다. 필요 메모리가 15M인데 제한된 메모리가 10M으로 메모리 부족이 일어나게 됩니다.(여기선 스왑은 생각 안합니다.)
    • B의경우 2+5=7M으로 10M의 제한 메모리폭을 넘지 않으므로 시간은 더 걸리더라고 B를 선택해야합니다.

 

  • ex 2> PHP의 경우
    텍스트 파일에서 한줄씩 읽어서 가공한다.
    • R : 결과
    • D : 입력 데이터 : text 파일
    • A : 방법 A 
      • file()
    • B : 방법 B
      • fopen(),fgets();
  • 보통의 작은 문서일 경우 file()을 사용해도 된다.
    배열로 되어있어 다루기도 쉽다.
  • 하지만 D의 크기가 크다면?
    이경우 고민을 해봐야한다.
    PHP에서 하나의 프로세스가 동작하는데 8M의 메모리로 제한을 한다고 가정하가
    D가 100KB면 file()로 해도 충분하다. 메모리가 남아돌 지경이다.
    하지만 D가 30MB라면? file()로 읽어드렸다간 메모리 부족으로 프로세스가 멈출것이다.
    하지만 B로 동작하면 fopen()과 fgets()는 파일 전체를 여는 것이 아니다.
    포인터로 지정된 부분만 바로바로 가져오는 형식이기 때문에 메모리는 30MB라도 보통 버퍼(fgets에서 인자로 주는 값)로 사용하는 4MB정도면 충분하다.
    즉, D가 1000MB가 되어도 4MB의 메모리만 사용한다는 이야기가 된다.
  • 여러 값이 얽히고 섥힌 설정파일같은 것을 읽어올 때와 같은 용량이 작은 문서에선 file()쪽이 훨씬 유리하다.
    배열은 가공이 쉽고 그전 순서 값을 다시 사용도 쉽다.
  • log파일경우 처음 시작은 100KB도 안되겠지만, 며칠이 지나면 100MB 또는 1000MB가 될지도 모른다
    이럴 경우 처음엔 file()로 되겠지만, 나중되면 택도 없다.
    fopen(),fgets()의 조합으로 만들어야할 것이다.

 

  • 간단히 말해서 현재 상황, 미래 상황을 고려해서 알고리즘을 생각해서 만드는게 신상에 좋을 것이다.
  • 홈페이지 옮긴김에 잡담하나 적어봤습니다.
댓글
  • No Nickname
    No Comment
  • 권한이 없습니다.
    {{m_row.m_nick}}
    -
제목 작성자 날짜
공대여자
공대여자
mins01
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자