2017-02-07 2 views
2

저는 RAM의 데이터 바이트를 읽고, qsort를 사용하여 데이터를 정렬하고, 데이터를 파일에 다시 써야하는 프로그램을 가지고 있습니다. 특정 양의 메모리 만 사용하면됩니다. 내가 /usr/bin/time -v에 대해 내 프로그램을 실행하고 최대 상주 집합 크기를 확인할 때qsort는 C의 두 배 메모리를 사용합니다.

FILE *fp; 
/* open file for reading up here , blah blah blah*/ 
... 

int mb = 1024*1024; 
int mem_size = 20*mb; 
int total_cookies = mem_size/sizeof(Cookie); 
Cookie *buffer = (Cookie *) calloc(total_cookies, sizeof(Cookie)); 

/* read bytes into buffer*/ 
while ((result = fread(buffer, total_cookies , sizeof(Cookie), fp)) > 0) { 
     qsort(buffer, total_cookies, sizeof(Cookie), compare); 
     fwrite(....) 
} 
free(buffer); 

내 문제는, 내가 의도하고있어 메모리의 두 배를 사용한다 : 는 여기에 내가 무슨 짓을했는지의 JIST입니다 문제는 qsort 함수를 다시 가리 킵니다.

qsort를 제 위치에서 정렬하고 여분의 메모리를 사용하지 않으려면 어떻게합니까?

+4

슬프게도, C 표준은 qsort의 구현에 대한 복잡성을 요구하지 않으며, 모든 표준 라이브러리 구현자는 결과가 올바른 한 원하는대로 할 수 있습니다. 유일한 옵션은 제어 할 수있는 자체 정렬 알고리즘을 작성하는 것입니다. – StoryTeller

+0

내 과제에서 우리는 일정량의 메모리를 초과 할 수 없기 때문에 견과입니다. 조교 중 한 조가 qsort라고 말했기 때문에 qsort를 사용하라는 말을 들었습니다. 그러나 결과를 설명하려고했을 때, 나는 "그럴만 한 대답이되어서는 안된다"고 생각했습니다. 그러나 내가 구현 된 곳에서 어디가 잘못되었는지는 알지 못한다. & 메모리 누수가 없거나 전혀 없다. 나는 절대적으로 곤란하다. – koikoi

+2

TA가 귀하의 TA에 속았습니다. [This] (http://port70.net/~nsz/c/c11/n1570.html#7.22.5.2)는'qsort'에 대해 표준에서 말하는 것입니다. 정확성 이외의 요구 사항은 없습니다. 전 세계 개발자들이 공개적으로 관리하고있는 [이 소스] (http://en.cppreference.com/w/c/algorithm/qsort)도 있습니다. TA를 설득하여 자신의 기대치를 조정해야한다고 생각하십시오. TA가 납득되지 않으면 요청대로 과제를하십시오. TA의 라이브러리 구현을 전달하거나 클래스 전체가 실패하게되어 무시할 수 없게됩니다. – StoryTeller

답변

4

사양에 메모리 소비 또는 시간 복잡성에 대한 요구 사항이 없으므로 메모리 소비에 제약이있는 경우 (적어도 이식성이 필요한 경우) 다른 기능 (자체 구현 가능)을 사용해야합니다.

복잡도가 O(n log n)이고 메모리 사용량이 O(n log n) 인 실제로 알고리즘 (fx 빠른 정렬)이 있습니다. qsort을 구현하기 위해 실제적으로 그러한 알고리즘을 사용하는 구현이있을 수 있습니다.

더 많은 메모리가 필요한 다른 괜찮은 알고리즘이 있습니다. 예를 들어 병합 정렬은 마지막 병합 단계에 대한 데이터 복사본을 만들 필요가 있습니다 (이는 관찰 결과와 일치 함). 병합 정렬은 이점이 있습니다 (예를 들어 최악의 경우 시간 복잡성이있는 경우). 구현이 해당 알고리즘을 선택하는 이유가 될 수 있습니다.

사실 qsort의 구현은 시간 및 메모리와 비교할 때 훨씬 좋지 않을 수 있습니다. qsort이 제자리에 정렬한다는 진술은 결과가 입력과 동일한 배열에서 최종적으로 끝나기 전에 만 유효하지만 그 전에 모든 곳에서 데이터를 분산시킬 수 있습니다.