[데이터 구조의 여행] 희소 행렬 의 빠 른 전환
                                            
 3252 단어  C 언어데이터 구조희소 행렬데이터 구조 와 알고리즘
                    
희소 행렬 의 빠 른 전환 알고리즘 의 핵심 은 하나의 배열 num 으로 원래 행렬 의 각 열 에 0 원 이 아 닌 개 수 를 기록 하고 다른 배열 cpos 로 원 행렬 의 첫 번 째 비 0 원 이 새 행렬 에 있 는 위 치 를 기록 하여 빠 른 전환 의 목적 을 달성 하 는 것 이다.
이런 방법 으로 주로 희망 이다. 행렬 이 전 환 된 후에 도 저장 순 서 는 줄 에 따라 저장 된다.
1. 구현 및 코드 설명
위의 핵심 알림 에 따 르 면 다음 과 같은 코드 가 있 을 수 있 습 니 다. 아래 코드 의 주석 은 이미 매우 상세 하기 때문에 모든 부분 이 실현 하 는 기능 을 독립 시 키 지 않 습 니 다.
#include
#include
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define TRUE 2
#define FALSE -2
typedef int ElemType;
typedef int Status;
typedef struct{ //            
	int i, j;	//        
	ElemType e;	//      
} Triple;		//                
typedef struct{		//        
	Triple *data;	//data ,               
	int mu, nu, tu;	//     、         
} TSMatrix;			//            
 /*
 	0	14	0	0	-5
 	0	-7	0	0	0
 	36	0	0	28	0
 	
 	mu = 3; nu = 5; tu = 5
*/
Status CreateSMatrix(TSMatrix &M){	//         
	M.tu = 5;
	
	M.data = (Triple*)malloc(sizeof(Triple) * (M.tu + 1)); //data                    1,   data[0]    
	if(NULL == M.data)
		return OVERFLOW;
	M.data[1].i = 1;
	M.data[1].j = 2;
	M.data[1].e = 14;
	
	M.data[2].i = 1;
	M.data[2].j = 5;
	M.data[2].e = -5;
	
	M.data[3].i = 2;
	M.data[3].j = 2;
	M.data[3].e = -7;
	
	M.data[4].i = 3;
	M.data[4].j = 1;
	M.data[4].e = 36;
	
	M.data[5].i = 3;
	M.data[5].j = 4;
	M.data[5].e = 28;
	
	M.mu = 3;
	M.nu = 5;
	
	return OK;
}
Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T){ //         ,     M     T 
	int j, p, q, t;	
	/*j         ,cops[j],                             (cops[j]++),      ; 
	p           ,      ; 
	q  cops[j],       ,       ;
	t       。 
	*/
	int *num;	//            
	int *cpos;	//              T      
				//cops[j]++           ,       
	
	T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;	//     T 
	
	T.data = (Triple*)malloc(sizeof(Triple)*(T.nu + 1));
	
	num = (int*)malloc((M.nu + 1)*sizeof(int));	//num cpos           1,      0    
	cpos = (int*)malloc((M.nu + 1)*sizeof(int));
	
	if(num == NULL || cpos == NULL)
		return OVERFLOW;
	
	if(T.tu != 0){
		for(j = 1; j <= M.nu; j++)	//   num   
			num[j] = 0;
		for(t = 1;t <= M.tu; t++)	// M             
			num[M.data[t].j]++;		//     num[1]~num[5],    num       0 
		
		cpos[1] = 1;	//       
		for(j = 2;j <= M.nu; j++)	//           T.data      
			cpos[j] = cpos[j-1] + num[j-1];	//             
		
		for(p = 1; p <= M.tu; p++){		//       ,         
			j = M.data[p].j;	//j            ,  cops   
			q = cpos[j];		//       ,        cpos[j] 
			T.data[q].i = M.data[p].j;	//    
			T.data[q].j = M.data[p].i;	//    
			T.data[q].e = M.data[p].e;	//   ,      ,             
										
			cpos[j]++;	//cops[j]++           ,      ,           
		}				//     for   ,     , j   ,cpos[j]         
	} 
	free(num);
	free(cpos);
	return OK;
}
int main(void){
	int i,j;
	
	TSMatrix M;
	TSMatrix T;
	CreateSMatrix(M);	
	FastTransposeSMatrix(M, T);
	
	printf("
");
	return 0;
}  C free 등 컴 파 일 러 로 컴 파 일 러 를 실행 할 수 있 으 나 시간 관계 상 위 코드 에는 전 환 된 매트릭스 로 인쇄 된 코드 가 제시 되 어 있 지 않 아 스스로 추가 할 수 있 으 며, 물론 새로운 매트릭스 T 의 data 필드 의 수치 변 화 를 디 버 깅 하 는 방법 으로 감시 할 수도 있다.
2. 테스트
테스트 는 위의 제시 에 따라 하면 됩 니 다. 시간 관계 입 니 다. 여 기 는 테스트 를 하지 않 고 다음 에 시간 이 있 으 면 다시 보충 합 시다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.