PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/09/28 01:39:49
Name DeathMage
Subject C프로그래밍 배열 질문입니다.
dev-c++에서 정렬 프로그램을 만들고 있는데, 값을 받는 길이(숫자의 개수)가 억단위 입니다-_-;

프레젠테이션의 유사코드를 보면서 만들고 있는데,  

타입을 long으로 해주어도 오버플로가 나는건지 컴파일 후 프로그램을 실행하면 윈도우 오류창을 뱉으면서 뻗네요;

예를들어서,

#include <stdio.h>
#include <stdlib.h>

int main(){
    
    long n = 0;
    printf("입력>>");
    scanf("%ld",&n);
    printf("\n 값은 %ld",n);
    
    
    long list[n]; //VB에서는 에러지만, gcc(GNU)에서는 아니더라고요..
    
    printf("\n에러없음.\n");
  
    system("pause");
    
    return 0;
    
}

이렇게 했다고 하면, 520000까지는 괜찮은데 그 이상이면 뻗습니다.;

이거 해결 방법이 있나요;? malloc으로 선언해줘야 할까요;; linked-list면 될까요;ㅛ;?

참고로 사용하는 컴퓨터는 램이 1기가입니다;

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/09/28 01:51
수정 아이콘
long형 변수가 4byte니까 계산해보시면 한계치를 알 수 있으실거예요.
그리고 저정도 양의 데이터를 sorting하려면 계산 시간이 안나올 듯 합니다.
08/09/28 01:53
수정 아이콘
그리고 보통이 4byte란 얘기지 컴파일러마다 조금씩 다를 수 있습니다. 그래서 차이가 날 듯.
DeathMage
08/09/28 01:59
수정 아이콘
long형은 2,147,583,647까지 받을 수 있는거로 알고 있어요-

그리고 정렬 시간은 20분 안으로 하라고 하는데, 52만 가지고는 퀵정렬/합병정렬은 전부 20분 안으로 나오더라고요.
(랜덤시)

교수님께서 퀵정렬 랜덤은 억단위로 받으라고 하셔서요..

32bit 프로세서라서 처리를 못하는걸까요;? 방법이 없을까요..
08/09/28 02:06
수정 아이콘
long형이 문제가 아니라, local 영역 즉, 스택에서 선언할수 있는 변수들의 총크기는 정해져있습니다. 왜냐면 컴파일러에서 스택의 최대사이즈가 정의되어 있거든요. 제가 아는한 대략 2MB쯤 될겁니다 4*520000 = 2,080,000 대략 2MB쯤 돼니 죽겠네요.
08/09/28 02:13
수정 아이콘
그나저나 소스코드가 참 신기하네요... 배열크기를 저런식으로 줄수 있다니...
VC에서는 안돼고 gcc에서는 됀다니 c99같은데, 정말 신기하네요.
DeathMage
08/09/28 02:16
수정 아이콘
크억=ㅛ=; 그럼 이 과제는 불가능한것인가요?! 가능하니까 내줬을꺼 같은데..

가능하다면 어떤 컴파일러에서 가능한가요;; 리눅스에서 쓰는 gcc면 돌아갈려나요; 3;)?
08/09/28 02:22
수정 아이콘
음... 찾아보니 잘못말한 부분이 있군요. 위에서 2MB라고 말한건 성급했던것 같습니다. 사용하시는 시스템에서 스택사이즈가 얼마인지 확인해 보시길 바랍니다. 시스템마다 참 다양하네요. 다만 크기가 얼마이든 스택사이즈가 정의되어있으니 크기가 큰 배열은 전역이나 heap에 선언하는게 좋을것 같습니다.
08/09/28 02:31
수정 아이콘
tsuna님 말씀대로 스택 크기 문제가 맞습니다. 컴파일러 옵션을 이용해서 스택 크기를 크게 할 수는 있지만 보통 몇MB 정도 크기만 사용하고 그 이상이 되면 'new'나 'malloc'을 이용해서 heap에 메모리를 할당하셔서 사용하셔야 합니다.

long list[n];

대신에

long *list = new long[n];
....
delete [] list;

이런 식으로 쓰시면 될 것 같네요.

근데, 램이 1기가면.. 윈도우를 쓰신다고 볼때 여유 메모리는 512MB정도일 것 같은데.. 128*(2^20)개(약 1억개) 넘게 정렬하시는 경우에는 꽤 느려질 것 같네요.
08/09/28 02:36
수정 아이콘
그리고, 참고로 데이터들이 모두 정수이고 중복된 숫자가 없는 경우에는, 1억개의 숫자들도 한 10MB의 메모리만 있으면 정렬이 가능합니다.^^
08/09/28 02:46
수정 아이콘
졍님// 오오 신기하네요! 어떻게하는건가요? 대략적인 알고리즘을 알려주실수 있으신가요? 궁금하네요.
검색키워드 같은것이라도 알려주시면 감사하겠습니다.
알아두면 언젠가는 쓸일이 있을것 같네요.
DeathMage
08/09/28 02:47
수정 아이콘
아하.. local과 global영역의 stack 크기가 달라서 일어나는군요'ㅛ'!!

heap으로 잡아주면 해결이 되네요. 많이 배웠습니다. 10억도 잘 돌아가네요~

그런데 10메가로 정렬이 가능하다니; 그거 엄청난거 아닌가요!!

저는 아직 알고리즘 배우는 중이라서 그런걸 생각도 못하겠네요;; 흑흑..
08/09/28 07:31
수정 아이콘
아.. 조건을 좀 잘못 말했네요.. 0~2^32 사이의 정수이면서 중복되지 않은 경우에 가능하죠.
그냥 bitmap을 이용해서 각각의 번호가 존재하는지 여부를 저장한 뒤에, 나중에 처음부터 존재하는 숫자들을 출력해 주면 되죠.
검색은 아마 sorting with limited memory 등으로 검색하시면 나올 거에요. google interview question같은데서 나오는 문제들 중에 하나죠.

DeathMage님//
일반적인 알고리즘이라기 보다는 특별한 조건하에 가능한 방법이라 알고리즘 과목에서 가르칠만한 내용은 아니죠.
굳이 말하자면 bucket sort의 응용이라고 볼 수는 있겠네요.
뱃살토스
08/09/28 21:14
수정 아이콘
global 영역의 stack..인감..
local에서는 자동 변수니까 stack을 사용하지만, heap에서는 사용자가 delete 해줘야 하니 stack은 아닌 것 같네요^^;
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
42753 pgr에 그림 그리시는 분에게 질문좀 드리겠습니다. [3] Jess:D1764 08/09/28 1764
42750 MOTD 볼수 있는곳? [1] 신예ⓣerran2101 08/09/28 2101
42749 사무자동화 산업기사 실기 채점 기준 질문입니다.~ [1] 사랑님3224 08/09/28 3224
42748 세계 10대 더비 [24] 허두7638 08/09/28 7638
42747 응씨배 준결승에서 이세돌 선수가 돌을 던진 이유 [7] happyend5203 08/09/28 5203
42745 축구 교체 방식 [14] TheGame1932 08/09/28 1932
42744 이 영화 제목 아시는분 [1] 배려1931 08/09/28 1931
42743 핸드폰을 잃어버렸는데요.. [3] 이삭토스트1870 08/09/28 1870
42742 만화책을 사려고 하는데요~ [2] 껀후이2303 08/09/28 2303
42741 C프로그래밍 배열 질문입니다. [13] DeathMage2093 08/09/28 2093
42740 컴퓨터 동영상재생이 안됩니다..(인터넷에서) 에프마린1622 08/09/28 1622
42739 컴퓨터 소음 줄이려면 어떻게 하는게 좋죠? [4] Helsinki1935 08/09/28 1935
42738 서울시립대 가는 길에 대해서 알려주세요.. [3] Lord4229 08/09/27 4229
42737 남자 옷 쇼핑몰 추천 부탁드립니다 [3] 녕수짱짱2993 08/09/27 2993
42735 전력 과부하(?)가 자주 일어나나요??? [1] 신난다니깐1661 08/09/27 1661
42733 API 캐릭터 이동할려고 하는데 화면이 계속 말썽이네요. 고수님들 부탁~~ [1] Haru3951 08/09/27 3951
42732 스타오류인데요..; 박수흠1623 08/09/27 1623
42731 viva la vida 뜻이 정확히 뭔가요?? [4] 냥냥냥15001 08/09/27 15001
42729 익스플로러 상에서 동영상 재생이 끔찍하게 느려집니다. [1] EZrock2137 08/09/27 2137
42728 데이터 통신 비트의 길이 구하는 문제 질문입니다. [2] 루시리스6316 08/09/27 6316
42727 나이키바지 인터넷에서 사보신분? [5] Juan1821 08/09/27 1821
42726 지금 mbc espn.. [10] top[of]zerg=홍Yello2121 08/09/27 2121
42725 컴퓨터 관련 질문입니다 ㅠ [1] 달빛요정굳히1652 08/09/27 1652
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로