'프로그래밍 기초/자료구조 & 알고리즘'에 해당되는 글 15건

  1. 2010.05.03 3n+1
  2. 2009.12.17 스케줄링 (라운드 로빈)
  3. 2009.12.17 병합정렬 & 퀵 정렬 비교 및 기수정렬
  4. 2009.12.16 연결리스트더미有
  5. 2009.12.16 퀵 정렬

이러한 알고리즘이 있다.

n= 10 이면

10 ,5, 16, 8, 4, 2, 1    cnt = 7 (사이클길이)

짝수이면 n/2 로 나누고 , 홀수이면 3n+1 로 한다.

이 알고리즘을 적용을하면 결국에 n 은 1에 이르게 된다.

이 가설은 적어도 1000000까지의 정수에 대해서는 참이라고 한다.


이제부터 문제다.

어떠한  두 정수를 입력받는다.

0~1000000까지만 값을 입력받을수 있도록 하고

예를 들어 1 , 10 을 입력받는다 그러면 1 ~10 사이에 대해 최대 사이클 길이를 구하면 된다.

입력예     출력 예
1 10        1 10 20
100 200   100 200 125


먼저 입력 받는 수를 a와 b 라고 하고 a에 대한 알고리즘을 구했고 그 다음에 a+1 에 대한 결과와 비교하고

또 a+1과 계속 비교해가면서 b까지 비교해서 가장 큰 최대사이클을 구하는 방식으로 하였다.

생각보다 알고리즘 문제 재밌는거 같다 ㅋㅋㅋ

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

여행(The Trip)  (0) 2010.05.11
지뢰찾기  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
병합정렬 & 퀵 정렬 비교 및 기수정렬  (0) 2009.12.17
연결리스트더미有  (0) 2009.12.16
Posted by 아몰라
  
- FCFS에서 짧은 프로세스가 피해보는 현상 완화방법
  : 시간을 정해놓고 프로세스가 일정 시간 이상을 넘어가는 순간 실행을 강제로 중단시킴
-프로세스 실행시간측정방법
  : 클럭(clock) 인터럽트(또는 타이머 인터럽트)
  : 클럭인터럽트는 일정간격으로 주기적으로 발생
-시간할당량(time slicing)기법이라고 함

 






- 시간할당량의 크기(q)가 라운드로빈
   :시간할당량이 너무 작다면  문맥교환 오버헤드 증가
   :시간할당량이 너무 크다면  FCFS와 비슷해짐
- 시간할당량이 얼마나 되어야 하는가?
   :프로세스가 사용자와 최소한 한번 이상 대화하기 충분하거나
   :프로세스 내의 어떤 함수 정도는 실행을 마칠 수 있는 충분한 길이


FCFS(선입선출 방식) 연습코드



void Scheduler::Install()  //프로세스 생성
{
 harddisk.push_back(new Process("A",20,4)); 
 harddisk.push_back(new Process("B",15,5));
 harddisk.push_back(new Process("C",18,3));
 harddisk.push_back(new Process("D",23,4));
}
void Scheduler::SimulationInit()
{
 miter seek = harddisk.begin(); //처음 프로세스 지정
 miter end = harddisk.end();  //마지막 프로세스 지정

 for( ; seek != end; ++seek)
 {
  readyqueue.push(*seek);  //큐에 프로세스 하나 삽입
  (*seek)->IdleToReady();  //삽입한 프로세스를  IdleToReady 로 보냄
 }
 
}

프로세스 클래스

class Process 
{
 char *pname;
 const int tjob; //전체 작업량
 const int cjob; //cpu점유시 수행 가능 최대 작업량
 int ntjob; //현재 남은 작업량
 int ncjob; //현재 cpu점유시 수행 가능 최대 작업량
public:
 Process(const char *_pname,int _tjob,int _cjob);
 virtual ~Process();
 void IdleToReady();
 int Running();
 void EndProgram();
private:
 void InitProcess(const char *_pname);
 
};




void Process::IdleToReady()
{
 ntjob = tjob; //총 작업량을 현재 작업량으로 바꿔놓고 레디상태로!
}


int Process::Running()
{
 ncjob = cjob; 

 while(ntjob!=0 && ncjob!=0) //총 작업량 또는 총 cpu 점유시 총 실행가능시간이 0이되면 프로세스 교체한다
 {
  eout<<pname;
  eout.TimeFlow(4);
  ncjob--;
  ntjob--;
 }
 eout<<endl;
 return ntjob;    //남은 총 작업량을 반환
}


스케쥴 클래스


void Scheduler::Install()  //프로세스 생성
{
 harddisk.push_back(new Process("A",20,4)); 
 harddisk.push_back(new Process("B",15,5));
 harddisk.push_back(new Process("C",18,3));
 harddisk.push_back(new Process("D",23,4));
}
void Scheduler::SimulationInit()
{
 miter seek = harddisk.begin(); //처음 프로세스 지정
 miter end = harddisk.end();  //마지막 프로세스 지정

 for( ; seek != end; ++seek)
 {
  readyqueue.push(*seek);  //큐에 프로세스 하나 삽입
  (*seek)->IdleToReady();  //삽입한 프로세스를  IdleToReady 로 보냄
 }
 
}



void Scheduler::Simulation()
{
 while(!readyqueue.empty())  //큐가 비면 끝낸다
 {
  Process * temp = readyqueue.front(); //큐에 맨앞에 있는 프로세스를 가르킨다.
  readyqueue.pop();      //위에서 가르킨 프로세스를 빼온다.

  if(temp->Running())      //운영체제가 빼온 프로세스를 실행시킨다.
  {
   readyqueue.push(temp);    //큐에 프로세스를 다시 삽입한다.
  }
 }
}


스케줄링 - 큐 대기시간이 적을수록 성능이 좋다!

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
병합정렬 & 퀵 정렬 비교 및 기수정렬  (0) 2009.12.17
연결리스트더미有  (0) 2009.12.16
퀵 정렬  (0) 2009.12.16
Posted by 아몰라


병합 정렬

1. 분할!! 정렬이 안된 배열을 쪼갠다 [ 7, 5, 12, 18, 4, 9, 11] - 최소원소들이 될때까지 계속 병합정렬 호출

2. 병합!! 최소원소들을 합쳐가면서 병합시킨다.


퀵 정렬과 비교!

퀵 - 역순 , 적당히 정렬에서는 느리고 굉장히 어지러운 정렬에서는 효과를 발휘한다. 일반적으로 빠른 소트로 알려져있다.
     컴퓨터상에서는 평균보다 최악의 상황이 더 중요하다.

병합 - 실질적으로 빠른 정렬 ,  단점 : 메모리 사용량 ↑




count 정렬 

1

2

3

4

1

3

1

정렬전!


 

1

2

3

4

3개

1개

2개

1개

cnt =3

cnt =4

cnt =6

cnt =7

분석법을 이용해 표 작성

 

1

2

3

4

1

3

1

 

 

 

 

 

 

4

cnt--

1

2

3

4

1

3

1

 

 

 

 

 

3

4

cnt--
 

1

2

3

4

1

3

1

 

 

 

 

3

3

4

 cnt--

1

2

3

4

1

3

1

 

 

 

2

3

3

4

cnt--

1

2

3

4

1

3

1

 

 

1

2

3

3

4

cnt--

1

2

3

4

1

3

1

 

1

1

2

3

3

4

cnt--

1

2

3

4

1

3

1

1

1

1

2

3

3

4

cnt--

cnt==0 이 되고 정렬 끝  1 , 1, 1 ,2 ,3 ,3, 4




count
 카운트 소트를 이용한 radix sort(기수정렬)

121     121    121    121
753     753    753    275
275     473    473    473
473     275    275    753
      첫자리 두번째 세번째

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
연결리스트더미有  (0) 2009.12.16
퀵 정렬  (0) 2009.12.16
Posted by 아몰라

연결리스트


노드 - 데이터를 보관해준다!

head - 맨앞의 노드를 지칭
tail - 맨뒤의 노드를 지칭
head랑 tail은 위치정보만 가지고있다.(링크다!)

단일연결 - 어떠한 노드의 위치를 알수없다. (Stoker)
이중연결 - 어떠한 노드의 위치를 알수있다.


seek를 이용 seek<노드의값 이면 앞에 삽입하자!

Dummy 노드 있는게 더 좋다. 특정한 노드 사이에 저장이된다!


pushback - 맨 뒤에 보관한다.

1. in을 보관하는 노드 생성
2. tail 앞에 보관



Ehlist()                               //헤드랑 테일 초기화~
  {
   head = new EhNode();       //시작을 가르킬더미 생성
   tail = new EhNode();          //마지막을 가르킬 더미 생성
   head->af = tail;                
   tail->be = head;
   usage = 0;                      // 연결리스트의 개수를 알려준다
   
  }
  virtual ~Ehlist()
  {
   EhNode * ehnode = tail->be;  // 테일이 가르키는 노드의 옆에노드를 가르킨다.

   while(usage!=0)
   {
    tail->be = tail->be->be;       // 테일을 왼쪽왼쪽 가르키게 한다. 
    delete tail->be;                  // 테일 옆에 노드를 삭제
    usage--;
    
   }

   delete tail,head;
  }

  
  void push_back(T data)
  {
   EhNode * ehnode;
   ehnode = new EhNode(data);
   HangNode(ehnode, end().now); //노드를 넣을 데이터와 마지막 노드의 위치를 넘겨준다.
   usage++;

  }
  
  void insert(iterator at,T data)
  {
   EhNode * ehnode;
   ehnode = new EhNode(data);
   HangNode(ehnode, at.now);  //노드를 넣을 데이터와 선택위치를 넘겨준다.
   usage++;
  }

  
  void erase(iterator at)
  {
   EhNode * ehnode = at.now;
   ehnode->be->af = ehnode->af;
   ehnode->af->be = ehnode->be;
   usage--;
  }

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
병합정렬 & 퀵 정렬 비교 및 기수정렬  (0) 2009.12.17
퀵 정렬  (0) 2009.12.16
Posted by 아몰라


퀵 정렬

1. pivot을 선택한다.

2. pivot을 맨 앞(L)뒤(R)의 요소와 교환

3. pivot 보다 (L)에서 큰원소들을 찾는다.

4. pivot 보다 (R)에서 작은원소들을 찾는다.

5. 3~4에서 둘다 값을 찾으면 서로 값 교환한다.

6. L 과 R 이 만나게되면 pivot과 만나는 점을 교환하고 pivot을 확정한다.

7. pivot 왼쪽 quick sort - 원소 개수가 2개이상

   pivot 오른쪽 quick sort - 원소 개수가 2개이상

8. pivot이 다 확정되면 종료

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
병합정렬 & 퀵 정렬 비교 및 기수정렬  (0) 2009.12.17
연결리스트더미有  (0) 2009.12.16
Posted by 아몰라
이전버튼 1 2 이전버튼