2012-03-13 3 views
-2

나는 수백만 개의 64 비트 부호없는 정수가있는 바이너리 파일을 가지고 있습니다. 파일에서 중복 된 숫자를 제거하기 만하면됩니다. 내 생각은 각 요소에 해시 테이블을 만드는 것이 하나의 숫자가 될 것이고 파일의 위치 일 것입니다. 중복 된 숫자를 검색하여 위치를 기준으로 제거 할 수 있습니다.C 파일의 중복 된 숫자를 제거합니다.

어떻게 구현하면 더 좋을까요?

[편집] 중복 된 숫자를 제거하면 크기가 여전히 64 비트이기 때문에 중복 된 숫자가 0으로 다시 채워지는 것을 의미하지는 않습니다. 따라서 두 가지 옵션이 있다고 생각합니다. 또는 전체 파일을 다시 작성하거나 고유 번호가있는 새 파일을 만드는 것은 중복되지 않은 것을 의미합니다.

+1

질문이 명확하지 않습니다. 자세한 내용을보십시오. – Jurlie

+0

"파일에서 번호 제거"란 무엇을 의미합니까? 0으로 바꾸시겠습니까? 정말로 제거하고 싶다면 전체 파일을 다시 작성해야합니다. –

+0

분명히하는 한 가지. 당신이 그들을 제거한다면, 왜 당신은 그들의 위치를 ​​지키고 있습니까? 첫 번째 숫자의 위치만으로 충분하지 않을까요? – Fred

답변

0

파일을 읽지 않고 읽은 숫자를 평가하지 않는 이유는 무엇입니까? 처음에는 새 파일에 쓰고 그렇지 않으면이 번호를 건너 뜁니다. 이 목적을 위해 :

do 
    read a number 
    look for it in a table 
    if found then 
     skip 
    else 
     add to table 
     write to new file 
    endif 
while !eof 

각 번호보다 자세한 정보가 필요하지 않습니다. 위치 나 해시 정보가 필요하지 않습니다. malloc-realloc int64 "array"를 사용할 수 있습니다.이 배열은 0으로 초기화되며, 읽은 숫자가있는 각 위치에 액세스 할 수 있습니다.

+0

숫자가 64 비트 길고, 그 기억을 가지고 있어야합니다. 나는 그렇지 않다고 추측합니다. 그러나 그것은 좋은 생각입니다. 시작이라고 할 수 있습니다. – Fred

+0

크기가 18,446,744,073,709,551,615 인 배열을 생성 하시겠습니까? 그것은 2048 페타 바이트를 차지할 것입니다. – Joe

+0

좋은 솔루션 인 것처럼 보이고 해시 테이블보다 가볍습니다. –

1

먼저 파일을 정렬 한 다음 최종 출력에 쓸 때 중복을 제거하십시오.

편집 : 가장 좋은 방법은 External sorting입니다. 이미 작은 크기 (빠른 정렬 또는 병합 정렬 사용) 및 병합 알고리즘에 대한 정렬 알고리즘이 있다고 가정합니다.

파일이 RAM 메모리에 들어갈 수 있으면 필요하지 않습니다.

+0

파일을 정렬하는 가장 좋은 해결책은 무엇입니까? –

+0

편집 됨 ......... – UmNyobe

+0

예, 내 파일이 램 메모리에 맞았습니다. 외부 정렬이 필요 없습니다. –