프로 세 스 전환 에 어떤 문제 가 필요 합 니까?

1. 프로 세 스 전환 은 어떤 문 제 를 주의해 야 합 니까?
프로 세 스 가 중 단 된 개인 스 택 에 프로세서 PC 레지스터 의 값 저장 하기;      프로 세 스 가 중 단 된 개인 스 택 에 프로세서 PSW 레지스터 의 값 저장 하기;    프로 세 스 가 중 단 된 프로 세 스 제어 블록 에 프로세서 SP 레지스터 의 값 저장 하기;
프로 세 스 가 중 단 된 개인 스 택 에 프로세서 의 다른 레지스터 값 저장 하기;     실행 중인 프로 세 스 제어 블록 에서 SP 값 을 가 져 와 프로세서 의 레지스터 SP 에 저장 합 니 다.    실행 중인 프로 세 스 의 개인 스 택 복구 프로세서 각 레지스터 의 값;
실행 중인 프로 세 스 의 개인 스 택 에서 PSW 값 을 꺼 내 프로세서 의 PSW 로 보 내기;     실행 중인 프로 세 스 의 개인 스 택 에서 PC 값 을 꺼 내 프로세서 의 PC 로 보 냅 니 다.
2. 오름차 배열 을 입력 한 다음 배열 에서 두 개의 숫자 를 빠르게 찾 습 니 다. 그 와 같은 값 입 니 다.
이 프로 그래 밍 의 아름다움 위 에 이 문제 가 있 습 니 다. 아주 간단 합 니 다. 두 개의 지침 으로 하 나 는 배열 의 앞 을 가리 키 고 하 나 는 배열 의 뒤 를 가리 키 며 한 번 옮 겨 다 니 면 됩 니 다.
3. 한 명의 유명인 과 많은 평민 이 함께 있 습 니 다. 평민 들 은 모두 이 유명인 을 알 고 있 습 니 다. 그러나 이 유명인 은 어떤 평민 도 모 릅 니 다. 임 의 두 평민 간 에 아 는 지 여 부 는 알 수 없 는 것 입 니 다. 알고리즘 을 설계 하여 이 사람 중의 그 유명인 을 빨리 찾 으 세 요.  이미 함수 가 실현 되 었 음 을 알 고 있 습 니 다.  bool know (int a, int b) 이 함수 가 true 로 돌아 갈 때 a 가 b 를 알 고 false 로 돌아 갈 때 a 가 b 를 모 르 는 것 을 나타 낸다.
사고방식: 먼저 n 명 을 n / 2 조로 나 누고 각 조 에 2 명 이 있다. 그 다음 에 각 조 의 두 사람 이 이 know 함 수 를 호출 한다. know (a, b) 라 고 가정 하고 true 로 돌아 갈 때 a 가 b 를 알 았 다 는 것 을 설명 하면 a 는 유명인 이 아 닐 것 이다. a 는 배제 할 수 있 고 순서대로 유추 할 수 있다. 각 조 가 이 함 수 를 순서대로 사용 하면 n 명 중 n / 2 명 이 배제 된다.데이터 규 모 는 n / 2 가 될 것 이다.같은 이치 로 남 은 n / 2 명 중에서 이 방법 을 사용 하면 규 모 는 n / 4 가 될 것 이다. 그러면 모든 누적 횟수 는 n / 2 + n / 4 + n / 8 +.........................................................
4. 책 순서 [1, 2, 3, 4, 6, 8, 4, 8, 11, 18, 19, 100] 의 앞부분 은 증가 하 는 배열 이 고 뒤의 하 나 는 증가 하 는 배열 이지 만 전체 배열 은 증가 하 는 배열 이 아니라면 어떻게 그 중의 한 수 를 가장 빨리 찾 을 수 있 습 니까?
[cpp] view plain copy print ?
#include    
  • using namespace std;  

  •   
  • int binary_search(int* a, int low, int high, int goal)    //이분 찾기  

  • {  
  •     while(low <= high)  

  •     {  
  •         int middle = (low+high)>>1;    //(low+high)/2   

  •         if(a[middle] == goal)  
  •             return middle;  

  •         //오른쪽  
  •         else if(a[middle] < goal)  

  •             low = middle + 1;  
  •         //왼쪽 에 있어 요.  

  •         else  
  •             high = middle - 1;  

  •     }  
  •     return -1;  

  • }  
  • void getNum(int *a, int len, int goal)  

  • {  
  •     int i, index;  

  •     for(i = 0; i < len-1; i++)  
  •     {  

  •         if(a[i] > a[i+1])     //앞, 뒤 두 배열 의 경계 점 을 찾 습 니 다.  
  •             break;  

  •     }  
  •     if(a[i] >= goal)          //앞의 배열 을 2 분 검색 합 니 다.  

  •     {  
  •         index = binary_search(a, 0, i, goal);  

  •         printf("%d",index);  
  •     }  

  •     if(a[i+1] <= goal)         //뒤에 있 는 그룹 을 2 분 동안 찾 습 니 다.  
  •     {  

  •         index = binary_search(a+i+1, 0, len-i-2, goal);  
  •         if(index != -1)  

  •             index += (i+1);    //뒤의 그 배열 은 앞의 배열 에 비해 i + 1 입 니 다.  
  •         printf("%d",index);  

  •     }  
  • }  

  •   
  • int main(void)  

  • {  
  •     int a[]={1,2,3,4,6,8,9,4,8,11,18,19,100};  

  •     int len = 13, goal = 4;  
  •     getNum(a,len,goal);  

  •     return 0;  
  • }  
  • #include <iostream>
    using namespace std;
    
    int binary_search(int* a, int low, int high, int goal)    //    
    {
    	while(low <= high)
    	{
    		int middle = (low+high)>>1;    //(low+high)/2
    		if(a[middle] == goal)
    			return middle;
    		//    
    		else if(a[middle] < goal)
    			low = middle + 1;
    		//    
    		else
    			high = middle - 1;
    	}
    	return -1;
    }
    void getNum(int *a, int len, int goal)
    {
    	int i, index;
    	for(i = 0; i < len-1; i++)
    	{
    		if(a[i] > a[i+1])     //   、         
    			break;
    	}
    	if(a[i] >= goal)          //           
    	{
    		index = binary_search(a, 0, i, goal);
    		printf("%d
    ",index); } if(a[i+1] <= goal) // { index = binary_search(a+i+1, 0, len-i-2, goal); if(index != -1) index += (i+1); // i+1 printf("%d
    ",index); } } int main(void) { int a[]={1,2,3,4,6,8,9,4,8,11,18,19,100}; int len = 13, goal = 4; getNum(a,len,goal); return 0; }

    5. 자연수 가 특정한 수의 제곱 인지 판단 합 니 다. 물론 개방 연산 을 사용 할 수 없습니다.
    방법 1: 1 부터 N 까지 의 숫자 를 옮 겨 다 니 며 제곱 을 구하 고 N 과 비교 합 니 다. 제곱 이 N 보다 작 으 면 계속 옮 겨 다 니 고 N 과 같 으 면 성공 적 으로 종료 합 니 다. N 보다 크 면 종료 에 실패 합 니 다. 복잡 도 는 O (n ^ 0.5) 입 니 다.
    방법 2: 2 분 검색 법 을 사용 하여 1 에서 N 사이 의 숫자 를 판단 합 니 다. 복잡 도 는 O (log n) 입 니 다.
    방법 3: (n + 1) ^ 2 = n ^ 2 + 2n + 1, =... = 1 + (2 * 1 + 1) + (2 * 2 + 1) +... + (2 * n + 1) 이 항목 들 이 등차 수열 을 구성 하고 있 음 을 알 수 있 습 니 다 (항목 마다 차이 2)그래서 우 리 는 N - 1, N - 1 - 3, N - 1 - 3 - 5... 과 0 의 관 계 를 비교 할 수 있 습 니 다. 0 보다 크 면 계속 줄 이 고 0 과 같 으 면 성공 적 으로 물 러 납 니 다. 0 보다 작 으 면 실패 합 니 다. 복잡 도 는 O (n ^ 0.5) 입 니 다. 그러나 방법 3 에 서 는 가감 법 으로 방법 1 의 곱셈 을 바 꾸 었 기 때문에 속도 가 더 빨 라 집 니 다.
    예 를 들 어: 3 ^ 2 = 9 = 1 + 2 * 1 + 1 + 2 * 2 + 1 = 1 + 3 + 5
    4^2 = 16 = 1 + 2*1 + 1 + 2*2+1  + 2*3+1
    [cpp] view plain copy print ?
    int square(int n)  
  • {  

  •     int i = 1;  
  •     n = n - i;  

  •     while( n > 0 )  
  •     {  

  •         i += 2;  
  •         n -= i;  

  •     }  
  •     if( n == 0 )        //어떤 수의 제곱 이다.  

  •         return 1;  
  •     else                //어떤 수의 제곱 이 아니다.  

  •         return 0;  
  • }  
  • 좋은 웹페이지 즐겨찾기