데이터 구조 와 알고리즘 복습: 유 세 프 문제 선형 표 해결

26850 단어 대학생.
데이터 구조 와 알고리즘 - 복습: 유 세 프 문제 선형 표 해결
여기 서 유 세 프 문제 가 무엇 인지 개술 하지 않 겠 습 니 다. 일반적인 데이터 구조 교재 에는 이 문제 가 있 습 니 다.다음은 본 문제 에 관 한 선형 표 해법 을 제시 합 니 다.
문제 풀이 방식
아 날로 그 번호: 이 방식 은 단일 순환 링크 에 더욱 적합 합 니 다. 하나의 카운터 로 현재 번호 의 크기 를 기록 하고 지침 으로 규정된 번호 의 출발점 을 가리 킵 니 다.링크 가 비어 있 을 때 까지 링크 를 반복 해서 삭제 합 니 다.순환 링크 이기 때문에 모든 조작 이 편리 합 니 다.이런 방식 의 복잡 도 는 계산 을 통 해 O (n * m) 이다.
추론 수열: 간단 한 수열 의 번호 결 과 를 쓰 고 해당 하 는 배열 의 하 표를 제시 하면 아래 표 와 번호 의 최대 치, 그리고 현재 책상 위의 사람의 총수 의 관 계 를 쉽게 추리 할 수 있다.즉:
(    +    -1)%      =             

잉여 연산 의 작용 을 깊이 이해 해 야 한다.나 는 개인 적 으로 그 가 순환 회전 과 일정한 관계 가 있다 는 것 을 이해한다.
다음은 프로그램 세 션 코드 를 드 립 니 다:
/**
 * Josephus       
 *  n  ,      ,    s      ,     1  ,   m,    m
 *     ,    n      
 *     :
 *       ,       :(    +    -1)%      =          
 *   ,     :
 * 1 2 3 4 5      :
 * 0 1 2 3 4     3   ,    ,  2   ,         4,    ,           :
 * 4 1 3 2 5         :
 * 3 0 2 1 4       :(    +    -1)%      =          
 *                 
 */
#include 
#include 

/**
 *        
 */
struct SeqList{
    int MAXNUM; //         
    int n;  //             
    int* vals;  // DataType* X;
};
typedef struct SeqList * PSeqList; //      SeqList     

/**
 * 1.         
 * @param m      
 * @return
 */
PSeqList createNullList_Seq(int m){
    PSeqList palist = (PSeqList)malloc(sizeof(struct SeqList));
    if(palist != NULL){
        palist->vals = (int*)malloc(sizeof(int) * m);
        if(palist->vals){
            palist->n = 0;
            palist->MAXNUM = m;
            return palist;
        } else{
            free(palist);
        }
    }
    printf("            
"
); return NULL; } /** * 2. * @param palist * @return */ int isNullList_Seq(PSeqList palist){ if(palist->n == 0) return -1; else return 0; } /** * 3. , * @param palist * @param x * @return */ int locate_seq(PSeqList palist,int x){ if(isNullList_Seq(palist)) return -1; for(int i=0;i<palist->n;i++) { if(palist->vals[i] == x) return i; } return -1; } /** * 4. , * @param palist * @param position * @param x * @return */ int insertPre_seq(PSeqList palist, int position,int x){ if(isNullList_Seq(palist)) return -1; if(palist->MAXNUM <= position){ printf(" ,
"
); return -1; } if(position<0 || position>palist->n){ printf(" %d
"
,position); } for(int i = palist->n; i>=position; i--) { palist->vals[i] = palist->vals[i-1]; } palist->vals[position] = x; palist->n += 1; printf("
"
); return 1; } /** * 5. * @param palist * @param position * @return */ int deleteP_seq(PSeqList palist,int position){ if(isNullList_Seq(palist)){ printf(" ,
"
); return -1; } if(position > palist->n || position < 0){ printf(" %d ,
"
,position); return -1; } for(int i = position; i<palist->n;i++){ palist->vals[i] = palist->vals[i+1]; } palist->n -= 1; printf("
"
); return 1; } /** * 6. * @param palist * @param x * @return */ int deleteV_seq(PSeqList palist,int x){ if(isNullList_Seq(palist)){ printf(" ,
"
); return -1; } if(locate_seq(palist,x) == -1){ printf(" ,
"
); return -1; } deleteP_seq(palist,locate_seq(palist,x)); printf("
"
); return 1; } /** * 7. * @param palist * @param data */ void initData(PSeqList palist,int data[]){ for(int i=0;i<11;i++) { palist->vals[i] = data[i]; (palist->n)++; } } /** * 8. * @param palist */ void printSeqList(PSeqList palist){ if(isNullList_Seq(palist)){ printf(" ,
"
); return; } for(int i=0;i<palist->n;i++){ printf("%d,",palist->vals[i]); } printf("
"
); } void Josephus(PSeqList palist,int s,int m){ int s1,i,w; s1 = s - 1; for(i=palist->n;i>0;i--){ s1 = (s1 + m - 1) % i; w = palist->vals[s1]; printf(" %d ;",w); deleteP_seq(palist,s1); } } int main(){ int man[] = {1,2,3,4,5,6,7,8,9,10,11}; PSeqList palist = createNullList_Seq(100); initData(palist,man); Josephus(palist,4,4); }

비판 과 시정 을 환영 합 니 다.

좋은 웹페이지 즐겨찾기